import React, { PropTypes } from 'react' import ReactDOM from 'react-dom' import moment from 'moment' import _ from 'lodash' import { switchFolder, updateArticle, // cacheArticle, // saveArticle, // uncacheArticle } from '../../actions' import linkState from 'browser/lib/linkState' import TagSelect from 'browser/components/TagSelect' import ModeSelect from 'browser/components/ModeSelect' import ShareButton from './ShareButton' import { openModal, isModalOpen } from 'browser/lib/modal' import DeleteArticleModal from '../../modal/DeleteArticleModal' import ArticleEditor from './ArticleEditor' const electron = require('electron') const ipc = electron.ipcRenderer // const remote = electron.remote // const { Menu, MenuItem } = remote // const othersMenu = new Menu() // othersMenu.append(new MenuItem({ // label: 'Delete Post', // click: function () { // remote.getCurrentWebContents().send('detail-delete') // } // })) // othersMenu.append(new MenuItem({ // label: 'Discard Change', // click: function (item) { // remote.getCurrentWebContents().send('detail-uncache') // } // })) const BRAND_COLOR = '#18AF90' const OSX = global.process.platform === 'darwin' const tagSelectTutorialElement = ( Attach some tags here! ) const modeSelectTutorialElement = ( Select code syntax!! ) export default class ArticleDetail extends React.Component { constructor (props) { super(props) this.saveHandler = e => { if (isModalOpen()) return true this.handleSaveButtonClick() } this.deleteHandler = e => { if (isModalOpen()) return true this.handleDeleteButtonClick() } this.uncacheHandler = e => { if (isModalOpen()) return true this.handleUncache() } this.editHandler = e => { if (isModalOpen()) return true this.refs.editor.switchEditMode() } this.state = { article: Object.assign({content: ''}, props.activeArticle), openShareDropdown: false } } componentDidMount () { this.refreshTimer = setInterval(() => this.forceUpdate(), 60 * 1000) this.shareDropdownInterceptor = e => { e.stopPropagation() } // ipc.on('detail-save', this.saveHandler) ipc.on('detail-delete', this.deleteHandler) ipc.on('detail-uncache', this.uncacheHandler) ipc.on('detail-edit', this.editHandler) } componentWillUnmount () { clearInterval(this.refreshTimer) // ipc.removeListener('detail-save', this.saveHandler) ipc.removeListener('detail-delete', this.deleteHandler) ipc.removeListener('detail-uncache', this.uncacheHandler) ipc.removeListener('detail-edit', this.editHandler) } componentDidUpdate (prevProps, prevState) { if (this.props.activeArticle == null || prevProps.activeArticle == null || this.props.activeArticle.key !== prevProps.activeArticle.key) { if (this.refs.editor) this.refs.editor.resetCursorPosition() } } editArticle () { ReactDOM.findDOMNode(this.refs.title).focus() ReactDOM.findDOMNode(this.refs.title).select() } renderEmpty () { return (
{OSX ? 'Command(⌘)' : 'Ctrl(^)'} + N
to create a new post
) } handleOthersButtonClick (e) { this.deleteHandler() } handleFolderKeyChange (e) { let { dispatch, activeArticle, status, folders } = this.props let article = Object.assign({}, activeArticle, { FolderKey: e.target.value, updatedAt: new Date() }) dispatch(updateArticle(article)) let targetFolderKey = this.state.article.FolderKey if (status.targetFolders.length > 0) { let targetFolder = _.findWhere(folders, {key: targetFolderKey}) dispatch(switchFolder(targetFolder.name)) } } handleTitleChange (e) { let { dispatch, activeArticle } = this.props let article = Object.assign({}, activeArticle, { title: e.target.value, updatedAt: new Date() }) dispatch(updateArticle(article)) } handleTagsChange (newTag, tags) { let { dispatch, activeArticle } = this.props let article = Object.assign({}, activeArticle, { tags: tags, updatedAt: new Date() }) dispatch(updateArticle(article)) } handleModeChange (value) { let { dispatch, activeArticle } = this.props let article = Object.assign({}, activeArticle, { mode: value, updatedAt: new Date() }) dispatch(updateArticle(article)) } handleContentChange (value) { let { dispatch, activeArticle } = this.props if (activeArticle.content !== value) { let article = Object.assign({}, activeArticle, { content: value, updatedAt: new Date() }) dispatch(updateArticle(article)) } } handleDeleteButtonClick (e) { if (this.props.activeArticle) { openModal(DeleteArticleModal, {articleKey: this.props.activeArticle.key}) } } handleTitleKeyDown (e) { if (e.keyCode === 9 && !e.shiftKey) { e.preventDefault() this.refs.mode.handleIdleSelectClick() } } handleModeSelectKeyDown (e) { if (e.keyCode === 9 && !e.shiftKey) { e.preventDefault() this.refs.editor.switchEditMode() } if (e.keyCode === 9 && e.shiftKey) { e.preventDefault() ReactDOM.findDOMNode(this.refs.title).focus() } } render () { let { folders, status, tags, activeArticle, modified, user } = this.props if (activeArticle == null) return this.renderEmpty() let folderOptions = folders.map(folder => { return ( ) }) let isUnsaved = !!_.findWhere(modified, {key: activeArticle.key}) return (
Unsaved : `Created : ${moment(activeArticle.createdAt).format('YYYY/MM/DD')} Updated : ${moment(activeArticle.updatedAt).format('YYYY/MM/DD')}` } />
{/*
*/}
this.handleTagsChange(tags, tag)} suggestTags={tags} /> {status.isTutorialOpen ? tagSelectTutorialElement : null}
this.handleTitleKeyDown(e)} placeholder='(Untitled)' ref='title' value={activeArticle.title} onChange={e => this.handleTitleChange(e)} />
this.handleModeChange(e)} onKeyDown={e => this.handleModeSelectKeyDown(e)} value={activeArticle.mode} className='ArticleDetail-panel-header-mode' /> {status.isTutorialOpen ? modeSelectTutorialElement : null}
this.handleContentChange(content)} />
) } } ArticleDetail.propTypes = { dispatch: PropTypes.func, status: PropTypes.shape(), tags: PropTypes.array, user: PropTypes.shape(), folders: PropTypes.array, modified: PropTypes.array, activeArticle: PropTypes.shape() } ArticleDetail.prototype.linkState = linkState