@@ -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