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