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 { ownerNameUuidEnhancerReducer } from './owner-name-uuid-enhancer/owner-name-uuid-enhancer-reducer';
70 import { SubprocessMiddlewareService } from '~/store/subprocess-panel/subprocess-panel-middleware-service';
71 import { SUBPROCESS_PANEL_ID } from '~/store/subprocess-panel/subprocess-panel-actions';
72 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
73 import { Config } from '~/common/config';
75 const composeEnhancers =
76 (process.env.NODE_ENV === 'development' &&
77 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
78 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
81 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
83 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
85 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
86 const rootReducer = createRootReducer(services);
88 const projectPanelMiddleware = dataExplorerMiddleware(
89 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
91 const favoritePanelMiddleware = dataExplorerMiddleware(
92 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
94 const allProcessessPanelMiddleware = dataExplorerMiddleware(
95 new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
97 const trashPanelMiddleware = dataExplorerMiddleware(
98 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
100 const searchResultsPanelMiddleware = dataExplorerMiddleware(
101 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
103 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
104 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
106 const workflowPanelMiddleware = dataExplorerMiddleware(
107 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
109 const userPanelMiddleware = dataExplorerMiddleware(
110 new UserMiddlewareService(services, USERS_PANEL_ID)
112 const groupsPanelMiddleware = dataExplorerMiddleware(
113 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
115 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
116 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
118 const linkPanelMiddleware = dataExplorerMiddleware(
119 new LinkMiddlewareService(services, LINK_PANEL_ID)
121 const computeNodeMiddleware = dataExplorerMiddleware(
122 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
124 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
125 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
127 const publicFavoritesMiddleware = dataExplorerMiddleware(
128 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
130 const collectionsContentAddress = dataExplorerMiddleware(
131 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
133 const subprocessMiddleware = dataExplorerMiddleware(
134 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
136 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
137 const state = store.getState();
139 if (state.auth && state.auth.apiToken) {
140 handleRedirects(state.auth.apiToken, config);
146 const middlewares: Middleware[] = [
147 routerMiddleware(history),
148 thunkMiddleware.withExtraArgument(services),
149 authMiddleware(services),
150 projectPanelMiddleware,
151 favoritePanelMiddleware,
152 allProcessessPanelMiddleware,
153 trashPanelMiddleware,
154 searchResultsPanelMiddleware,
155 sharedWithMePanelMiddleware,
156 workflowPanelMiddleware,
158 groupsPanelMiddleware,
159 groupDetailsPanelMiddleware,
161 computeNodeMiddleware,
162 apiClientAuthorizationMiddlewareService,
163 publicFavoritesMiddleware,
164 collectionsContentAddress,
165 subprocessMiddleware,
168 const enhancer = composeEnhancers(applyMiddleware(redirectToMiddleware, ...middlewares));
169 return createStore(rootReducer, enhancer);
172 const createRootReducer = (services: ServiceRepository) => combineReducers({
173 auth: authReducer(services),
174 collectionPanel: collectionPanelReducer,
175 collectionPanelFiles: collectionPanelFilesReducer,
176 contextMenu: contextMenuReducer,
177 dataExplorer: dataExplorerReducer,
178 detailsPanel: detailsPanelReducer,
179 dialog: dialogReducer,
180 favorites: favoritesReducer,
181 ownerName: ownerNameReducer,
182 ownerNameUuidEnhancer: ownerNameUuidEnhancerReducer,
183 publicFavorites: publicFavoritesReducer,
185 processLogsPanel: processLogsPanelReducer,
186 properties: propertiesReducer,
187 resources: resourcesReducer,
188 router: routerReducer,
189 snackbar: snackbarReducer,
190 treePicker: treePickerReducer,
191 fileUploader: fileUploaderReducer,
192 processPanel: processPanelReducer,
193 progressIndicator: progressIndicatorReducer,
194 runProcessPanel: runProcessPanelReducer,
195 appInfo: appInfoReducer,
196 searchBar: searchBarReducer,
197 virtualMachines: virtualMachinesReducer,
198 repositories: repositoriesReducer,
199 keepServices: keepServicesReducer,
200 linkAccountPanel: linkAccountPanelReducer