Create generic dialog state
[arvados.git] / src / store / store.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { createStore, applyMiddleware, compose, Middleware, combineReducers } from 'redux';
6 import { routerMiddleware, routerReducer, RouterState } from "react-router-redux";
7 import thunkMiddleware from 'redux-thunk';
8 import { History } from "history";
9
10 import { projectsReducer, ProjectState } from "./project/project-reducer";
11 import { sidePanelReducer, SidePanelState } from './side-panel/side-panel-reducer';
12 import { authReducer, AuthState } from "./auth/auth-reducer";
13 import { dataExplorerReducer, DataExplorerState } from './data-explorer/data-explorer-reducer';
14 import { projectPanelMiddleware } from './project-panel/project-panel-middleware';
15 import { detailsPanelReducer, DetailsPanelState } from './details-panel/details-panel-reducer';
16 import { contextMenuReducer, ContextMenuState } from './context-menu/context-menu-reducer';
17 import { favoritePanelMiddleware } from "./favorite-panel/favorite-panel-middleware";
18 import { reducer as formReducer } from 'redux-form';
19 import { FavoritesState, favoritesReducer } from './favorites/favorites-reducer';
20 import { snackbarReducer, SnackbarState } from './snackbar/snackbar-reducer';
21 import { CollectionPanelFilesState } from './collection-panel/collection-panel-files/collection-panel-files-state';
22 import { collectionPanelFilesReducer } from './collection-panel/collection-panel-files/collections-panel-files-reducer';
23 import { CollectionCreatorState, collectionCreationReducer } from './collections/creator/collection-creator-reducer';
24 import { CollectionPanelState, collectionPanelReducer } from './collection-panel/collection-panel-reducer';
25 import { DialogState, dialogReducer } from './dialog/dialog-reducer';
26
27 const composeEnhancers =
28     (process.env.NODE_ENV === 'development' &&
29         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
30     compose;
31
32 export interface RootState {
33     auth: AuthState;
34     projects: ProjectState;
35     collectionCreation: CollectionCreatorState;
36     router: RouterState;
37     dataExplorer: DataExplorerState;
38     sidePanel: SidePanelState;
39     collectionPanel: CollectionPanelState;
40     detailsPanel: DetailsPanelState;
41     contextMenu: ContextMenuState;
42     favorites: FavoritesState;
43     snackbar: SnackbarState;
44     collectionPanelFiles: CollectionPanelFilesState;
45     dialog: DialogState;
46 }
47
48 const rootReducer = combineReducers({
49     auth: authReducer,
50     projects: projectsReducer,
51     collectionCreation: collectionCreationReducer,
52     router: routerReducer,
53     dataExplorer: dataExplorerReducer,
54     sidePanel: sidePanelReducer,
55     collectionPanel: collectionPanelReducer,
56     detailsPanel: detailsPanelReducer,
57     contextMenu: contextMenuReducer,
58     form: formReducer,
59     favorites: favoritesReducer,
60     snackbar: snackbarReducer,
61     collectionPanelFiles: collectionPanelFilesReducer,
62     dialog: dialogReducer
63 });
64
65
66 export function configureStore(history: History) {
67     const middlewares: Middleware[] = [
68         routerMiddleware(history),
69         thunkMiddleware,
70         projectPanelMiddleware,
71         favoritePanelMiddleware
72     ];
73     const enhancer = composeEnhancers(applyMiddleware(...middlewares));
74     return createStore(rootReducer, enhancer);
75 }