diff --git a/browser/main/HomePage.js b/browser/main/HomePage.js index 69c65948..ccbad0df 100644 --- a/browser/main/HomePage.js +++ b/browser/main/HomePage.js @@ -1,7 +1,6 @@ import React, { PropTypes} from 'react' import { connect } from 'react-redux' -import { EDIT_MODE, IDLE_MODE, NEW, toggleTutorial } from 'boost/actions' -// import UserNavigator from './HomePage/UserNavigator' +import { EDIT_MODE, IDLE_MODE, toggleTutorial } from 'boost/actions' import ArticleNavigator from './HomePage/ArticleNavigator' import ArticleTopBar from './HomePage/ArticleTopBar' import ArticleList from './HomePage/ArticleList' @@ -114,13 +113,14 @@ class HomePage extends React.Component { } render () { - let { dispatch, status, articles, allArticles, activeArticle, folders, tags, filters } = this.props + let { dispatch, status, user, articles, allArticles, activeArticle, folders, tags, filters } = this.props return (
{ @@ -234,6 +234,7 @@ function remap (state) { if (activeArticle == null) activeArticle = articles[0] return { + user, folders, status, allArticles, @@ -249,11 +250,9 @@ function remap (state) { } HomePage.propTypes = { - params: PropTypes.shape({ - userId: PropTypes.string - }), - status: PropTypes.shape({ - userId: PropTypes.string + status: PropTypes.shape(), + user: PropTypes.shape({ + name: PropTypes.string }), articles: PropTypes.array, allArticles: PropTypes.array, diff --git a/browser/main/HomePage/ArticleNavigator.js b/browser/main/HomePage/ArticleNavigator.js index 269d528f..a2f6755f 100644 --- a/browser/main/HomePage/ArticleNavigator.js +++ b/browser/main/HomePage/ArticleNavigator.js @@ -7,10 +7,6 @@ import Preferences from 'boost/components/modal/Preferences' import CreateNewFolder from 'boost/components/modal/CreateNewFolder' import keygen from 'boost/keygen' -const electron = require('electron') -const remote = electron.remote -let userName = remote.getGlobal('process').env.USER - const BRAND_COLOR = '#18AF90' const preferenceTutorialElement = ( @@ -109,7 +105,7 @@ export default class ArticleNavigator extends React.Component { } render () { - let { status, folders, allArticles } = this.props + let { status, user, folders, allArticles } = this.props let { targetFolders } = status if (targetFolders == null) targetFolders = [] @@ -127,7 +123,7 @@ export default class ArticleNavigator extends React.Component { return (
-
{userName}
+
{user.name}
localStorage
+ {alertElement} +
+
Hotkey
@@ -101,3 +124,6 @@ export default class AppSettingTab extends React.Component { } AppSettingTab.prototype.linkState = linkState +AppSettingTab.propTypes = { + dispatch: PropTypes.func +} diff --git a/lib/components/modal/Preferences.js b/lib/components/modal/Preferences.js index 51813751..a1b4f4a2 100644 --- a/lib/components/modal/Preferences.js +++ b/lib/components/modal/Preferences.js @@ -62,7 +62,7 @@ class Preferences extends React.Component { } renderContent () { - let { folders, dispatch } = this.props + let { user, folders, dispatch } = this.props switch (this.state.currentTab) { case HELP: @@ -80,12 +80,20 @@ class Preferences extends React.Component { ) case APP: default: - return () + return ( + + ) } } } Preferences.propTypes = { + user: PropTypes.shape({ + name: PropTypes.string + }), folders: PropTypes.array, dispatch: PropTypes.func } @@ -93,9 +101,10 @@ Preferences.propTypes = { Preferences.prototype.linkState = linkState function remap (state) { - let { folders, status } = state + let { user, folders, status } = state return { + user, folders, status } diff --git a/lib/dataStore.js b/lib/dataStore.js index 128c634d..e8b62af4 100644 --- a/lib/dataStore.js +++ b/lib/dataStore.js @@ -1,4 +1,6 @@ import keygen from 'boost/keygen' +import _ from 'lodash' + const electron = require('electron') const remote = electron.remote const jetpack = require('fs-jetpack') @@ -10,15 +12,66 @@ function getLocalPath () { return path.join(remote.app.getPath('userData'), 'local.json') } +function forgeInitialRepositories () { + return [{ + key: keygen(), + name: 'local', + type: 'userData', + user: { + name: remote.getGlobal('process').env.USER + } + }] +} + +function getRepositories () { + let raw = localStorage.getItem('repositories') + try { + let parsed = JSON.parse(raw) + if (!_.isArray(parsed)) { + throw new Error('repositories data is currupte. re-init data.') + } + return parsed + } catch (e) { + console.log(e) + let newRepos = forgeInitialRepositories() + saveRepositories(newRepos) + return newRepos + } +} + +function saveRepositories (repos) { + localStorage.setItem('repositories', JSON.stringify(repos)) +} + +export function getUser (repoName) { + if (repoName == null) { + return getRepositories()[0] + } + return null +} + +export function saveUser (repoName, user) { + let repos = getRepositories() + if (repoName == null) { + Object.assign(repos[0].user, user) + } + saveRepositories(repos) +} + export function init () { - console.log('initialize data store') + // set repositories info + getRepositories() + + // set local.json let data = jetpack.read(getLocalPath(), 'json') if (data == null) { + // for 0.4.1 -> 0.4.2 if (localStorage.getItem('local') != null) { data = JSON.parse(localStorage.getItem('local')) jetpack.write(getLocalPath(), data) localStorage.removeItem('local') + console.log('update 0.4.1 => 0.4.2') return } @@ -70,6 +123,8 @@ export default (function () { init() } return { + getUser, + saveUser, init, getData, setArticles, diff --git a/lib/keygen.js b/lib/keygen.js index 4cc04385..da8cf6b1 100644 --- a/lib/keygen.js +++ b/lib/keygen.js @@ -2,6 +2,6 @@ var crypto = require('crypto') module.exports = function () { var shasum = crypto.createHash('sha1') - shasum.update(((new Date()).getTime()).toString()) + shasum.update(((new Date()).getTime() + Math.round(Math.random()*1000)).toString()) return shasum.digest('hex') } diff --git a/lib/reducer.js b/lib/reducer.js index 4ca9d268..27971fb9 100644 --- a/lib/reducer.js +++ b/lib/reducer.js @@ -12,6 +12,9 @@ import { UNLOCK_STATUS, TOGGLE_TUTORIAL, + // user + USER_UPDATE, + // Article action type ARTICLE_UPDATE, ARTICLE_DESTROY, @@ -42,10 +45,22 @@ const initialStatus = { let data = dataStore.getData() let initialArticles = data.articles let initialFolders = data.folders +let initialUser = dataStore.getUser().user let isStatusLocked = false let isCreatingNew = false +function user (state = initialUser, action) { + switch (action.type) { + case USER_UPDATE: + let updated = Object.assign(state, action.data) + dataStore.saveUser(updated) + return updated + default: + return state + } +} + function folders (state = initialFolders, action) { state = state.slice() switch (action.type) { @@ -250,6 +265,7 @@ function status (state = initialStatus, action) { } export default combineReducers({ + user, folders, articles, status