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";
9 import { handleRedirects } from "../common/redirect-to";
11 import { authReducer } from "./auth/auth-reducer";
12 import { authMiddleware } from "./auth/auth-middleware";
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 { WORKFLOW_PROCESSES_PANEL_ID } from "./workflow-panel/workflow-panel-actions";
24 import { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
25 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
26 import { AllProcessesPanelMiddlewareService } from "./all-processes-panel/all-processes-panel-middleware-service";
27 import { WorkflowProcessesMiddlewareService } from "./workflow-panel/workflow-middleware-service";
28 import { collectionPanelReducer } from "./collection-panel/collection-panel-reducer";
29 import { dialogReducer } from "./dialog/dialog-reducer";
30 import { ServiceRepository } from "services/services";
31 import { treePickerReducer, treePickerSearchReducer } from "./tree-picker/tree-picker-reducer";
32 import { treePickerSearchMiddleware } from "./tree-picker/tree-picker-middleware";
33 import { resourcesReducer } from "store/resources/resources-reducer";
34 import { propertiesReducer } from "./properties/properties-reducer";
35 import { fileUploaderReducer } from "./file-uploader/file-uploader-reducer";
36 import { TrashPanelMiddlewareService } from "store/trash-panel/trash-panel-middleware-service";
37 import { TRASH_PANEL_ID } from "store/trash-panel/trash-panel-action";
38 import { processLogsPanelReducer } from "./process-logs-panel/process-logs-panel-reducer";
39 import { processPanelReducer } from "store/process-panel/process-panel-reducer";
40 import { SHARED_WITH_ME_PANEL_ID } from "store/shared-with-me-panel/shared-with-me-panel-actions";
41 import { SharedWithMeMiddlewareService } from "./shared-with-me-panel/shared-with-me-middleware-service";
42 import { progressIndicatorReducer } from "./progress-indicator/progress-indicator-reducer";
43 import { runProcessPanelReducer } from "store/run-process-panel/run-process-panel-reducer";
44 import { WorkflowMiddlewareService } from "./workflow-panel/workflow-middleware-service";
45 import { WORKFLOW_PANEL_ID } from "./workflow-panel/workflow-panel-actions";
46 import { appInfoReducer } from "store/app-info/app-info-reducer";
47 import { searchBarReducer } from "./search-bar/search-bar-reducer";
48 import { SEARCH_RESULTS_PANEL_ID } from "store/search-results-panel/search-results-panel-actions";
49 import { SearchResultsMiddlewareService } from "./search-results-panel/search-results-middleware-service";
50 import { virtualMachinesReducer } from "store/virtual-machines/virtual-machines-reducer";
51 import { repositoriesReducer } from "store/repositories/repositories-reducer";
52 import { keepServicesReducer } from "store/keep-services/keep-services-reducer";
53 import { UserMiddlewareService } from "store/users/user-panel-middleware-service";
54 import { USERS_PANEL_ID } from "store/users/users-actions";
55 import { UserProfileGroupsMiddlewareService } from "store/user-profile/user-profile-groups-middleware-service";
56 import { USER_PROFILE_PANEL_ID } from "store/user-profile/user-profile-actions";
57 import { GroupsPanelMiddlewareService } from "store/groups-panel/groups-panel-middleware-service";
58 import { GROUPS_PANEL_ID } from "store/groups-panel/groups-panel-actions";
59 import { GroupDetailsPanelMembersMiddlewareService } from "store/group-details-panel/group-details-panel-members-middleware-service";
60 import { GroupDetailsPanelPermissionsMiddlewareService } from "store/group-details-panel/group-details-panel-permissions-middleware-service";
61 import { GROUP_DETAILS_MEMBERS_PANEL_ID, GROUP_DETAILS_PERMISSIONS_PANEL_ID } from "store/group-details-panel/group-details-panel-actions";
62 import { LINK_PANEL_ID } from "store/link-panel/link-panel-actions";
63 import { LinkMiddlewareService } from "store/link-panel/link-panel-middleware-service";
64 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from "store/api-client-authorizations/api-client-authorizations-actions";
65 import { ApiClientAuthorizationMiddlewareService } from "store/api-client-authorizations/api-client-authorizations-middleware-service";
66 import { PublicFavoritesMiddlewareService } from "store/public-favorites-panel/public-favorites-middleware-service";
67 import { PUBLIC_FAVORITE_PANEL_ID } from "store/public-favorites-panel/public-favorites-action";
68 import { publicFavoritesReducer } from "store/public-favorites/public-favorites-reducer";
69 import { linkAccountPanelReducer } from "./link-account-panel/link-account-panel-reducer";
70 import { CollectionsWithSameContentAddressMiddlewareService } from "store/collections-content-address-panel/collections-content-address-middleware-service";
71 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from "store/collections-content-address-panel/collections-content-address-panel-actions";
72 import { ownerNameReducer } from "store/owner-name/owner-name-reducer";
73 import { SubprocessMiddlewareService } from "store/subprocess-panel/subprocess-panel-middleware-service";
74 import { SUBPROCESS_PANEL_ID } from "store/subprocess-panel/subprocess-panel-actions";
75 import { ALL_PROCESSES_PANEL_ID } from "./all-processes-panel/all-processes-panel-action";
76 import { Config } from "common/config";
77 import { pluginConfig } from "plugins";
78 import { MiddlewareListReducer } from "common/plugintypes";
79 import { tooltipsMiddleware } from "./tooltips/tooltips-middleware";
80 import { sidePanelReducer } from "./side-panel/side-panel-reducer";
81 import { bannerReducer } from "./banner/banner-reducer";
82 import { multiselectReducer } from "./multiselect/multiselect-reducer";
83 import { composeWithDevTools } from "redux-devtools-extension";
84 import { selectedResourceReducer } from "./selected-resource/selected-resource-reducer";
88 __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
92 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
94 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
96 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
97 const rootReducer = createRootReducer(services);
99 const projectPanelMiddleware = dataExplorerMiddleware(new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID));
100 const favoritePanelMiddleware = dataExplorerMiddleware(new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID));
101 const allProcessessPanelMiddleware = dataExplorerMiddleware(new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID));
102 const workflowProcessessPanelMiddleware = dataExplorerMiddleware(new WorkflowProcessesMiddlewareService(services, WORKFLOW_PROCESSES_PANEL_ID));
103 const trashPanelMiddleware = dataExplorerMiddleware(new TrashPanelMiddlewareService(services, TRASH_PANEL_ID));
104 const searchResultsPanelMiddleware = dataExplorerMiddleware(new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID));
105 const sharedWithMePanelMiddleware = dataExplorerMiddleware(new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID));
106 const workflowPanelMiddleware = dataExplorerMiddleware(new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID));
107 const userPanelMiddleware = dataExplorerMiddleware(new UserMiddlewareService(services, USERS_PANEL_ID));
108 const userProfileGroupsMiddleware = dataExplorerMiddleware(new UserProfileGroupsMiddlewareService(services, USER_PROFILE_PANEL_ID));
109 const groupsPanelMiddleware = dataExplorerMiddleware(new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID));
110 const groupDetailsPanelMembersMiddleware = dataExplorerMiddleware(
111 new GroupDetailsPanelMembersMiddlewareService(services, GROUP_DETAILS_MEMBERS_PANEL_ID)
113 const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
114 new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
116 const linkPanelMiddleware = dataExplorerMiddleware(new LinkMiddlewareService(services, LINK_PANEL_ID));
117 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
118 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
120 const publicFavoritesMiddleware = dataExplorerMiddleware(new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID));
121 const collectionsContentAddress = dataExplorerMiddleware(
122 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
124 const subprocessMiddleware = dataExplorerMiddleware(new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID));
126 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
127 const state = store.getState();
129 if (state.auth && state.auth.apiToken) {
130 handleRedirects(state.auth.apiToken, config);
136 let middlewares: Middleware[] = [
137 routerMiddleware(history),
138 thunkMiddleware.withExtraArgument(services),
139 authMiddleware(services),
140 tooltipsMiddleware(services),
141 projectPanelMiddleware,
142 favoritePanelMiddleware,
143 allProcessessPanelMiddleware,
144 trashPanelMiddleware,
145 searchResultsPanelMiddleware,
146 sharedWithMePanelMiddleware,
147 workflowPanelMiddleware,
149 userProfileGroupsMiddleware,
150 groupsPanelMiddleware,
151 groupDetailsPanelMembersMiddleware,
152 groupDetailsPanelPermissionsMiddleware,
154 apiClientAuthorizationMiddlewareService,
155 publicFavoritesMiddleware,
156 collectionsContentAddress,
157 subprocessMiddleware,
158 treePickerSearchMiddleware,
159 workflowProcessessPanelMiddleware
162 const reduceMiddlewaresFn: (a: Middleware[], b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
164 middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
166 const enhancer = composeWithDevTools({
168 })(applyMiddleware(redirectToMiddleware, ...middlewares));
169 return createStore(rootReducer, enhancer);
172 const createRootReducer = (services: ServiceRepository) =>
174 auth: authReducer(services),
175 banner: bannerReducer,
176 collectionPanel: collectionPanelReducer,
177 collectionPanelFiles: collectionPanelFilesReducer,
178 contextMenu: contextMenuReducer,
179 dataExplorer: dataExplorerReducer,
180 detailsPanel: detailsPanelReducer,
181 dialog: dialogReducer,
182 favorites: favoritesReducer,
183 ownerName: ownerNameReducer,
184 publicFavorites: publicFavoritesReducer,
186 processLogsPanel: processLogsPanelReducer,
187 properties: propertiesReducer,
188 resources: resourcesReducer,
189 router: routerReducer,
190 selectedResourceUuid: selectedResourceReducer,
191 snackbar: snackbarReducer,
192 treePicker: treePickerReducer,
193 treePickerSearch: treePickerSearchReducer,
194 fileUploader: fileUploaderReducer,
195 processPanel: processPanelReducer,
196 progressIndicator: progressIndicatorReducer,
197 runProcessPanel: runProcessPanelReducer,
198 appInfo: appInfoReducer,
199 searchBar: searchBarReducer,
200 virtualMachines: virtualMachinesReducer,
201 repositories: repositoriesReducer,
202 keepServices: keepServicesReducer,
203 linkAccountPanel: linkAccountPanelReducer,
204 sidePanel: sidePanelReducer,
205 multiselect: multiselectReducer,