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';
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 authMiddleware(services),
128 projectPanelMiddleware,
129 favoritePanelMiddleware,
130 trashPanelMiddleware,
131 searchResultsPanelMiddleware,
132 sharedWithMePanelMiddleware,
133 workflowPanelMiddleware,
135 groupsPanelMiddleware,
136 groupDetailsPanelMiddleware,
138 computeNodeMiddleware,
139 apiClientAuthorizationMiddlewareService,
140 publicFavoritesMiddleware,
141 collectionsContentAddress
143 const enhancer = composeEnhancers(applyMiddleware(...middlewares));
144 return createStore(rootReducer, enhancer);
147 const createRootReducer = (services: ServiceRepository) => combineReducers({
148 auth: authReducer(services),
149 collectionPanel: collectionPanelReducer,
150 collectionPanelFiles: collectionPanelFilesReducer,
151 contextMenu: contextMenuReducer,
152 dataExplorer: dataExplorerReducer,
153 detailsPanel: detailsPanelReducer,
154 dialog: dialogReducer,
155 favorites: favoritesReducer,
156 ownerName: ownerNameReducer,
157 publicFavorites: publicFavoritesReducer,
159 processLogsPanel: processLogsPanelReducer,
160 properties: propertiesReducer,
161 resources: resourcesReducer,
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,
174 linkAccountPanel: linkAccountPanelReducer