freeCodeCamp/common/app/create-app.jsx

87 lines
2.1 KiB
JavaScript
Raw Normal View History

2016-01-27 19:34:44 +00:00
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
2016-05-04 23:46:19 +00:00
import { createEpic } from 'redux-epic';
2016-01-27 19:34:44 +00:00
import createReducer from './create-reducer';
import sagas from './sagas';
// general utils
import servicesCreator from '../utils/services-creator';
const createRouteProps = Observable.fromNodeCallback(match);
const routes = { components: App, ...childRoutes };
//
// createApp(settings: {
2016-03-03 03:45:54 +00:00
// location?: Location|String,
2016-01-27 19:34:44 +00:00
// 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 = {},
2016-04-25 04:54:48 +00:00
sagas: sideSagas = [],
sagaOptions: sideSagaOptions = {}
2016-01-27 19:34:44 +00:00
}) {
const sagaOptions = {
2016-04-25 04:54:48 +00:00
...sideSagaOptions,
2016-01-27 19:34:44 +00:00
services: servicesCreator(null, serviceOptions)
};
2016-04-25 04:54:48 +00:00
const sagaMiddleware = createEpic(
sagaOptions,
...sagas,
...sideSagas
);
2016-01-27 19:34:44 +00:00
const enhancers = [
applyMiddleware(
...sideMiddlewares,
2016-04-25 04:54:48 +00:00
sagaMiddleware
2016-01-27 19:34:44 +00:00
),
// 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({
2016-03-03 03:45:54 +00:00
// redirect: LocationDescriptor,
2016-01-27 19:34:44 +00:00
// history: History,
// routes: Object
// }) => Observable
return createRouteProps({ routes, location, history })
2016-03-03 03:45:54 +00:00
.map(([ redirect, props ]) => ({
redirect,
2016-01-27 19:34:44 +00:00
props,
reducer,
2016-04-25 04:54:48 +00:00
store,
epic: sagaMiddleware
2016-01-27 19:34:44 +00:00
}));
}