diff --git a/src/defaults.js b/src/defaults.js index a51149e..57b87e4 100644 --- a/src/defaults.js +++ b/src/defaults.js @@ -4,10 +4,6 @@ export const options = { // global initial state // initialState: undefined, - // Should be one of ['browser', 'hash', 'memory'] - // Learn more: https://github.com/ReactTraining/history/blob/master/README.md - historyMode: 'browser', - // A list of the standard Redux middleware middlewares: [], @@ -25,20 +21,13 @@ export const options = { } -const historyModes = ['browser', 'hash', 'memory'] - export default function defaults(opts = {}) { const { - historyMode, middlewares, addEffect } = opts - if (historyMode && !historyModes.includes(historyMode)) { - throw new Error(`historyMode "${historyMode}" is invalid, must be one of ${historyModes.join(', ')}!`) - } - if (middlewares && !Array.isArray(middlewares)) { throw new Error(`middlewares "${middlewares}" is invalid, must be an Array!`) } diff --git a/src/index.js b/src/index.js index 1fea0a3..acb0d1a 100644 --- a/src/index.js +++ b/src/index.js @@ -1,29 +1,15 @@ -import { Route, Redirect, Switch, Prompt, withRouter } from 'react-router' -import { Link, NavLink } from 'react-router-dom' -import { connect } from 'react-redux' import model from './model' import { actions } from './actions' -import render from './render' import hook from './hook' -import Router from './router' import defaults from './defaults' +import init from './init' export default { model, actions, hook, defaults, - connect, - render, - - Router, - Route, - Link, - NavLink, - Switch, - Redirect, - Prompt, - withRouter + init, } export { @@ -31,15 +17,5 @@ export { actions, hook, defaults, - connect, - render, - - Router, - Route, - Link, - NavLink, - Switch, - Redirect, - Prompt, - withRouter + init, } diff --git a/src/init.js b/src/init.js new file mode 100644 index 0000000..7df0665 --- /dev/null +++ b/src/init.js @@ -0,0 +1,23 @@ +import { options } from './defaults' +import { models } from './model' +import { store, createStore, replaceReducer } from './store' + +let started = false +let Root + +export default function init() { + + const { initialState, middlewares, reducers } = options + + if (started) { + + // If app has rendered, do `store.replaceReducer` to update store. + replaceReducer(store, models, reducers) + + + } else { + createStore(models, reducers, initialState, middlewares) + } + + return store +} diff --git a/src/render.js b/src/render.js deleted file mode 100644 index 1403493..0000000 --- a/src/render.js +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom' -import { Provider } from 'react-redux' - -import { options } from './defaults' -import { models } from './model' -import { store, createStore, replaceReducer } from './store' - -let started = false -let Root - -export default function render(component, container, callback) { - - const { initialState, middlewares, reducers } = options - - if (started) { - - // If app has rendered, do `store.replaceReducer` to update store. - replaceReducer(store, models, reducers) - - // Call `render` without arguments means *re-render*. Since store has updated, - // `component` will automatically be updated, so no need to `ReactDOM.render` again. - if (arguments.length === 0) { - return Root - } - - } else { - createStore(models, reducers, initialState, middlewares) - } - - // Use named function get a proper displayName - Root = function Root() { - return ( - - {component} - - ) - } - - started = true - - global.document && ReactDOM.render(, container, callback) - - return Root -} diff --git a/src/router.js b/src/router.js deleted file mode 100644 index eadd813..0000000 --- a/src/router.js +++ /dev/null @@ -1,59 +0,0 @@ -import React from 'react' -import PropTypes from 'prop-types' -import createBrowserHistory from 'history/createBrowserHistory' -import createHashHistory from 'history/createHashHistory' -import createMemoryHistory from 'history/createMemoryHistory' -import { ConnectedRouter, routerActions } from 'react-router-redux' - -import { options } from './defaults' -import { dispatch } from './middleware' -import { actions } from './actions' - -export let history = null - -export default function Router({ history: _history, children, ...others }) { - - // Add `push`, `replace`, `go`, `goForward` and `goBack` methods to actions.routing, - // when called, will dispatch the crresponding action provided by react-router-redux. - actions.routing = Object.keys(routerActions).reduce((memo, action) => { - memo[action] = (...args) => { - dispatch(routerActions[action](...args)) - } - return memo - }, {}) - - // Support for `basename` etc props for Router, - // see https://github.com/ReactTraining/react-router/blob/master/packages/react-router-dom/docs/api/BrowserRouter.md - if (!_history) { - _history = createHistory(others) - } - - history = _history - - // ConnectedRouter will use the store from Provider automatically - return ( - - {children} - - ) -} - -Router.propTypes = { - children: PropTypes.element.isRequired, - history: PropTypes.object -} - -function createHistory(props) { - - const { historyMode } = options - - const historyModes = { - browser: createBrowserHistory, - hash: createHashHistory, - memory: createMemoryHistory, - } - - history = historyModes[historyMode](props) - - return history -} diff --git a/src/routerMiddleware.js b/src/routerMiddleware.js deleted file mode 100644 index 4ba4e68..0000000 --- a/src/routerMiddleware.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * @credit react-router-redux - * @see https://github.com/ReactTraining/react-router/blob/master/packages/react-router-redux/modules/middleware.js - * - * This is the routerMiddleware from react-router-redux, but to use - * the global `history` object instead of the passed one. - */ - -import { CALL_HISTORY_METHOD } from 'react-router-redux' -import { history } from './router' - -export default function routerMiddleware() { - return () => next => action => { - if (action.type !== CALL_HISTORY_METHOD) { - return next(action) - } - - const { payload: { method, args } } = action - history[method](...args) - } -} diff --git a/src/store.js b/src/store.js index 576b389..0349acc 100644 --- a/src/store.js +++ b/src/store.js @@ -4,17 +4,14 @@ import { combineReducers, compose } from 'redux' -import { routerReducer } from 'react-router-redux' import createMiddleware from './middleware' -import routerMiddleware from './routerMiddleware' export let store export function createStore(models, reducers, initialState, middlewares = []) { const middleware = applyMiddleware( - routerMiddleware(), ...middlewares, createMiddleware() ) @@ -25,12 +22,12 @@ export function createStore(models, reducers, initialState, middlewares = []) { // Following line to exclude from coverage report: /* istanbul ignore next */ - if (process.env.NODE_ENV !== 'production') { - // Redux devtools extension support. - if (global.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) { - composeEnhancers = global.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ - } - } + // if (process.env.NODE_ENV !== 'production') { + // // Redux devtools extension support. + // if (global.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) { + // composeEnhancers = global.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ + // } + // } const reducer = createReducer(models, reducers) const enhancer = composeEnhancers(...enhancers) @@ -55,7 +52,6 @@ function createReducer(models, reducers) { return combineReducers({ ...reducers, ...modelReducers, - routing: routerReducer }) }