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";
87 __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
91 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
93 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
95 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
96 const rootReducer = createRootReducer(services);
98 const projectPanelMiddleware = dataExplorerMiddleware(new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID));
99 const favoritePanelMiddleware = dataExplorerMiddleware(new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID));
100 const allProcessessPanelMiddleware = dataExplorerMiddleware(new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID));
101 const workflowProcessessPanelMiddleware = dataExplorerMiddleware(new WorkflowProcessesMiddlewareService(services, WORKFLOW_PROCESSES_PANEL_ID));
102 const trashPanelMiddleware = dataExplorerMiddleware(new TrashPanelMiddlewareService(services, TRASH_PANEL_ID));
103 const searchResultsPanelMiddleware = dataExplorerMiddleware(new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID));
104 const sharedWithMePanelMiddleware = dataExplorerMiddleware(new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID));
105 const workflowPanelMiddleware = dataExplorerMiddleware(new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID));
106 const userPanelMiddleware = dataExplorerMiddleware(new UserMiddlewareService(services, USERS_PANEL_ID));
107 const userProfileGroupsMiddleware = dataExplorerMiddleware(new UserProfileGroupsMiddlewareService(services, USER_PROFILE_PANEL_ID));
108 const groupsPanelMiddleware = dataExplorerMiddleware(new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID));
109 const groupDetailsPanelMembersMiddleware = dataExplorerMiddleware(
110 new GroupDetailsPanelMembersMiddlewareService(services, GROUP_DETAILS_MEMBERS_PANEL_ID)
112 const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
113 new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
115 const linkPanelMiddleware = dataExplorerMiddleware(new LinkMiddlewareService(services, LINK_PANEL_ID));
116 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
117 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
119 const publicFavoritesMiddleware = dataExplorerMiddleware(new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID));
120 const collectionsContentAddress = dataExplorerMiddleware(
121 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
123 const subprocessMiddleware = dataExplorerMiddleware(new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID));
125 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
126 const state = store.getState();
128 if (state.auth && state.auth.apiToken) {
129 handleRedirects(state.auth.apiToken, config);
135 let middlewares: Middleware[] = [
136 routerMiddleware(history),
137 thunkMiddleware.withExtraArgument(services),
138 authMiddleware(services),
139 tooltipsMiddleware(services),
140 projectPanelMiddleware,
141 favoritePanelMiddleware,
142 allProcessessPanelMiddleware,
143 trashPanelMiddleware,
144 searchResultsPanelMiddleware,
145 sharedWithMePanelMiddleware,
146 workflowPanelMiddleware,
148 userProfileGroupsMiddleware,
149 groupsPanelMiddleware,
150 groupDetailsPanelMembersMiddleware,
151 groupDetailsPanelPermissionsMiddleware,
153 apiClientAuthorizationMiddlewareService,
154 publicFavoritesMiddleware,
155 collectionsContentAddress,
156 subprocessMiddleware,
157 treePickerSearchMiddleware,
158 workflowProcessessPanelMiddleware
161 const reduceMiddlewaresFn: (a: Middleware[], b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
163 middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
165 const enhancer = composeWithDevTools({
167 })(applyMiddleware(redirectToMiddleware, ...middlewares));
168 return createStore(rootReducer, enhancer);
171 const createRootReducer = (services: ServiceRepository) =>
173 auth: authReducer(services),
174 banner: bannerReducer,
175 collectionPanel: collectionPanelReducer,
176 collectionPanelFiles: collectionPanelFilesReducer,
177 contextMenu: contextMenuReducer,
178 dataExplorer: dataExplorerReducer,
179 detailsPanel: detailsPanelReducer,
180 dialog: dialogReducer,
181 favorites: favoritesReducer,
182 ownerName: ownerNameReducer,
183 publicFavorites: publicFavoritesReducer,
185 processLogsPanel: processLogsPanelReducer,
186 properties: propertiesReducer,
187 resources: resourcesReducer,
188 router: routerReducer,
189 snackbar: snackbarReducer,
190 treePicker: treePickerReducer,
191 treePickerSearch: treePickerSearchReducer,
192 fileUploader: fileUploaderReducer,
193 processPanel: processPanelReducer,
194 progressIndicator: progressIndicatorReducer,
195 runProcessPanel: runProcessPanelReducer,
196 appInfo: appInfoReducer,
197 searchBar: searchBarReducer,
198 virtualMachines: virtualMachinesReducer,
199 repositories: repositoriesReducer,
200 keepServices: keepServicesReducer,
201 linkAccountPanel: linkAccountPanelReducer,
202 sidePanel: sidePanelReducer,
203 multiselect: multiselectReducer,