import React, { PropTypes } from 'react' import { findWhere } from 'lodash' import { setSearchFilter, switchFolder, uncacheArticle, saveAllArticles, switchArticle, clearSearch } from '../actions' import { openModal, isModalOpen } from 'browser/lib/modal' import FolderMark from 'browser/components/FolderMark' import Preferences from '../modal/Preferences' import CreateNewFolder from '../modal/CreateNewFolder' import _ from 'lodash' import ModeIcon from 'browser/components/ModeIcon' const ipc = require('electron').ipcRenderer const BRAND_COLOR = '#18AF90' const OSX = global.process.platform === 'darwin' const preferenceTutorialElement = ( Preference ) const newPostTutorialElement = ( Create a new post!! ) const newFolderTutorialElement = ( Create a new folder!! ) export default class ArticleNavigator extends React.Component { constructor (props) { super(props) this.newFolderHandler = e => { if (isModalOpen()) return true this.handleNewFolderButton(e) } } componentDidMount () { ipc.on('nav-new-folder', this.newFolderHandler) } componentWillUnmount () { ipc.removeListener('nav-new-folder', this.newFolderHandler) } handlePreferencesButtonClick (e) { openModal(Preferences) } handleNewFolderButton (e) { let { user } = this.props openModal(CreateNewFolder, {user: user}) } handleFolderButtonClick (name) { return e => { let { dispatch } = this.props dispatch(switchFolder(name)) } } handleAllFoldersButtonClick (e) { let { dispatch } = this.props dispatch(setSearchFilter('')) } handleUnsavedItemClick (article) { let { dispatch } = this.props return e => { let { articles } = this.props let isInArticleList = articles.some(_article => _article.key === article.key) if (!isInArticleList) dispatch(clearSearch()) dispatch(switchArticle(article.key)) } } handleUncacheButtonClick (article) { let { dispatch } = this.props return e => { dispatch(uncacheArticle(article.key)) } } handleSaveAllClick (e) { let { dispatch } = this.props dispatch(saveAllArticles()) } render () { let { status, user, folders, allArticles, modified, activeArticle } = this.props let { targetFolders } = status if (targetFolders == null) targetFolders = [] let modifiedElements = modified.map(modifiedArticle => { let originalArticle = _.findWhere(allArticles, {key: modifiedArticle.key}) if (originalArticle == null) return false let combinedArticle = Object.assign({}, originalArticle, modifiedArticle) let className = 'ArticleNavigator-unsaved-list-item' if (activeArticle && activeArticle.key === combinedArticle.key) className += ' active' return (
this.handleUnsavedItemClick(combinedArticle)(e)} className={className}>
  {combinedArticle.title.trim().length > 0 ? combinedArticle.title : (Untitled)}
) }).filter(modifiedArticle => modifiedArticle).sort((a, b) => a.updatedAt - b.updatedAt) let hasModified = modifiedElements.length > 0 let folderElememts = folders.map((folder, index) => { let isActive = findWhere(targetFolders, {key: folder.key}) let articleCount = allArticles.filter(article => article.FolderKey === folder.key && article.status !== 'NEW').length return ( ) }) return (
{user.name}
localStorage
{status.isTutorialOpen ? preferenceTutorialElement : null}
{/*
Work in progress
{modifiedElements}
*/}
Folders
{status.isTutorialOpen ? newFolderTutorialElement : null}
{folderElememts}
) } } ArticleNavigator.propTypes = { dispatch: PropTypes.func, status: PropTypes.shape({ folderId: PropTypes.number }), user: PropTypes.object, folders: PropTypes.array, allArticles: PropTypes.array, articles: PropTypes.array, modified: PropTypes.array, activeArticle: PropTypes.shape({ key: PropTypes.string }) }