diff --git a/browser/main/HomePage/ArticleDetail/ArticleEditor.js b/browser/main/ArticleDetail/ArticleEditor.js similarity index 100% rename from browser/main/HomePage/ArticleDetail/ArticleEditor.js rename to browser/main/ArticleDetail/ArticleEditor.js diff --git a/browser/main/HomePage/ArticleDetail/ShareButton.js b/browser/main/ArticleDetail/ShareButton.js similarity index 100% rename from browser/main/HomePage/ArticleDetail/ShareButton.js rename to browser/main/ArticleDetail/ShareButton.js diff --git a/browser/main/HomePage/ArticleDetail/index.js b/browser/main/ArticleDetail/index.js similarity index 99% rename from browser/main/HomePage/ArticleDetail/index.js rename to browser/main/ArticleDetail/index.js index 73c45d98..cafc2875 100644 --- a/browser/main/HomePage/ArticleDetail/index.js +++ b/browser/main/ArticleDetail/index.js @@ -7,7 +7,7 @@ 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 DeleteArticleModal from '../modals/DeleteArticleModal' import ArticleEditor from './ArticleEditor' const electron = require('electron') const ipc = electron.ipcRenderer diff --git a/browser/main/HomePage/ArticleList.js b/browser/main/ArticleList.js similarity index 60% rename from browser/main/HomePage/ArticleList.js rename to browser/main/ArticleList.js index afc56570..bcc7d6c3 100644 --- a/browser/main/HomePage/ArticleList.js +++ b/browser/main/ArticleList.js @@ -3,7 +3,6 @@ import ReactDOM from 'react-dom' import ModeIcon from 'browser/components/ModeIcon' import moment from 'moment' import FolderMark from 'browser/components/FolderMark' -import TagLink from './TagLink' import _ from 'lodash' const electron = require('electron') @@ -129,55 +128,7 @@ export default class ArticleList extends React.Component { } render () { - let articles = [] - let folders = [] - let articleElements = articles.map((article) => { - let originalArticle = article - let tagElements = Array.isArray(article.tags) && article.tags.length > 0 - ? article.tags.slice().map((tag) => { - return () - }) - : (Not tagged yet) - let folder = _.findWhere(folders, {key: article.FolderKey}) - let folderChanged = originalArticle.FolderKey !== article.FolderKey - let originalFolder = folderChanged ? _.findWhere(folders, {key: originalArticle.FolderKey}) : null - - let title = article.title.trim().length === 0 - ? (Untitled) - : article.title - - return ( -
-
this.handleArticleClick(article)(e)} className={'ArticleList-item' + (article.key === 'ACTIVE_POST_KEY' ? ' active' : '')}> -
- {folder != null - ? folderChanged - ? - {originalFolder.name} - -> - {folder.name} - - : - {folder.name} - - : Unknown - } - {moment(article.updatedAt).fromNow()} -
-
-
-
-
-
-
-
-
{tagElements}
-
-
-
-
- ) - }) + let articleElements = [] return (
this.handleArticleListKeyDown(e)} className='ArticleList'> diff --git a/browser/main/HomePage/ArticleTopBar.js b/browser/main/ArticleTopBar.js similarity index 100% rename from browser/main/HomePage/ArticleTopBar.js rename to browser/main/ArticleTopBar.js diff --git a/browser/main/HomePage/TagLink.js b/browser/main/HomePage/TagLink.js deleted file mode 100644 index 2f2f4a1a..00000000 --- a/browser/main/HomePage/TagLink.js +++ /dev/null @@ -1,15 +0,0 @@ -import React, { PropTypes } from 'react' - -export default class TagLink extends React.Component { - handleClick (e) { - } - render () { - return ( - this.handleClick(e)}>{this.props.tag} - ) - } -} - -TagLink.propTypes = { - tag: PropTypes.string -} diff --git a/browser/main/HomePage/index.js b/browser/main/HomePage/index.js deleted file mode 100644 index 93e06316..00000000 --- a/browser/main/HomePage/index.js +++ /dev/null @@ -1,104 +0,0 @@ -import React, { PropTypes} from 'react' -import { connect } from 'react-redux' -import ReactDOM from 'react-dom' -import SideNav from './SideNav' -import ArticleTopBar from './ArticleTopBar' -import ArticleList from './ArticleList' -import ArticleDetail from './ArticleDetail' -import { isModalOpen, closeModal } from 'browser/lib/modal' -import Repository from 'browser/lib/Repository' - -const electron = require('electron') -const remote = electron.remote - -const OSX = global.process.platform === 'darwin' - -class HomePage extends React.Component { - componentDidMount () { - let { dispatch } = this.props - - // Bind directly to window - // this.keyHandler = (e) => this.handleKeyDown(e) - // window.addEventListener('keydown', this.keyHandler) - - // Reload all data - Repository.loadAll() - .then((allData) => { - dispatch({type: 'INIT_ALL', data: allData}) - }) - } - - componentWillUnmount () { - window.removeEventListener('keydown', this.keyHandler) - } - - handleKeyDown (e) { - // if (isModalOpen()) { - // if (e.keyCode === 13 && (OSX ? e.metaKey : e.ctrlKey)) { - // remote.getCurrentWebContents().send('modal-confirm') - // } - // if (e.keyCode === 27) closeModal() - // return - // } - - // let { dispatch } = this.props - // let { top, list } = this.refs - // let listElement = ReactDOM.findDOMNode(list) - - // if (status.isTutorialOpen) { - // // dispatch(toggleTutorial()) - // e.preventDefault() - // return - // } - - // if (e.keyCode === 13 && top.isInputFocused()) { - // listElement.focus() - // return - // } - // if (e.keyCode === 27 && top.isInputFocused()) { - // // if (status.search.length > 0) top.escape() - // // else listElement.focus() - // return - // } - - // // Search inputがfocusされていたら大体のキー入力は無視される。 - // if (e.keyCode === 27) { - // if (document.activeElement !== listElement) { - // listElement.focus() - // } else { - // top.focusInput() - // } - // return - // } - } - - render () { - return ( -
- - - - -
- ) - } -} - -HomePage.propTypes = { - dispatch: PropTypes.func, - repositories: PropTypes.array -} - -export default connect((x) => x)(HomePage) diff --git a/browser/main/Main.js b/browser/main/Main.js index 90841d0b..1a7abdaa 100644 --- a/browser/main/Main.js +++ b/browser/main/Main.js @@ -1,18 +1,30 @@ const electron = require('electron') +import { connect } from 'react-redux' const ipc = electron.ipcRenderer import React, { PropTypes } from 'react' -import HomePage from './HomePage' +import SideNav from './SideNav' +import ArticleTopBar from './ArticleTopBar' +import ArticleList from './ArticleList' +import ArticleDetail from './ArticleDetail' +import Repository from 'browser/lib/Repository' -export default class MainContainer extends React.Component { +class Main extends React.Component { constructor (props) { super(props) this.state = {updateAvailable: false} } componentDidMount () { + let { dispatch } = this.props ipc.on('update-available', function (message) { this.setState({updateAvailable: true}) }.bind(this)) + + // Reload all data + Repository.loadAll() + .then((allData) => { + dispatch({type: 'INIT_ALL', data: allData}) + }) } updateApp () { @@ -27,12 +39,31 @@ export default class MainContainer extends React.Component { {this.state.updateAvailable ? ( ) : null} - + + + + +
) } } -MainContainer.propTypes = { - children: PropTypes.element +Main.propTypes = { + dispatch: PropTypes.func, + repositories: PropTypes.array } + +export default connect((x) => x)(Main) diff --git a/browser/main/HomePage/SideNav/FolderItem.js b/browser/main/SideNav/FolderItem.js similarity index 100% rename from browser/main/HomePage/SideNav/FolderItem.js rename to browser/main/SideNav/FolderItem.js diff --git a/browser/main/HomePage/SideNav/FolderItem.styl b/browser/main/SideNav/FolderItem.styl similarity index 100% rename from browser/main/HomePage/SideNav/FolderItem.styl rename to browser/main/SideNav/FolderItem.styl diff --git a/browser/main/HomePage/SideNav/RepositorySection.js b/browser/main/SideNav/RepositorySection.js similarity index 100% rename from browser/main/HomePage/SideNav/RepositorySection.js rename to browser/main/SideNav/RepositorySection.js diff --git a/browser/main/HomePage/SideNav/RepositorySection.styl b/browser/main/SideNav/RepositorySection.styl similarity index 100% rename from browser/main/HomePage/SideNav/RepositorySection.styl rename to browser/main/SideNav/RepositorySection.styl diff --git a/browser/main/HomePage/SideNav/SideNav.styl b/browser/main/SideNav/SideNav.styl similarity index 100% rename from browser/main/HomePage/SideNav/SideNav.styl rename to browser/main/SideNav/SideNav.styl diff --git a/browser/main/HomePage/SideNav/index.js b/browser/main/SideNav/index.js similarity index 96% rename from browser/main/HomePage/SideNav/index.js rename to browser/main/SideNav/index.js index dc21d019..115a9ef4 100644 --- a/browser/main/HomePage/SideNav/index.js +++ b/browser/main/SideNav/index.js @@ -2,9 +2,9 @@ import React, { PropTypes } from 'react' import CSSModules from 'browser/lib/CSSModules' import styles from './SideNav.styl' import { openModal } from 'browser/lib/modal' -import Preferences from '../../modal/Preferences' +import Preferences from '../modals/Preferences' import RepositorySection from './RepositorySection' -import NewRepositoryModal from '../../modal/NewRepositoryModal' +import NewRepositoryModal from '../modals/NewRepositoryModal' const electron = require('electron') const { remote } = electron diff --git a/browser/main/modal/CreateNewFolder.js b/browser/main/modal/CreateNewFolder.js deleted file mode 100644 index 9ff61a4b..00000000 --- a/browser/main/modal/CreateNewFolder.js +++ /dev/null @@ -1,106 +0,0 @@ -import React, { PropTypes } from 'react' -import ReactDOM from 'react-dom' -import linkState from 'browser/lib/linkState' -import store from '../store' -import FolderMark from 'browser/components/FolderMark' - -export default class CreateNewFolder extends React.Component { - constructor (props) { - super(props) - - this.state = { - name: '', - color: Math.round(Math.random() * 7), - alert: null - } - } - - componentDidMount () { - ReactDOM.findDOMNode(this.refs.folderName).focus() - } - - handleCloseButton (e) { - this.props.close() - } - - handleConfirmButton (e) { - this.setState({alert: null}, () => { - let { close } = this.props - let { name, color } = this.state - - let input = { - name, - color - } - try { - // store.dispatch(createFolder(input)) - } catch (e) { - this.setState({alert: { - type: 'error', - message: e.message - }}) - return - } - close() - }) - } - - handleColorClick (colorIndex) { - return (e) => { - this.setState({ - color: colorIndex - }) - } - } - - handleKeyDown (e) { - if (e.keyCode === 13) { - this.handleConfirmButton() - } - } - - render () { - let alert = this.state.alert - let alertElement = alert != null ? ( -

- {alert.message} -

- ) : null - let colorIndexes = [] - for (let i = 0; i < 8; i++) { - colorIndexes.push(i) - } - let colorElements = colorIndexes.map((index) => { - let className = 'option' - if (index === this.state.color) className += ' active' - - return ( - this.handleColorClick(index)(e)}> - - - ) - }) - - return ( -
- - -
Create new folder
- - this.handleKeyDown(e)} className='ipt' type='text' valueLink={this.linkState('name')} placeholder='Enter folder name'/> -
- {colorElements} -
- {alertElement} - - -
- ) - } -} - -CreateNewFolder.propTypes = { - close: PropTypes.func -} - -CreateNewFolder.prototype.linkState = linkState diff --git a/browser/main/modal/Preference/FolderRow.js b/browser/main/modal/Preference/FolderRow.js deleted file mode 100644 index 6e9bb11e..00000000 --- a/browser/main/modal/Preference/FolderRow.js +++ /dev/null @@ -1,184 +0,0 @@ -import React, { PropTypes } from 'react' -import linkState from 'browser/lib/linkState' -import FolderMark from 'browser/components/FolderMark' -import store from '../../store' - -const IDLE = 'IDLE' -const EDIT = 'EDIT' -const DELETE = 'DELETE' - -export default class FolderRow extends React.Component { - constructor (props) { - super(props) - - this.state = { - mode: IDLE - } - } - - handleUpClick (e) { - let { index } = this.props - if (index > 0) { - // store.dispatch(replaceFolder(index, index - 1)) - } - } - - handleDownClick (e) { - let { index, count } = this.props - if (index < count - 1) { - // store.dispatch(replaceFolder(index, index + 1)) - } - } - - handleCancelButtonClick (e) { - this.setState({ - mode: IDLE - }) - } - - handleEditButtonClick (e) { - this.setState({ - mode: EDIT, - name: this.props.folder.name, - color: this.props.folder.color, - isColorEditing: false - }) - } - - handleDeleteButtonClick (e) { - this.setState({mode: DELETE}) - } - - handleNameInputKeyDown (e) { - if (e.keyCode === 13) { - this.handleSaveButtonClick() - } - } - - handleColorSelectClick (e) { - this.setState({ - isColorEditing: true - }) - } - - handleColorButtonClick (index) { - return (e) => { - this.setState({ - color: index, - isColorEditing: false - }) - } - } - - handleSaveButtonClick (e) { - let { folder, setAlert } = this.props - - setAlert(null, () => { - let input = { - name: this.state.name, - color: this.state.color - } - folder = Object.assign({}, folder, input) - - try { - // store.dispatch(updateFolder(folder)) - this.setState({ - mode: IDLE - }) - } catch (e) { - console.error(e) - setAlert({ - type: 'error', - message: e.message - }) - } - }) - } - - handleDeleteConfirmButtonClick (e) { - let { folder } = this.props - // store.dispatch(destroyFolder(folder.key)) - } - - render () { - let folder = this.props.folder - - switch (this.state.mode) { - case EDIT: - let colorIndexes = [] - for (let i = 0; i < 8; i++) { - colorIndexes.push(i) - } - - let colorOptions = colorIndexes.map((index) => { - let className = this.state.color === index - ? 'active' - : null - return ( - - ) - }) - - return ( -
-
- - {this.state.isColorEditing - ?
-
Color select
- {colorOptions} -
- : null - } -
-
- this.handleNameInputKeyDown(e)} valueLink={this.linkState('name')} type='text'/> -
-
- - -
-
- ) - case DELETE: - return ( -
-
Are you sure to delete {folder.name} folder?
-
- - -
-
- ) - case IDLE: - default: - return ( -
-
- - -
-
-
{folder.name}
-
- - -
-
- ) - } - } -} - -FolderRow.propTypes = { - folder: PropTypes.shape(), - index: PropTypes.number, - count: PropTypes.number, - setAlert: PropTypes.func -} - -FolderRow.prototype.linkState = linkState diff --git a/browser/main/modal/DeleteArticleModal.js b/browser/main/modals/DeleteArticleModal.js similarity index 100% rename from browser/main/modal/DeleteArticleModal.js rename to browser/main/modals/DeleteArticleModal.js diff --git a/browser/main/modal/NewRepositoryModal.js b/browser/main/modals/NewRepositoryModal.js similarity index 100% rename from browser/main/modal/NewRepositoryModal.js rename to browser/main/modals/NewRepositoryModal.js diff --git a/browser/main/modal/NewRepositoryModal.styl b/browser/main/modals/NewRepositoryModal.styl similarity index 100% rename from browser/main/modal/NewRepositoryModal.styl rename to browser/main/modals/NewRepositoryModal.styl diff --git a/browser/main/modal/Preference/AppSettingTab.js b/browser/main/modals/Preferences/AppSettingTab.js similarity index 100% rename from browser/main/modal/Preference/AppSettingTab.js rename to browser/main/modals/Preferences/AppSettingTab.js diff --git a/browser/main/modal/Preference/ContactTab.js b/browser/main/modals/Preferences/ContactTab.js similarity index 100% rename from browser/main/modal/Preference/ContactTab.js rename to browser/main/modals/Preferences/ContactTab.js diff --git a/browser/main/modal/Preferences.js b/browser/main/modals/Preferences/index.js similarity index 93% rename from browser/main/modal/Preferences.js rename to browser/main/modals/Preferences/index.js index 82ea0d13..a399afd2 100644 --- a/browser/main/modal/Preferences.js +++ b/browser/main/modals/Preferences/index.js @@ -1,9 +1,9 @@ import React, { PropTypes } from 'react' import { connect, Provider } from 'react-redux' import linkState from 'browser/lib/linkState' -import store from '../store' -import AppSettingTab from './Preference/AppSettingTab' -import ContactTab from './Preference/ContactTab' +import store from 'browser/main/store' +import AppSettingTab from './AppSettingTab' +import ContactTab from './ContactTab' import { closeModal } from 'browser/lib/modal' const APP = 'APP'