import React, { PropTypes } from 'react' import moment from 'moment' import _ from 'lodash' import ModeIcon from 'boost/components/ModeIcon' import MarkdownPreview from 'boost/components/MarkdownPreview' import CodeEditor from 'boost/components/CodeEditor' import { IDLE_MODE, CREATE_MODE, EDIT_MODE, switchMode, switchArticle, switchFolder, clearSearch, updateArticle, destroyArticle } from 'boost/actions' import aceModes from 'boost/ace-modes' import Select from 'react-select' import linkState from 'boost/linkState' import FolderMark from 'boost/components/FolderMark' import TagLink from 'boost/components/TagLink' import TagSelect from 'boost/components/TagSelect' var modeOptions = aceModes.map(function (mode) { return { label: mode, value: mode } }) function makeInstantArticle (article) { return Object.assign({}, article) } export default class ArticleDetail extends React.Component { constructor (props) { super(props) this.state = { article: makeInstantArticle(props.activeArticle) } } componentWillReceiveProps (nextProps) { let nextState = {} let isArticleChanged = nextProps.activeArticle != null && (nextProps.activeArticle.key !== this.state.article.key) let isModeChanged = nextProps.status.mode !== this.props.status.mode if (isArticleChanged || (isModeChanged && nextProps.status.mode !== IDLE_MODE)) { Object.assign(nextState, { article: makeInstantArticle(nextProps.activeArticle) }) } if (isModeChanged) { Object.assign(nextState, { openDeleteConfirmMenu: false, previewMode: false }) } this.setState(nextState) } renderEmpty () { return (
Command(⌘) + Enter to create a new post
) } handleEditButtonClick (e) { let { dispatch } = this.props dispatch(switchMode(EDIT_MODE)) } handleDeleteButtonClick (e) { this.setState({openDeleteConfirmMenu: true}) } handleDeleteConfirmButtonClick (e) { let { dispatch, activeArticle } = this.props dispatch(destroyArticle(activeArticle.key)) this.setState({openDeleteConfirmMenu: false}) } handleDeleteCancleButtonClick (e) { this.setState({openDeleteConfirmMenu: false}) } renderIdle () { let { activeArticle, folders } = this.props let tags = activeArticle.tags != null ? activeArticle.tags.length > 0 ? activeArticle.tags.map(tag => { return () }) : ( Not tagged yet ) : null let folder = _.findWhere(folders, {key: activeArticle.FolderKey}) return (
{this.state.openDeleteConfirmMenu ? (
Are you sure to delete this article?
) : (
{folder.name}  Created : {moment(activeArticle.createdAt).format('YYYY/MM/DD')}  Updated : {moment(activeArticle.updatedAt).format('YYYY/MM/DD')}
{tags}
) }
{activeArticle.title}
{activeArticle.mode === 'markdown' ? : this.handleContentChange(e, value)} mode={activeArticle.mode} code={activeArticle.content}/> }
) } handleCancelButtonClick (e) { this.props.dispatch(switchMode(IDLE_MODE)) } handleSaveButtonClick (e) { let { dispatch, folders, filters } = this.props let article = this.state.article let newArticle = Object.assign({}, article) let folder = _.findWhere(folders, {key: article.FolderKey}) if (folder == null) return false delete newArticle.status newArticle.updatedAt = new Date() dispatch(updateArticle(newArticle)) dispatch(switchMode(IDLE_MODE)) // Folder filterがかかっている時に、 // Searchを初期化し、更新先のFolder filterをかける // かかれていない時に // Searchを初期化する if (filters.folder.length !== 0) dispatch(switchFolder(folder.name)) else dispatch(clearSearch()) dispatch(switchArticle(newArticle.key)) } handleFolderKeyChange (e) { let article = this.state.article article.FolderKey = e.target.value this.setState({article: article}) } handleTagsChange (newTag, tags) { let article = this.state.article article.tags = tags this.setState({article: article}) } handleModeChange (value) { let article = this.state.article article.mode = value this.setState({article: article}) } handleContentChange (e, value) { let article = this.state.article article.content = value this.setState({article: article}) } handleTogglePreviewButtonClick (e) { this.setState({previewMode: !this.state.previewMode}) } renderEdit () { let { folders } = this.props let folderOptions = folders.map(folder => { return ( ) }) return (
this.handleTagsChange(tags, tag)} />
{ this.state.article.mode === 'markdown' ? () : null }