UNPKG

1.47 kBJavaScriptView Raw
1import { Thunker, PromiseWell, Logger } from '@r/middleware';
2import React from 'react';
3import ReactDOM from 'react-dom';
4import { createStore, applyMiddleware, combineReducers, compose } from 'redux';
5import { Provider } from 'react-redux';
6import navigationMiddleware from './navigationMiddleware';
7import platform from './reducer';
8
9export 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};