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 { configReducer } from "./config/config-reducer";
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 { 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 { resourcesDataReducer } from "~/store/resources-data/resources-data-reducer";
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';
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)
126 const middlewares: Middleware[] = [
127 routerMiddleware(history),
128 thunkMiddleware.withExtraArgument(services),
129 authMiddleware(services),
130 projectPanelMiddleware,
131 favoritePanelMiddleware,
132 trashPanelMiddleware,
133 searchResultsPanelMiddleware,
134 sharedWithMePanelMiddleware,
135 workflowPanelMiddleware,
137 groupsPanelMiddleware,
138 groupDetailsPanelMiddleware,
140 computeNodeMiddleware,
141 apiClientAuthorizationMiddlewareService,
142 publicFavoritesMiddleware,
143 collectionsContentAddress
145 const enhancer = composeEnhancers(applyMiddleware(...middlewares));
146 return createStore(rootReducer, enhancer);
149 const createRootReducer = (services: ServiceRepository) => combineReducers({
150 auth: authReducer(services),
151 config: configReducer,
152 collectionPanel: collectionPanelReducer,
153 collectionPanelFiles: collectionPanelFilesReducer,
154 contextMenu: contextMenuReducer,
155 dataExplorer: dataExplorerReducer,
156 detailsPanel: detailsPanelReducer,
157 dialog: dialogReducer,
158 favorites: favoritesReducer,
159 ownerName: ownerNameReducer,
160 publicFavorites: publicFavoritesReducer,
162 processLogsPanel: processLogsPanelReducer,
163 properties: propertiesReducer,
164 resources: resourcesReducer,
165 resourcesData: resourcesDataReducer,
166 router: routerReducer,
167 snackbar: snackbarReducer,
168 treePicker: treePickerReducer,
169 fileUploader: fileUploaderReducer,
170 processPanel: processPanelReducer,
171 progressIndicator: progressIndicatorReducer,
172 runProcessPanel: runProcessPanelReducer,
173 appInfo: appInfoReducer,
174 searchBar: searchBarReducer,
175 virtualMachines: virtualMachinesReducer,
176 repositories: repositoriesReducer,
177 keepServices: keepServicesReducer,
178 linkAccountPanel: linkAccountPanelReducer