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 { resourcesDataReducer } from "~/store/resources-data/resources-data-reducer";
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';
69 const composeEnhancers =
70 (process.env.NODE_ENV === 'development' &&
71 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
72 window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
75 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
77 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
79 export function configureStore(history: History, services: ServiceRepository): RootStore {
80 const rootReducer = createRootReducer(services);
82 const projectPanelMiddleware = dataExplorerMiddleware(
83 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
85 const favoritePanelMiddleware = dataExplorerMiddleware(
86 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
88 const trashPanelMiddleware = dataExplorerMiddleware(
89 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
91 const searchResultsPanelMiddleware = dataExplorerMiddleware(
92 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
94 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
95 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
97 const workflowPanelMiddleware = dataExplorerMiddleware(
98 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
100 const userPanelMiddleware = dataExplorerMiddleware(
101 new UserMiddlewareService(services, USERS_PANEL_ID)
103 const groupsPanelMiddleware = dataExplorerMiddleware(
104 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
106 const groupDetailsPanelMiddleware = dataExplorerMiddleware(
107 new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
109 const linkPanelMiddleware = dataExplorerMiddleware(
110 new LinkMiddlewareService(services, LINK_PANEL_ID)
112 const computeNodeMiddleware = dataExplorerMiddleware(
113 new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
115 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
116 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
118 const publicFavoritesMiddleware = dataExplorerMiddleware(
119 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
121 const collectionsContentAddress = dataExplorerMiddleware(
122 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
125 const middlewares: Middleware[] = [
126 routerMiddleware(history),
127 thunkMiddleware.withExtraArgument(services),
128 authMiddleware(services),
129 projectPanelMiddleware,
130 favoritePanelMiddleware,
131 trashPanelMiddleware,
132 searchResultsPanelMiddleware,
133 sharedWithMePanelMiddleware,
134 workflowPanelMiddleware,
136 groupsPanelMiddleware,
137 groupDetailsPanelMiddleware,
139 computeNodeMiddleware,
140 apiClientAuthorizationMiddlewareService,
141 publicFavoritesMiddleware,
142 collectionsContentAddress
144 const enhancer = composeEnhancers(applyMiddleware(...middlewares));
145 return createStore(rootReducer, enhancer);
148 const createRootReducer = (services: ServiceRepository) => combineReducers({
149 auth: authReducer(services),
150 collectionPanel: collectionPanelReducer,
151 collectionPanelFiles: collectionPanelFilesReducer,
152 contextMenu: contextMenuReducer,
153 dataExplorer: dataExplorerReducer,
154 detailsPanel: detailsPanelReducer,
155 dialog: dialogReducer,
156 favorites: favoritesReducer,
157 ownerName: ownerNameReducer,
158 publicFavorites: publicFavoritesReducer,
160 processLogsPanel: processLogsPanelReducer,
161 properties: propertiesReducer,
162 resources: resourcesReducer,
163 resourcesData: resourcesDataReducer,
164 router: routerReducer,
165 snackbar: snackbarReducer,
166 treePicker: treePickerReducer,
167 fileUploader: fileUploaderReducer,
168 processPanel: processPanelReducer,
169 progressIndicator: progressIndicatorReducer,
170 runProcessPanel: runProcessPanelReducer,
171 appInfo: appInfoReducer,
172 searchBar: searchBarReducer,
173 virtualMachines: virtualMachinesReducer,
174 repositories: repositoriesReducer,
175 keepServices: keepServicesReducer,
176 linkAccountPanel: linkAccountPanelReducer