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 { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
24 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
25 import { AllProcessesPanelMiddlewareService } from "./all-processes-panel/all-processes-panel-middleware-service";
26 import { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
27 import { dialogReducer } from './dialog/dialog-reducer';
28 import { ServiceRepository } from "services/services";
29 import { treePickerReducer, treePickerSearchReducer } from './tree-picker/tree-picker-reducer';
30 import { treePickerSearchMiddleware } from './tree-picker/tree-picker-middleware';
31 import { resourcesReducer } from 'store/resources/resources-reducer';
32 import { propertiesReducer } from './properties/properties-reducer';
33 import { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
34 import { TrashPanelMiddlewareService } from "store/trash-panel/trash-panel-middleware-service";
35 import { TRASH_PANEL_ID } from "store/trash-panel/trash-panel-action";
36 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
37 import { processPanelReducer } from 'store/process-panel/process-panel-reducer';
38 import { SHARED_WITH_ME_PANEL_ID } from 'store/shared-with-me-panel/shared-with-me-panel-actions';
39 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
40 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
41 import { runProcessPanelReducer } from 'store/run-process-panel/run-process-panel-reducer';
42 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
43 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
44 import { appInfoReducer } from 'store/app-info/app-info-reducer';
45 import { searchBarReducer } from './search-bar/search-bar-reducer';
46 import { SEARCH_RESULTS_PANEL_ID } from 'store/search-results-panel/search-results-panel-actions';
47 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
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 { UserProfileGroupsMiddlewareService } from 'store/user-profile/user-profile-groups-middleware-service';
54 import { USER_PROFILE_PANEL_ID } from 'store/user-profile/user-profile-actions'
55 import { GroupsPanelMiddlewareService } from 'store/groups-panel/groups-panel-middleware-service';
56 import { GROUPS_PANEL_ID } from 'store/groups-panel/groups-panel-actions';
57 import { GroupDetailsPanelMembersMiddlewareService } from 'store/group-details-panel/group-details-panel-members-middleware-service';
58 import { GroupDetailsPanelPermissionsMiddlewareService } from 'store/group-details-panel/group-details-panel-permissions-middleware-service';
59 import { GROUP_DETAILS_MEMBERS_PANEL_ID, GROUP_DETAILS_PERMISSIONS_PANEL_ID } from 'store/group-details-panel/group-details-panel-actions';
60 import { LINK_PANEL_ID } from 'store/link-panel/link-panel-actions';
61 import { LinkMiddlewareService } from 'store/link-panel/link-panel-middleware-service';
62 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from 'store/api-client-authorizations/api-client-authorizations-actions';
63 import { ApiClientAuthorizationMiddlewareService } from 'store/api-client-authorizations/api-client-authorizations-middleware-service';
64 import { PublicFavoritesMiddlewareService } from 'store/public-favorites-panel/public-favorites-middleware-service';
65 import { PUBLIC_FAVORITE_PANEL_ID } from 'store/public-favorites-panel/public-favorites-action';
66 import { publicFavoritesReducer } from 'store/public-favorites/public-favorites-reducer';
67 import { linkAccountPanelReducer } from './link-account-panel/link-account-panel-reducer';
68 import { CollectionsWithSameContentAddressMiddlewareService } from 'store/collections-content-address-panel/collections-content-address-middleware-service';
69 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from 'store/collections-content-address-panel/collections-content-address-panel-actions';
70 import { ownerNameReducer } from 'store/owner-name/owner-name-reducer';
71 import { SubprocessMiddlewareService } from 'store/subprocess-panel/subprocess-panel-middleware-service';
72 import { SUBPROCESS_PANEL_ID } from 'store/subprocess-panel/subprocess-panel-actions';
73 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
74 import { Config } from 'common/config';
75 import { pluginConfig } from 'plugins';
76 import { MiddlewareListReducer } from 'common/plugintypes';
80 __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
84 const composeEnhancers =
85 (process.env.NODE_ENV === 'development' &&
86 window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
89 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
91 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
93 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
94 const rootReducer = createRootReducer(services);
96 const projectPanelMiddleware = dataExplorerMiddleware(
97 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
99 const favoritePanelMiddleware = dataExplorerMiddleware(
100 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
102 const allProcessessPanelMiddleware = dataExplorerMiddleware(
103 new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
105 const trashPanelMiddleware = dataExplorerMiddleware(
106 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
108 const searchResultsPanelMiddleware = dataExplorerMiddleware(
109 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
111 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
112 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
114 const workflowPanelMiddleware = dataExplorerMiddleware(
115 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
117 const userPanelMiddleware = dataExplorerMiddleware(
118 new UserMiddlewareService(services, USERS_PANEL_ID)
120 const userProfileGroupsMiddleware = dataExplorerMiddleware(
121 new UserProfileGroupsMiddlewareService(services, USER_PROFILE_PANEL_ID)
123 const groupsPanelMiddleware = dataExplorerMiddleware(
124 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
126 const groupDetailsPanelMembersMiddleware = dataExplorerMiddleware(
127 new GroupDetailsPanelMembersMiddlewareService(services, GROUP_DETAILS_MEMBERS_PANEL_ID)
129 const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
130 new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
132 const linkPanelMiddleware = dataExplorerMiddleware(
133 new LinkMiddlewareService(services, LINK_PANEL_ID)
135 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
136 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
138 const publicFavoritesMiddleware = dataExplorerMiddleware(
139 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
141 const collectionsContentAddress = dataExplorerMiddleware(
142 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
144 const subprocessMiddleware = dataExplorerMiddleware(
145 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
147 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
148 const state = store.getState();
150 if (state.auth && state.auth.apiToken) {
151 handleRedirects(state.auth.apiToken, config);
157 let middlewares: Middleware[] = [
158 routerMiddleware(history),
159 thunkMiddleware.withExtraArgument(services),
160 authMiddleware(services),
161 projectPanelMiddleware,
162 favoritePanelMiddleware,
163 allProcessessPanelMiddleware,
164 trashPanelMiddleware,
165 searchResultsPanelMiddleware,
166 sharedWithMePanelMiddleware,
167 workflowPanelMiddleware,
169 userProfileGroupsMiddleware,
170 groupsPanelMiddleware,
171 groupDetailsPanelMembersMiddleware,
172 groupDetailsPanelPermissionsMiddleware,
174 apiClientAuthorizationMiddlewareService,
175 publicFavoritesMiddleware,
176 collectionsContentAddress,
177 subprocessMiddleware,
178 treePickerSearchMiddleware
181 const reduceMiddlewaresFn: (a: Middleware[],
182 b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
184 middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
186 const enhancer = composeEnhancers(applyMiddleware(redirectToMiddleware, ...middlewares));
187 return createStore(rootReducer, enhancer);
190 const createRootReducer = (services: ServiceRepository) => combineReducers({
191 auth: authReducer(services),
192 collectionPanel: collectionPanelReducer,
193 collectionPanelFiles: collectionPanelFilesReducer,
194 contextMenu: contextMenuReducer,
195 dataExplorer: dataExplorerReducer,
196 detailsPanel: detailsPanelReducer,
197 dialog: dialogReducer,
198 favorites: favoritesReducer,
199 ownerName: ownerNameReducer,
200 publicFavorites: publicFavoritesReducer,
202 processLogsPanel: processLogsPanelReducer,
203 properties: propertiesReducer,
204 resources: resourcesReducer,
205 router: routerReducer,
206 snackbar: snackbarReducer,
207 treePicker: treePickerReducer,
208 treePickerSearch: treePickerSearchReducer,
209 fileUploader: fileUploaderReducer,
210 processPanel: processPanelReducer,
211 progressIndicator: progressIndicatorReducer,
212 runProcessPanel: runProcessPanelReducer,
213 appInfo: appInfoReducer,
214 searchBar: searchBarReducer,
215 virtualMachines: virtualMachinesReducer,
216 repositories: repositoriesReducer,
217 keepServices: keepServicesReducer,
218 linkAccountPanel: linkAccountPanelReducer