-
Notifications
You must be signed in to change notification settings - Fork 0
/
core.js
42 lines (34 loc) · 1.17 KB
/
core.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
function injectHoot(useStoreon) {
return function createModel(slug, initialState, actions) {
const normalizeActionName = (name) => `${slug}::${name}`;
let boundActions = {};
const modelStore = (store) => {
boundActions = Object.keys(actions).reduce(
(result, actionName) => ({
...result,
[actionName]: (payload) => store.dispatch(normalizeActionName(actionName), payload),
}),
{},
);
store.on('@init', () => ({ [slug]: initialState }));
Object.entries(actions).forEach(([actionName, action]) => {
store.on(
normalizeActionName(actionName),
({ [slug]: subState }, payload) => {
const newSubState = action(subState, boundActions, payload);
console.log(`${normalizeActionName(actionName)}(${payload}): ${newSubState}`);
if (newSubState !== undefined) {
return { [slug]: newSubState };
}
},
);
});
};
const useModel = () => {
const { [slug]: model } = useStoreon(slug);
return [model, boundActions];
};
return [modelStore, useModel];
};
}
module.exports = injectHoot;