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';
73 const composeEnhancers =
74 (process.env.NODE_ENV === 'development' &&
75 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
76 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
79 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
81 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
83 export function configureStore(history: History, services: ServiceRepository): RootStore {
84 const rootReducer = createRootReducer(services);
86 const projectPanelMiddleware = dataExplorerMiddleware(
87 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
89 const favoritePanelMiddleware = dataExplorerMiddleware(
90 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
92 const allProcessessPanelMiddleware = dataExplorerMiddleware(
93 new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
95 const trashPanelMiddleware = dataExplorerMiddleware(
96 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
98 const searchResultsPanelMiddleware = dataExplorerMiddleware(
99 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
101 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
102 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
104 const workflowPanelMiddleware = dataExplorerMiddleware(
105 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
107 const userPanelMiddleware = dataExplorerMiddleware(
108 new UserMiddlewareService(services, USERS_PANEL_ID)
110 const groupsPanelMiddleware = dataExplorerMiddleware(
111 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
113 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
114 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
116 const linkPanelMiddleware = dataExplorerMiddleware(
117 new LinkMiddlewareService(services, LINK_PANEL_ID)
119 const computeNodeMiddleware = dataExplorerMiddleware(
120 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
122 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
123 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
125 const publicFavoritesMiddleware = dataExplorerMiddleware(
126 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
128 const collectionsContentAddress = dataExplorerMiddleware(
129 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
131 const subprocessMiddleware = dataExplorerMiddleware(
132 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
134 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
135 const state = store.getState();
137 if (state.auth && state.auth.apiToken) {
138 const { apiToken } = state.auth;
139 handleRedirects(apiToken);
145 const middlewares: Middleware[] = [
146 routerMiddleware(history),
147 thunkMiddleware.withExtraArgument(services),
148 authMiddleware(services),
149 projectPanelMiddleware,
150 favoritePanelMiddleware,
151 allProcessessPanelMiddleware,
152 trashPanelMiddleware,
153 searchResultsPanelMiddleware,
154 sharedWithMePanelMiddleware,
155 workflowPanelMiddleware,
157 groupsPanelMiddleware,
158 groupDetailsPanelMiddleware,
160 computeNodeMiddleware,
161 apiClientAuthorizationMiddlewareService,
162 publicFavoritesMiddleware,
163 collectionsContentAddress,
164 subprocessMiddleware,
166 const enhancer = composeEnhancers(applyMiddleware(redirectToMiddleware, ...middlewares));
167 return createStore(rootReducer, enhancer);
170 const createRootReducer = (services: ServiceRepository) => combineReducers({
171 auth: authReducer(services),
172 collectionPanel: collectionPanelReducer,
173 collectionPanelFiles: collectionPanelFilesReducer,
174 contextMenu: contextMenuReducer,
175 dataExplorer: dataExplorerReducer,
176 detailsPanel: detailsPanelReducer,
177 dialog: dialogReducer,
178 favorites: favoritesReducer,
179 ownerName: ownerNameReducer,
180 publicFavorites: publicFavoritesReducer,
182 processLogsPanel: processLogsPanelReducer,
183 properties: propertiesReducer,
184 resources: resourcesReducer,
185 router: routerReducer,
186 snackbar: snackbarReducer,
187 treePicker: treePickerReducer,
188 fileUploader: fileUploaderReducer,
189 processPanel: processPanelReducer,
190 progressIndicator: progressIndicatorReducer,
191 runProcessPanel: runProcessPanelReducer,
192 appInfo: appInfoReducer,
193 searchBar: searchBarReducer,
194 virtualMachines: virtualMachinesReducer,
195 repositories: repositoriesReducer,
196 keepServices: keepServicesReducer,
197 linkAccountPanel: linkAccountPanelReducer