1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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 import { handleRedirects } from '../common/redirect-to';
11 import { authReducer } from "./auth/auth-reducer";
12 import { authMiddleware } from "./auth/auth-middleware";
13 import { dataExplorerReducer } from './data-explorer/data-explorer-reducer';
14 import { detailsPanelReducer } from './details-panel/details-panel-reducer';
15 import { contextMenuReducer } from './context-menu/context-menu-reducer';
16 import { reducer as formReducer } from 'redux-form';
17 import { favoritesReducer } from './favorites/favorites-reducer';
18 import { snackbarReducer } from './snackbar/snackbar-reducer';
19 import { collectionPanelFilesReducer } from './collection-panel/collection-panel-files/collection-panel-files-reducer';
20 import { dataExplorerMiddleware } from "./data-explorer/data-explorer-middleware";
21 import { FAVORITE_PANEL_ID } from "./favorite-panel/favorite-panel-action";
22 import { PROJECT_PANEL_ID } from "./project-panel/project-panel-action";
23 import { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
24 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
25 import { AllProcessesPanelMiddlewareService } from "./all-processes-panel/all-processes-panel-middleware-service";
26 import { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
27 import { dialogReducer } from './dialog/dialog-reducer';
28 import { ServiceRepository } from "services/services";
29 import { treePickerReducer } from './tree-picker/tree-picker-reducer';
30 import { resourcesReducer } from 'store/resources/resources-reducer';
31 import { propertiesReducer } from './properties/properties-reducer';
32 import { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
33 import { TrashPanelMiddlewareService } from "store/trash-panel/trash-panel-middleware-service";
34 import { TRASH_PANEL_ID } from "store/trash-panel/trash-panel-action";
35 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
36 import { processPanelReducer } from 'store/process-panel/process-panel-reducer';
37 import { SHARED_WITH_ME_PANEL_ID } from 'store/shared-with-me-panel/shared-with-me-panel-actions';
38 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
39 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
40 import { runProcessPanelReducer } from 'store/run-process-panel/run-process-panel-reducer';
41 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
42 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
43 import { appInfoReducer } from 'store/app-info/app-info-reducer';
44 import { searchBarReducer } from './search-bar/search-bar-reducer';
45 import { SEARCH_RESULTS_PANEL_ID } from 'store/search-results-panel/search-results-panel-actions';
46 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
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 { linkAccountPanelReducer } from './link-account-panel/link-account-panel-reducer';
66 import { CollectionsWithSameContentAddressMiddlewareService } from 'store/collections-content-address-panel/collections-content-address-middleware-service';
67 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from 'store/collections-content-address-panel/collections-content-address-panel-actions';
68 import { ownerNameReducer } from 'store/owner-name/owner-name-reducer';
69 import { SubprocessMiddlewareService } from 'store/subprocess-panel/subprocess-panel-middleware-service';
70 import { SUBPROCESS_PANEL_ID } from 'store/subprocess-panel/subprocess-panel-actions';
71 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
72 import { Config } from 'common/config';
73 import { pluginConfig } from 'plugins';
74 import { MiddlewareListReducer } from 'common/plugintypes';
78 __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
82 const composeEnhancers =
83 (process.env.NODE_ENV === 'development' &&
84 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
87 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
89 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
91 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
92 const rootReducer = createRootReducer(services);
94 const projectPanelMiddleware = dataExplorerMiddleware(
95 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
97 const favoritePanelMiddleware = dataExplorerMiddleware(
98 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
100 const allProcessessPanelMiddleware = dataExplorerMiddleware(
101 new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
103 const trashPanelMiddleware = dataExplorerMiddleware(
104 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
106 const searchResultsPanelMiddleware = dataExplorerMiddleware(
107 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
109 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
110 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
112 const workflowPanelMiddleware = dataExplorerMiddleware(
113 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
115 const userPanelMiddleware = dataExplorerMiddleware(
116 new UserMiddlewareService(services, USERS_PANEL_ID)
118 const groupsPanelMiddleware = dataExplorerMiddleware(
119 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
121 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
122 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
124 const linkPanelMiddleware = dataExplorerMiddleware(
125 new LinkMiddlewareService(services, LINK_PANEL_ID)
127 const computeNodeMiddleware = dataExplorerMiddleware(
128 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
130 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
131 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
133 const publicFavoritesMiddleware = dataExplorerMiddleware(
134 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
136 const collectionsContentAddress = dataExplorerMiddleware(
137 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
139 const subprocessMiddleware = dataExplorerMiddleware(
140 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
142 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
143 const state = store.getState();
145 if (state.auth && state.auth.apiToken) {
146 handleRedirects(state.auth.apiToken, config);
152 let middlewares: Middleware[] = [
153 routerMiddleware(history),
154 thunkMiddleware.withExtraArgument(services),
155 authMiddleware(services),
156 projectPanelMiddleware,
157 favoritePanelMiddleware,
158 allProcessessPanelMiddleware,
159 trashPanelMiddleware,
160 searchResultsPanelMiddleware,
161 sharedWithMePanelMiddleware,
162 workflowPanelMiddleware,
164 groupsPanelMiddleware,
165 groupDetailsPanelMiddleware,
167 computeNodeMiddleware,
168 apiClientAuthorizationMiddlewareService,
169 publicFavoritesMiddleware,
170 collectionsContentAddress,
171 subprocessMiddleware,
174 const reduceMiddlewaresFn: (a: Middleware[],
175 b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
177 middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
179 const enhancer = composeEnhancers(applyMiddleware(redirectToMiddleware, ...middlewares));
180 return createStore(rootReducer, enhancer);
183 const createRootReducer = (services: ServiceRepository) => combineReducers({
184 auth: authReducer(services),
185 collectionPanel: collectionPanelReducer,
186 collectionPanelFiles: collectionPanelFilesReducer,
187 contextMenu: contextMenuReducer,
188 dataExplorer: dataExplorerReducer,
189 detailsPanel: detailsPanelReducer,
190 dialog: dialogReducer,
191 favorites: favoritesReducer,
192 ownerName: ownerNameReducer,
193 publicFavorites: publicFavoritesReducer,
195 processLogsPanel: processLogsPanelReducer,
196 properties: propertiesReducer,
197 resources: resourcesReducer,
198 router: routerReducer,
199 snackbar: snackbarReducer,
200 treePicker: treePickerReducer,
201 fileUploader: fileUploaderReducer,
202 processPanel: processPanelReducer,
203 progressIndicator: progressIndicatorReducer,
204 runProcessPanel: runProcessPanelReducer,
205 appInfo: appInfoReducer,
206 searchBar: searchBarReducer,
207 virtualMachines: virtualMachinesReducer,
208 repositories: repositoriesReducer,
209 keepServices: keepServicesReducer,
210 linkAccountPanel: linkAccountPanelReducer