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";
10 import { authReducer } from "./auth/auth-reducer";
11 import { authMiddleware } from "./auth/auth-middleware";
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 { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
31 import { TrashPanelMiddlewareService } from "~/store/trash-panel/trash-panel-middleware-service";
32 import { TRASH_PANEL_ID } from "~/store/trash-panel/trash-panel-action";
33 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
34 import { processPanelReducer } from '~/store/process-panel/process-panel-reducer';
35 import { SHARED_WITH_ME_PANEL_ID } from '~/store/shared-with-me-panel/shared-with-me-panel-actions';
36 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
37 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
38 import { runProcessPanelReducer } from '~/store/run-process-panel/run-process-panel-reducer';
39 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
40 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
41 import { appInfoReducer } from '~/store/app-info/app-info-reducer';
42 import { searchBarReducer } from './search-bar/search-bar-reducer';
43 import { SEARCH_RESULTS_PANEL_ID } from '~/store/search-results-panel/search-results-panel-actions';
44 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
45 import { virtualMachinesReducer } from "~/store/virtual-machines/virtual-machines-reducer";
46 import { repositoriesReducer } from '~/store/repositories/repositories-reducer';
47 import { keepServicesReducer } from '~/store/keep-services/keep-services-reducer';
48 import { UserMiddlewareService } from '~/store/users/user-panel-middleware-service';
49 import { USERS_PANEL_ID } from '~/store/users/users-actions';
50 import { GroupsPanelMiddlewareService } from '~/store/groups-panel/groups-panel-middleware-service';
51 import { GROUPS_PANEL_ID } from '~/store/groups-panel/groups-panel-actions';
52 import { GroupDetailsPanelMiddlewareService } from '~/store/group-details-panel/group-details-panel-middleware-service';
53 import { GROUP_DETAILS_PANEL_ID } from '~/store/group-details-panel/group-details-panel-actions';
54 import { LINK_PANEL_ID } from '~/store/link-panel/link-panel-actions';
55 import { LinkMiddlewareService } from '~/store/link-panel/link-panel-middleware-service';
56 import { COMPUTE_NODE_PANEL_ID } from '~/store/compute-nodes/compute-nodes-actions';
57 import { ComputeNodeMiddlewareService } from '~/store/compute-nodes/compute-nodes-middleware-service';
58 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from '~/store/api-client-authorizations/api-client-authorizations-actions';
59 import { ApiClientAuthorizationMiddlewareService } from '~/store/api-client-authorizations/api-client-authorizations-middleware-service';
60 import { PublicFavoritesMiddlewareService } from '~/store/public-favorites-panel/public-favorites-middleware-service';
61 import { PUBLIC_FAVORITE_PANEL_ID } from '~/store/public-favorites-panel/public-favorites-action';
62 import { publicFavoritesReducer } from '~/store/public-favorites/public-favorites-reducer';
63 import { linkAccountPanelReducer } from './link-account-panel/link-account-panel-reducer';
64 import { CollectionsWithSameContentAddressMiddlewareService } from '~/store/collections-content-address-panel/collections-content-address-middleware-service';
65 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from '~/store/collections-content-address-panel/collections-content-address-panel-actions';
66 import { ownerNameReducer } from '~/store/owner-name/owner-name-reducer';
67 import { SubprocessMiddlewareService } from '~/store/subprocess-panel/subprocess-panel-middleware-service';
68 import { SUBPROCESS_PANEL_ID } from '~/store/subprocess-panel/subprocess-panel-actions';
70 const composeEnhancers =
71 (process.env.NODE_ENV === 'development' &&
72 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
73 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
76 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
78 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
80 export function configureStore(history: History, services: ServiceRepository): RootStore {
81 const rootReducer = createRootReducer(services);
83 const projectPanelMiddleware = dataExplorerMiddleware(
84 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
86 const favoritePanelMiddleware = dataExplorerMiddleware(
87 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
89 const trashPanelMiddleware = dataExplorerMiddleware(
90 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
92 const searchResultsPanelMiddleware = dataExplorerMiddleware(
93 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
95 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
96 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
98 const workflowPanelMiddleware = dataExplorerMiddleware(
99 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
101 const userPanelMiddleware = dataExplorerMiddleware(
102 new UserMiddlewareService(services, USERS_PANEL_ID)
104 const groupsPanelMiddleware = dataExplorerMiddleware(
105 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
107 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
108 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
110 const linkPanelMiddleware = dataExplorerMiddleware(
111 new LinkMiddlewareService(services, LINK_PANEL_ID)
113 const computeNodeMiddleware = dataExplorerMiddleware(
114 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
116 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
117 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
119 const publicFavoritesMiddleware = dataExplorerMiddleware(
120 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
122 const collectionsContentAddress = dataExplorerMiddleware(
123 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
125 const subprocessMiddleware = dataExplorerMiddleware(
126 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
129 const middlewares: Middleware[] = [
130 routerMiddleware(history),
131 thunkMiddleware.withExtraArgument(services),
132 authMiddleware(services),
133 projectPanelMiddleware,
134 favoritePanelMiddleware,
135 trashPanelMiddleware,
136 searchResultsPanelMiddleware,
137 sharedWithMePanelMiddleware,
138 workflowPanelMiddleware,
140 groupsPanelMiddleware,
141 groupDetailsPanelMiddleware,
143 computeNodeMiddleware,
144 apiClientAuthorizationMiddlewareService,
145 publicFavoritesMiddleware,
146 collectionsContentAddress,
149 const enhancer = composeEnhancers(applyMiddleware(...middlewares));
150 return createStore(rootReducer, enhancer);
153 const createRootReducer = (services: ServiceRepository) => combineReducers({
154 auth: authReducer(services),
155 collectionPanel: collectionPanelReducer,
156 collectionPanelFiles: collectionPanelFilesReducer,
157 contextMenu: contextMenuReducer,
158 dataExplorer: dataExplorerReducer,
159 detailsPanel: detailsPanelReducer,
160 dialog: dialogReducer,
161 favorites: favoritesReducer,
162 ownerName: ownerNameReducer,
163 publicFavorites: publicFavoritesReducer,
165 processLogsPanel: processLogsPanelReducer,
166 properties: propertiesReducer,
167 resources: resourcesReducer,
168 router: routerReducer,
169 snackbar: snackbarReducer,
170 treePicker: treePickerReducer,
171 fileUploader: fileUploaderReducer,
172 processPanel: processPanelReducer,
173 progressIndicator: progressIndicatorReducer,
174 runProcessPanel: runProcessPanelReducer,
175 appInfo: appInfoReducer,
176 searchBar: searchBarReducer,
177 virtualMachines: virtualMachinesReducer,
178 repositories: repositoriesReducer,
179 keepServices: keepServicesReducer,
180 linkAccountPanel: linkAccountPanelReducer