aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShin'ya Ueoka <ueokande@i-beam.org>2017-09-14 21:14:13 +0900
committerShin'ya Ueoka <ueokande@i-beam.org>2017-09-14 21:14:13 +0900
commitc42ac8fac48f9d56b54af4818917082fda9af21e (patch)
tree5782600aa25482c2170101a29561cf08d1c2ae11
parent9dc02b2fd8344facedfd7949899124c4d0722f68 (diff)
improve store and reducers
-rw-r--r--src/background/index.js8
-rw-r--r--src/reducers/index.js7
-rw-r--r--src/store/index.js21
3 files changed, 29 insertions, 7 deletions
diff --git a/src/background/index.js b/src/background/index.js
index 0c3adce..e9757b9 100644
--- a/src/background/index.js
+++ b/src/background/index.js
@@ -2,12 +2,12 @@ import * as keys from './keys';
import * as inputActions from '../actions/input';
import * as operationActions from '../actions/operation';
import backgroundReducers from '../reducers/background';
+import reducers from '../reducers';
import commandReducer from '../reducers/command';
import inputReducers from '../reducers/input';
import * as store from '../store'
-const emptyReducer = (state) => state;
-const emptyStore = store.createStore(emptyReducer, (e) => {
+const backgroundStore = store.createStore(reducers, (e) => {
console.error('Vim-Vixen:', e);
});
let inputState = inputReducers(undefined, {});
@@ -27,9 +27,7 @@ const keyQueueChanged = (sender, prevState, state) => {
return Promise.resolve();
}
let action = keys.defaultKeymap[matched];
- emptyStore.dispatch(operationActions.exec(action, sender), (e) => {
- console.error('Vim-Vixen:', e);
- });
+ backgroundStore.dispatch(operationActions.exec(action, sender));
return handleMessage(inputActions.clearKeys(), sender).then(() => {
return backgroundReducers(undefined, action, sender).then(() => {
return browser.tabs.sendMessage(sender.tab.id, action);
diff --git a/src/reducers/index.js b/src/reducers/index.js
new file mode 100644
index 0000000..d49af7d
--- /dev/null
+++ b/src/reducers/index.js
@@ -0,0 +1,7 @@
+const defaultState = {
+};
+
+export default function reducer(state = defaultState/*, action = {}*/) {
+ return Object.assign({}, state, {
+ });
+}
diff --git a/src/store/index.js b/src/store/index.js
index bcb65d6..841fd17 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -3,21 +3,38 @@ class Store {
this.reducer = reducer;
this.catcher = catcher;
this.state = this.reducer(undefined, {});
+ this.subscribers = [];
}
dispatch(action) {
if (action instanceof Promise) {
action.then((a) => {
- this.state = this.reducer(this.state, a);
+ this.transitNext(a);
}).catch(this.catcher)
} else {
try {
- this.state = this.reducer(this.state, action);
+ this.transitNext(action);
} catch (e) {
this.catcher(e);
}
}
}
+
+ getState() {
+ return this.state;
+ }
+
+ subscribe(callback) {
+ this.subscribers.push(callback);
+ }
+
+ transitNext(action) {
+ let newState = this.reducer(this.state, action);
+ if (JSON.stringify(this.state) !== JSON.stringify(newState)) {
+ this.state = newState;
+ this.subscribers.forEach(f => f.call())
+ }
+ }
}
const empty = () => {};