Search code examples
javascriptreactjsreact-routerreact-reduxreact-router-redux

react-router-redux cannot push new URL


I am attempting to redirect inside a redux action when an error occurs. I've tried setting up react-router-redux but I'm getting the following error.

Uncaught TypeError: Cannot read property 'push' of undefined
    at middleware.js:29
    at index.js:14
    at index.js:100
    at dispatch (applyMiddleware.js:45)
    at reports-actions.js:88
    at index.js:11
    at Object.dispatch (index.js:100)
    at ReportTemplate.componentWillMount (ReportTemplate.js:54)
    at ReactCompositeComponent.js:348
    at measureLifeCyclePerf (ReactCompositeComponent.js:75)

This is how the router and redux is being setup.

const reducers = combineReducers({
    customer: transactionTrackerCustomerReducer,
    hierarchy: transactionTrackerHierarchyReducer,
    item: transactionTrackerItemReducer,
    tender: transactionTrackerTenderReducer,
    transaction: transactionTrackerTransactionReducer,
    transactionTracker: transactionTrackerReducer,
    session: userSessionReducer,
    reports: reportsReducer
});
const middleware = applyMiddleware(createLogger(), thunk, routerMiddleware(hashHistory));
const store = createStore(reducers, compose(middleware));
ReactDOM.render(
    <Provider store={store}>
        <Router history={hashHistory}>
            <MuiThemeProvider muiTheme={getBrandTheme()}>
                <Switch>
                    <Route path="/login" component={Login}/>
                    <Route path="/" render={props => (<App/>)}/>
                </Switch>
            </MuiThemeProvider>
        </Router>
    </Provider>
    , document.getElementById('root')
);

I'm trying to use it like this

export function fetchStoreHierarchy() {

    return function (dispatch) {

        // other code ....
        dispatch(push('/login'));
     }
}

Solution

  • From react-router-redux version 4, you have to import routerActions, as follows:

    import { routerActions } from 'react-router-redux'
    

    And call it's push function, as:

    return function (dispatch) {
        // other code ....
        dispatch(routerActions.push('/login'));
    }