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 { configReducer } from "./config/config-reducer";
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 { RootState } from './store';
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 { 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';
68 const composeEnhancers =
69 (process.env.NODE_ENV === 'development' &&
70 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
71 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
74 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
76 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
78 export function configureStore(history: History, services: ServiceRepository): RootStore {
79 const rootReducer = createRootReducer(services);
81 const projectPanelMiddleware = dataExplorerMiddleware(
82 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
84 const favoritePanelMiddleware = dataExplorerMiddleware(
85 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
87 const trashPanelMiddleware = dataExplorerMiddleware(
88 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
90 const searchResultsPanelMiddleware = dataExplorerMiddleware(
91 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
93 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
94 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
96 const workflowPanelMiddleware = dataExplorerMiddleware(
97 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
99 const userPanelMiddleware = dataExplorerMiddleware(
100 new UserMiddlewareService(services, USERS_PANEL_ID)
102 const groupsPanelMiddleware = dataExplorerMiddleware(
103 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
105 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
106 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
108 const linkPanelMiddleware = dataExplorerMiddleware(
109 new LinkMiddlewareService(services, LINK_PANEL_ID)
111 const computeNodeMiddleware = dataExplorerMiddleware(
112 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
114 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
115 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
117 const publicFavoritesMiddleware = dataExplorerMiddleware(
118 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
120 const collectionsContentAddress = dataExplorerMiddleware(
121 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
124 const middlewares: Middleware[] = [
125 routerMiddleware(history),
126 thunkMiddleware.withExtraArgument(services),
127 projectPanelMiddleware,
128 favoritePanelMiddleware,
129 trashPanelMiddleware,
130 searchResultsPanelMiddleware,
131 sharedWithMePanelMiddleware,
132 workflowPanelMiddleware,
134 groupsPanelMiddleware,
135 groupDetailsPanelMiddleware,
137 computeNodeMiddleware,
138 apiClientAuthorizationMiddlewareService,
139 publicFavoritesMiddleware,
140 collectionsContentAddress
142 const enhancer = composeEnhancers(applyMiddleware(...middlewares));
143 return createStore(rootReducer, enhancer);
146 const createRootReducer = (services: ServiceRepository) => combineReducers({
147 auth: authReducer(services),
148 config: configReducer,
149 collectionPanel: collectionPanelReducer,
150 collectionPanelFiles: collectionPanelFilesReducer,
151 contextMenu: contextMenuReducer,
152 dataExplorer: dataExplorerReducer,
153 detailsPanel: detailsPanelReducer,
154 dialog: dialogReducer,
155 favorites: favoritesReducer,
156 publicFavorites: publicFavoritesReducer,
158 processLogsPanel: processLogsPanelReducer,
159 properties: propertiesReducer,
160 resources: resourcesReducer,
161 resourcesData: resourcesDataReducer,
162 router: routerReducer,
163 snackbar: snackbarReducer,
164 treePicker: treePickerReducer,
165 fileUploader: fileUploaderReducer,
166 processPanel: processPanelReducer,
167 progressIndicator: progressIndicatorReducer,
168 runProcessPanel: runProcessPanelReducer,
169 appInfo: appInfoReducer,
170 searchBar: searchBarReducer,
171 virtualMachines: virtualMachinesReducer,
172 repositories: repositoriesReducer,
173 keepServices: keepServicesReducer