80 lines
2.0 KiB
JavaScript
80 lines
2.0 KiB
JavaScript
import { Observable } from 'rx';
|
|
import { match } from 'react-router';
|
|
import { compose, createStore, applyMiddleware } from 'redux';
|
|
|
|
// main app
|
|
import App from './App.jsx';
|
|
// app routes
|
|
import childRoutes from './routes';
|
|
|
|
// redux
|
|
import createReducer from './create-reducer';
|
|
import middlewares from './middlewares';
|
|
import sagas from './sagas';
|
|
|
|
// general utils
|
|
import servicesCreator from '../utils/services-creator';
|
|
|
|
const createRouteProps = Observable.fromNodeCallback(match);
|
|
|
|
const routes = { components: App, ...childRoutes };
|
|
|
|
//
|
|
// createApp(settings: {
|
|
// location?: Location|String,
|
|
// history?: History,
|
|
// initialState?: Object|Void,
|
|
// serviceOptions?: Object,
|
|
// middlewares?: Function[],
|
|
// sideReducers?: Object
|
|
// enhancers?: Function[],
|
|
// sagas?: Function[],
|
|
// }) => Observable
|
|
//
|
|
// Either location or history must be defined
|
|
export default function createApp({
|
|
location,
|
|
history,
|
|
initialState,
|
|
serviceOptions = {},
|
|
middlewares: sideMiddlewares = [],
|
|
enhancers: sideEnhancers = [],
|
|
reducers: sideReducers = {},
|
|
sagas: sideSagas = []
|
|
}) {
|
|
const sagaOptions = {
|
|
services: servicesCreator(null, serviceOptions)
|
|
};
|
|
|
|
const enhancers = [
|
|
applyMiddleware(
|
|
...middlewares,
|
|
...sideMiddlewares,
|
|
...[ ...sagas, ...sideSagas].map(saga => saga(sagaOptions)),
|
|
),
|
|
// enhancers must come after middlewares
|
|
// on client side these are things like Redux DevTools
|
|
...sideEnhancers
|
|
];
|
|
const reducer = createReducer(sideReducers);
|
|
|
|
// create composed store enhancer
|
|
// use store enhancer function to enhance `createStore` function
|
|
// call enhanced createStore function with reducer and initialState
|
|
// to create store
|
|
const store = compose(...enhancers)(createStore)(reducer, initialState);
|
|
|
|
// createRouteProps({
|
|
// redirect: LocationDescriptor,
|
|
// history: History,
|
|
// routes: Object
|
|
// }) => Observable
|
|
return createRouteProps({ routes, location, history })
|
|
.map(([ redirect, props ]) => ({
|
|
redirect,
|
|
props,
|
|
reducer,
|
|
store
|
|
}));
|
|
}
|