1 | import { Thunker, PromiseWell, Logger } from '@r/middleware';
|
2 | import React from 'react';
|
3 | import ReactDOM from 'react-dom';
|
4 | import { createStore, applyMiddleware, combineReducers, compose } from 'redux';
|
5 | import { Provider } from 'react-redux';
|
6 | import navigationMiddleware from './navigationMiddleware';
|
7 | import platform from './reducer';
|
8 |
|
9 | export default config => {
|
10 | const {
|
11 | container='container',
|
12 | dataVar='___r',
|
13 | modifyData=data => data,
|
14 | appComponent=<div/>,
|
15 | reducers={},
|
16 | reduxMiddleware=[],
|
17 | routes=[],
|
18 | debug=false,
|
19 | onHandlerComplete=() => {},
|
20 | } = config;
|
21 |
|
22 | const well = PromiseWell.create();
|
23 | const thunk = Thunker.create();
|
24 | const nav = navigationMiddleware.create(routes, false, onHandlerComplete);
|
25 |
|
26 | const reds = combineReducers({ ...reducers, platform });
|
27 | const wares = reduxMiddleware.concat([nav, thunk, well.middleware]);
|
28 |
|
29 | if (debug && !window.devToolsExtension) {
|
30 | wares.push(Logger);
|
31 | }
|
32 |
|
33 | return () => {
|
34 | const $container = document.getElementById(container);
|
35 |
|
36 | let data;
|
37 | try {
|
38 | const temp = window[dataVar];
|
39 | data = modifyData(temp);
|
40 | } catch (e) {
|
41 | data = {};
|
42 | }
|
43 |
|
44 | const store = createStore(reds, data, compose(
|
45 | applyMiddleware(...wares),
|
46 | window.devToolsExtension ? window.devToolsExtension() : f => f
|
47 | ));
|
48 |
|
49 | ReactDOM.render(
|
50 | <Provider store={ store }>
|
51 | { appComponent }
|
52 | </Provider>
|
53 | ,$container
|
54 | );
|
55 |
|
56 | return store;
|
57 | };
|
58 | };
|