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 { AllProcessesPanelMiddlewareService } from "./all-processes-panel/all-processes-panel-middleware-service";
25 import { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
26 import { dialogReducer } from './dialog/dialog-reducer';
27 import { ServiceRepository } from "~/services/services";
28 import { treePickerReducer } from './tree-picker/tree-picker-reducer';
29 import { resourcesReducer } from '~/store/resources/resources-reducer';
30 import { propertiesReducer } from './properties/properties-reducer';
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 { virtualMachinesReducer } from "~/store/virtual-machines/virtual-machines-reducer";
47 import { repositoriesReducer } from '~/store/repositories/repositories-reducer';
48 import { keepServicesReducer } from '~/store/keep-services/keep-services-reducer';
49 import { UserMiddlewareService } from '~/store/users/user-panel-middleware-service';
50 import { USERS_PANEL_ID } from '~/store/users/users-actions';
51 import { GroupsPanelMiddlewareService } from '~/store/groups-panel/groups-panel-middleware-service';
52 import { GROUPS_PANEL_ID } from '~/store/groups-panel/groups-panel-actions';
53 import { GroupDetailsPanelMiddlewareService } from '~/store/group-details-panel/group-details-panel-middleware-service';
54 import { GROUP_DETAILS_PANEL_ID } from '~/store/group-details-panel/group-details-panel-actions';
55 import { LINK_PANEL_ID } from '~/store/link-panel/link-panel-actions';
56 import { LinkMiddlewareService } from '~/store/link-panel/link-panel-middleware-service';
57 import { COMPUTE_NODE_PANEL_ID } from '~/store/compute-nodes/compute-nodes-actions';
58 import { ComputeNodeMiddlewareService } from '~/store/compute-nodes/compute-nodes-middleware-service';
59 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from '~/store/api-client-authorizations/api-client-authorizations-actions';
60 import { ApiClientAuthorizationMiddlewareService } from '~/store/api-client-authorizations/api-client-authorizations-middleware-service';
61 import { PublicFavoritesMiddlewareService } from '~/store/public-favorites-panel/public-favorites-middleware-service';
62 import { PUBLIC_FAVORITE_PANEL_ID } from '~/store/public-favorites-panel/public-favorites-action';
63 import { publicFavoritesReducer } from '~/store/public-favorites/public-favorites-reducer';
64 import { linkAccountPanelReducer } from './link-account-panel/link-account-panel-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 import { ownerNameReducer } from '~/store/owner-name/owner-name-reducer';
68 import { SubprocessMiddlewareService } from '~/store/subprocess-panel/subprocess-panel-middleware-service';
69 import { SUBPROCESS_PANEL_ID } from '~/store/subprocess-panel/subprocess-panel-actions';
70 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
72 const composeEnhancers =
73 (process.env.NODE_ENV === 'development' &&
74 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
75 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
78 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
80 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
82 export function configureStore(history: History, services: ServiceRepository): RootStore {
83 const rootReducer = createRootReducer(services);
85 const projectPanelMiddleware = dataExplorerMiddleware(
86 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
88 const favoritePanelMiddleware = dataExplorerMiddleware(
89 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
91 const allProcessessPanelMiddleware = dataExplorerMiddleware(
92 new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
94 const trashPanelMiddleware = dataExplorerMiddleware(
95 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
97 const searchResultsPanelMiddleware = dataExplorerMiddleware(
98 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
100 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
101 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
103 const workflowPanelMiddleware = dataExplorerMiddleware(
104 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
106 const userPanelMiddleware = dataExplorerMiddleware(
107 new UserMiddlewareService(services, USERS_PANEL_ID)
109 const groupsPanelMiddleware = dataExplorerMiddleware(
110 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
112 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
113 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
115 const linkPanelMiddleware = dataExplorerMiddleware(
116 new LinkMiddlewareService(services, LINK_PANEL_ID)
118 const computeNodeMiddleware = dataExplorerMiddleware(
119 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
121 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
122 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
124 const publicFavoritesMiddleware = dataExplorerMiddleware(
125 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
127 const collectionsContentAddress = dataExplorerMiddleware(
128 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
130 const subprocessMiddleware = dataExplorerMiddleware(
131 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
134 const middlewares: Middleware[] = [
135 routerMiddleware(history),
136 thunkMiddleware.withExtraArgument(services),
137 authMiddleware(services),
138 projectPanelMiddleware,
139 favoritePanelMiddleware,
140 allProcessessPanelMiddleware,
141 trashPanelMiddleware,
142 searchResultsPanelMiddleware,
143 sharedWithMePanelMiddleware,
144 workflowPanelMiddleware,
146 groupsPanelMiddleware,
147 groupDetailsPanelMiddleware,
149 computeNodeMiddleware,
150 apiClientAuthorizationMiddlewareService,
151 publicFavoritesMiddleware,
152 collectionsContentAddress,
155 const enhancer = composeEnhancers(applyMiddleware(...middlewares));
156 return createStore(rootReducer, enhancer);
159 const createRootReducer = (services: ServiceRepository) => combineReducers({
160 auth: authReducer(services),
161 collectionPanel: collectionPanelReducer,
162 collectionPanelFiles: collectionPanelFilesReducer,
163 contextMenu: contextMenuReducer,
164 dataExplorer: dataExplorerReducer,
165 detailsPanel: detailsPanelReducer,
166 dialog: dialogReducer,
167 favorites: favoritesReducer,
168 ownerName: ownerNameReducer,
169 publicFavorites: publicFavoritesReducer,
171 processLogsPanel: processLogsPanelReducer,
172 properties: propertiesReducer,
173 resources: resourcesReducer,
174 router: routerReducer,
175 snackbar: snackbarReducer,
176 treePicker: treePickerReducer,
177 fileUploader: fileUploaderReducer,
178 processPanel: processPanelReducer,
179 progressIndicator: progressIndicatorReducer,
180 runProcessPanel: runProcessPanelReducer,
181 appInfo: appInfoReducer,
182 searchBar: searchBarReducer,
183 virtualMachines: virtualMachinesReducer,
184 repositories: repositoriesReducer,
185 keepServices: keepServicesReducer,
186 linkAccountPanel: linkAccountPanelReducer