/
createStore.js
88 lines (80 loc) · 2.36 KB
/
createStore.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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import autoMergeLevel1 from 'redux-persist/lib/stateReconciler/autoMergeLevel1';
import reduxThunk from 'redux-thunk';
import { composeWithDevTools } from 'redux-devtools-extension';
import { connectRouter, routerMiddleware } from 'connected-react-router';
import { createMemoryHistory, createBrowserHistory } from 'history';
import { createStore, applyMiddleware } from 'redux';
import { persistReducer, getStoredState } from 'redux-persist';
import { runtime } from 'js-info';
import reducers from '~/reducers';
import { config } from '.';
const history = (runtime.browser
? createBrowserHistory
: createMemoryHistory)();
const composeEnhancers = composeWithDevTools({});
function getReducer(persistConfig) {
return persistReducer(persistConfig, connectRouter(history)(reducers));
}
function getMiddleware() {
return composeEnhancers(
applyMiddleware(routerMiddleware(history), reduxThunk)
);
}
function getStorage(context) {
if (context.cookieJar) {
const { CookieStorage } = require('redux-persist-cookie-storage');
return new CookieStorage(context.cookieJar, {});
}
return require('redux-persist/lib/storage').default;
}
async function getInitialState({ cookieJar }, persistConfig) {
const { initialState } = config;
if (cookieJar) {
try {
const state = await getStoredState(persistConfig);
if (state) return state;
} catch (err) {
return initialState;
}
}
return initialState;
}
function getPersistConfig(context) {
const { whitelist, blacklist } = config;
const persistConfig = {
key: 'root',
storage: getStorage(context),
stateReconciler: autoMergeLevel1
};
if (whitelist && whitelist.length) {
persistConfig.whitelist = whitelist;
} else if (blacklist && blacklist.length) {
persistConfig.blacklist = blacklist;
}
return persistConfig;
}
export async function createWebStore(context) {
const persistConfig = getPersistConfig(context);
return {
...context,
store: createStore(
getReducer(persistConfig),
await getInitialState(context, persistConfig),
getMiddleware()
),
history
};
}
export default function create(context) {
const { initialState } = config;
const persistConfig = getPersistConfig(context);
return {
...context,
store: createStore(
getReducer(persistConfig),
initialState,
getMiddleware()
),
history
};
}