1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
5 import { createStore, applyMiddleware, 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';
77 import { tooltipsMiddleware } from './tooltips/tooltips-middleware';
78 import { sidePanelReducer } from './side-panel/side-panel-reducer'
79 import { bannerReducer } from './banner/banner-reducer';
80 import { composeWithDevTools } from 'redux-devtools-extension';
82 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
84 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
86 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
87 const rootReducer = createRootReducer(services);
89 const projectPanelMiddleware = dataExplorerMiddleware(
90 new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
92 const favoritePanelMiddleware = dataExplorerMiddleware(
93 new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
95 const allProcessessPanelMiddleware = dataExplorerMiddleware(
96 new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
98 const trashPanelMiddleware = dataExplorerMiddleware(
99 new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
101 const searchResultsPanelMiddleware = dataExplorerMiddleware(
102 new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
104 const sharedWithMePanelMiddleware = dataExplorerMiddleware(
105 new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
107 const workflowPanelMiddleware = dataExplorerMiddleware(
108 new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
110 const userPanelMiddleware = dataExplorerMiddleware(
111 new UserMiddlewareService(services, USERS_PANEL_ID)
113 const userProfileGroupsMiddleware = dataExplorerMiddleware(
114 new UserProfileGroupsMiddlewareService(services, USER_PROFILE_PANEL_ID)
116 const groupsPanelMiddleware = dataExplorerMiddleware(
117 new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
119 const groupDetailsPanelMembersMiddleware = dataExplorerMiddleware(
120 new GroupDetailsPanelMembersMiddlewareService(services, GROUP_DETAILS_MEMBERS_PANEL_ID)
122 const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
123 new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
125 const linkPanelMiddleware = dataExplorerMiddleware(
126 new LinkMiddlewareService(services, LINK_PANEL_ID)
128 const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
129 new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
131 const publicFavoritesMiddleware = dataExplorerMiddleware(
132 new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
134 const collectionsContentAddress = dataExplorerMiddleware(
135 new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
137 const subprocessMiddleware = dataExplorerMiddleware(
138 new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
140 const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
141 const state = store.getState();
143 if (state.auth && state.auth.apiToken) {
144 handleRedirects(state.auth.apiToken, config);
150 let middlewares: Middleware[] = [
151 routerMiddleware(history),
152 thunkMiddleware.withExtraArgument(services),
153 authMiddleware(services),
154 tooltipsMiddleware(services),
155 projectPanelMiddleware,
156 favoritePanelMiddleware,
157 allProcessessPanelMiddleware,
158 trashPanelMiddleware,
159 searchResultsPanelMiddleware,
160 sharedWithMePanelMiddleware,
161 workflowPanelMiddleware,
163 userProfileGroupsMiddleware,
164 groupsPanelMiddleware,
165 groupDetailsPanelMembersMiddleware,
166 groupDetailsPanelPermissionsMiddleware,
168 apiClientAuthorizationMiddlewareService,
169 publicFavoritesMiddleware,
170 collectionsContentAddress,
171 subprocessMiddleware,
172 treePickerSearchMiddleware
175 const reduceMiddlewaresFn: (a: Middleware[],
176 b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
178 middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
180 const enhancer = composeWithDevTools({/* options */ })(applyMiddleware(redirectToMiddleware, ...middlewares));
181 return createStore(rootReducer, enhancer);
184 const createRootReducer = (services: ServiceRepository) => combineReducers({
185 auth: authReducer(services),
186 banner: bannerReducer,
187 collectionPanel: collectionPanelReducer,
188 collectionPanelFiles: collectionPanelFilesReducer,
189 contextMenu: contextMenuReducer,
190 dataExplorer: dataExplorerReducer,
191 detailsPanel: detailsPanelReducer,
192 dialog: dialogReducer,
193 favorites: favoritesReducer,
194 ownerName: ownerNameReducer,
195 publicFavorites: publicFavoritesReducer,
197 processLogsPanel: processLogsPanelReducer,
198 properties: propertiesReducer,
199 resources: resourcesReducer,
200 router: routerReducer,
201 snackbar: snackbarReducer,
202 treePicker: treePickerReducer,
203 treePickerSearch: treePickerSearchReducer,
204 fileUploader: fileUploaderReducer,
205 processPanel: processPanelReducer,
206 progressIndicator: progressIndicatorReducer,
207 runProcessPanel: runProcessPanelReducer,
208 appInfo: appInfoReducer,
209 searchBar: searchBarReducer,
210 virtualMachines: virtualMachinesReducer,
211 repositories: repositoriesReducer,
212 keepServices: keepServicesReducer,
213 linkAccountPanel: linkAccountPanelReducer,
214 sidePanel: sidePanelReducer