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';
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 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 config: configReducer,
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