I have many routes in my application. Each has an onEnter method that loads data from an API and fires an action (thunk) on the store.
const routeConfig = [
    {path: '/tutorial/:tutorialId', component: Tutorial, onEnter: tutorialEnter},
    {path: '/session/:sessionId', component: App, onEnter: sessionEnter},
    {path: '/session/:userId/:sessionId', component: App, onEnter: userSessionEnter},
    {path: '/template/:language/:sessionId', component: App, onEnter: templateEditEnter},
    {path: '/snippet/:language/:appType/:sessionId', component: App, onEnter: snippetEditEnter},
    {path: '/prepare/:sessionId', component: Library, onEnter: galleryPrepareEnter},
    {path: '/launch/:comboId', component: Launch, onEnter: launchEnter},
    ... more
];
const renderStore = () => {
    rootElement = document.getElementById('root')
    render(
        <MuiThemeProvider>
            <div className="root">
                <Provider store={store}>
                    <Router history={history} routes={routeConfig} onUpdate={onPageView}/>
                </Provider>
            </div>
        </MuiThemeProvider>,
        rootElement
    );
}
example for an OnEnter method:
const launchEnter = (location) => {
    let {comboId} = location.params;
    store.dispatch(appActions.getComboDetails(comboId))
    store.dispatch(appActions.getBuildRequestsForCombo(comboId))
}
I want to split the routes and OnEnter scripts into different files. I can create a method that returns an array with some of the routes but how do I get access to the store? Two ideas which I had seemed flawed:
Idea #1 - wrapping the store. LaunchRoutes.js:
export const getRoutes = (store) => {
    const launchEnter = (location) => {
        let {comboId} = location.params;
        store.dispatch(appActions.getComboDetails(comboId))
        store.dispatch(appActions.getBuildRequestsForCombo(comboId))
    }
    return [
        {path: '/launch/:comboId', component: Launch, onEnter: launchEnter},
    ];
}
This doesn't feel right to have the store locked in this closure.
Idea #2 - accessing the store via a global
const store = window.store;
const launchEnter = (location) => {
    let {comboId} = location.params;
    store.dispatch(appActions.getComboDetails(comboId))
    store.dispatch(appActions.getBuildRequestsForCombo(comboId))
}
export const getRoutes = (store) => {
    return [
        {path: '/launch/:comboId', component: Launch, onEnter: launchEnter},
    ];
}
This even seems a worst idea than the first one using the window as a cheap way out of it.
Any ideas how to properly split the routes?
                        
One possible solution would be to go the same route as
react-routerdoes withbrowserHistoryandhashHistory, which would be to create a store module and export your store instance from there.This may or may not work based on your code structure, but essentially you would have a
store.js:You could then import the
storethroughout your project wherever you need to interact with it.and