routing+init-data-explorer
[arvados-workbench2.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, Store, Action, Dispatch } from 'redux';
6 import { routerMiddleware, routerReducer } from "react-router-redux";
7 import thunkMiddleware from 'redux-thunk';
8 import { History } from "history";
9
10 import { authReducer } from "./auth/auth-reducer";
11 import { configReducer } from "./config/config-reducer";
12 import { dataExplorerReducer } from './data-explorer/data-explorer-reducer';
13 import { detailsPanelReducer } from './details-panel/details-panel-reducer';
14 import { contextMenuReducer } from './context-menu/context-menu-reducer';
15 import { reducer as formReducer } from 'redux-form';
16 import { favoritesReducer } from './favorites/favorites-reducer';
17 import { snackbarReducer } from './snackbar/snackbar-reducer';
18 import { collectionPanelFilesReducer } from './collection-panel/collection-panel-files/collection-panel-files-reducer';
19 import { dataExplorerMiddleware } from "./data-explorer/data-explorer-middleware";
20 import { FAVORITE_PANEL_ID } from "./favorite-panel/favorite-panel-action";
21 import { PROJECT_PANEL_ID } from "./project-panel/project-panel-action";
22 import { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
23 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
24 import { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
25 import { dialogReducer } from './dialog/dialog-reducer';
26 import { ServiceRepository } from "~/services/services";
27 import { treePickerReducer } from './tree-picker/tree-picker-reducer';
28 import { resourcesReducer } from '~/store/resources/resources-reducer';
29 import { propertiesReducer } from './properties/properties-reducer';
30 import { RootState } from './store';
31 import { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
32 import { TrashPanelMiddlewareService } from "~/store/trash-panel/trash-panel-middleware-service";
33 import { TRASH_PANEL_ID } from "~/store/trash-panel/trash-panel-action";
34 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
35 import { processPanelReducer } from '~/store/process-panel/process-panel-reducer';
36 import { SHARED_WITH_ME_PANEL_ID } from '~/store/shared-with-me-panel/shared-with-me-panel-actions';
37 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
38 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
39 import { runProcessPanelReducer } from '~/store/run-process-panel/run-process-panel-reducer';
40 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
41 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
42 import { appInfoReducer } from '~/store/app-info/app-info-reducer';
43 import { searchBarReducer } from './search-bar/search-bar-reducer';
44 import { SEARCH_RESULTS_PANEL_ID } from '~/store/search-results-panel/search-results-panel-actions';
45 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
46 import { resourcesDataReducer } from "~/store/resources-data/resources-data-reducer";
47 import { virtualMachinesReducer } from "~/store/virtual-machines/virtual-machines-reducer";
48 import { repositoriesReducer } from '~/store/repositories/repositories-reducer';
49 import { keepServicesReducer } from '~/store/keep-services/keep-services-reducer';
50 import { UserMiddlewareService } from '~/store/users/user-panel-middleware-service';
51 import { USERS_PANEL_ID } from '~/store/users/users-actions';
52 import { GroupsPanelMiddlewareService } from '~/store/groups-panel/groups-panel-middleware-service';
53 import { GROUPS_PANEL_ID } from '~/store/groups-panel/groups-panel-actions';
54 import { GroupDetailsPanelMiddlewareService } from '~/store/group-details-panel/group-details-panel-middleware-service';
55 import { GROUP_DETAILS_PANEL_ID } from '~/store/group-details-panel/group-details-panel-actions';
56 import { LINK_PANEL_ID } from '~/store/link-panel/link-panel-actions';
57 import { LinkMiddlewareService } from '~/store/link-panel/link-panel-middleware-service';
58 import { COMPUTE_NODE_PANEL_ID } from '~/store/compute-nodes/compute-nodes-actions';
59 import { ComputeNodeMiddlewareService } from '~/store/compute-nodes/compute-nodes-middleware-service';
60 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from '~/store/api-client-authorizations/api-client-authorizations-actions';
61 import { ApiClientAuthorizationMiddlewareService } from '~/store/api-client-authorizations/api-client-authorizations-middleware-service';
62 import { PublicFavoritesMiddlewareService } from '~/store/public-favorites-panel/public-favorites-middleware-service';
63 import { PUBLIC_FAVORITE_PANEL_ID } from '~/store/public-favorites-panel/public-favorites-action';
64 import { publicFavoritesReducer } from '~/store/public-favorites/public-favorites-reducer';
65 import { CollectionsWithSameContentAddressMiddlewareService } from '~/store/collections-content-address-panel/collections-content-address-middleware-service';
66 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from '~/store/collections-content-address-panel/collections-content-address-panel-actions';
67
68 const composeEnhancers =
69     (process.env.NODE_ENV === 'development' &&
70         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
71         window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
72     compose;
73
74 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
75
76 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
77
78 export function configureStore(history: History, services: ServiceRepository): RootStore {
79     const rootReducer = createRootReducer(services);
80
81     const projectPanelMiddleware = dataExplorerMiddleware(
82         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
83     );
84     const favoritePanelMiddleware = dataExplorerMiddleware(
85         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
86     );
87     const trashPanelMiddleware = dataExplorerMiddleware(
88         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
89     );
90     const searchResultsPanelMiddleware = dataExplorerMiddleware(
91         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
92     );
93     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
94         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
95     );
96     const workflowPanelMiddleware = dataExplorerMiddleware(
97         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
98     );
99     const userPanelMiddleware = dataExplorerMiddleware(
100         new UserMiddlewareService(services, USERS_PANEL_ID)
101     );
102     const groupsPanelMiddleware = dataExplorerMiddleware(
103         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
104     );
105     const groupDetailsPanelMiddleware = dataExplorerMiddleware(
106         new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
107     );
108     const linkPanelMiddleware = dataExplorerMiddleware(
109         new LinkMiddlewareService(services, LINK_PANEL_ID)
110     );
111     const computeNodeMiddleware = dataExplorerMiddleware(
112         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
113     );
114     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
115         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
116     );
117     const publicFavoritesMiddleware = dataExplorerMiddleware(
118         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
119     );
120     const collectionsContentAddress = dataExplorerMiddleware(
121         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
122     );
123
124     const middlewares: Middleware[] = [
125         routerMiddleware(history),
126         thunkMiddleware.withExtraArgument(services),
127         projectPanelMiddleware,
128         favoritePanelMiddleware,
129         trashPanelMiddleware,
130         searchResultsPanelMiddleware,
131         sharedWithMePanelMiddleware,
132         workflowPanelMiddleware,
133         userPanelMiddleware,
134         groupsPanelMiddleware,
135         groupDetailsPanelMiddleware,
136         linkPanelMiddleware,
137         computeNodeMiddleware,
138         apiClientAuthorizationMiddlewareService,
139         publicFavoritesMiddleware,
140         collectionsContentAddress
141     ];
142     const enhancer = composeEnhancers(applyMiddleware(...middlewares));
143     return createStore(rootReducer, enhancer);
144 }
145
146 const createRootReducer = (services: ServiceRepository) => combineReducers({
147     auth: authReducer(services),
148     config: configReducer,
149     collectionPanel: collectionPanelReducer,
150     collectionPanelFiles: collectionPanelFilesReducer,
151     contextMenu: contextMenuReducer,
152     dataExplorer: dataExplorerReducer,
153     detailsPanel: detailsPanelReducer,
154     dialog: dialogReducer,
155     favorites: favoritesReducer,
156     publicFavorites: publicFavoritesReducer,
157     form: formReducer,
158     processLogsPanel: processLogsPanelReducer,
159     properties: propertiesReducer,
160     resources: resourcesReducer,
161     resourcesData: resourcesDataReducer,
162     router: routerReducer,
163     snackbar: snackbarReducer,
164     treePicker: treePickerReducer,
165     fileUploader: fileUploaderReducer,
166     processPanel: processPanelReducer,
167     progressIndicator: progressIndicatorReducer,
168     runProcessPanel: runProcessPanelReducer,
169     appInfo: appInfoReducer,
170     searchBar: searchBarReducer,
171     virtualMachines: virtualMachinesReducer,
172     repositories: repositoriesReducer,
173     keepServices: keepServicesReducer
174 });