21846: applied select to context menu open
[arvados.git] / services / workbench2 / src / store / store.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
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";
10
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";
85
86 declare global {
87     interface Window {
88         __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
89     }
90 }
91
92 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
93
94 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
95
96 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
97     const rootReducer = createRootReducer(services);
98
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)
112     );
113     const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
114         new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
115     );
116     const linkPanelMiddleware = dataExplorerMiddleware(new LinkMiddlewareService(services, LINK_PANEL_ID));
117     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
118         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
119     );
120     const publicFavoritesMiddleware = dataExplorerMiddleware(new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID));
121     const collectionsContentAddress = dataExplorerMiddleware(
122         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
123     );
124     const subprocessMiddleware = dataExplorerMiddleware(new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID));
125
126     const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
127         const state = store.getState();
128
129         if (state.auth && state.auth.apiToken) {
130             handleRedirects(state.auth.apiToken, config);
131         }
132
133         return next(action);
134     };
135
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,
148         userPanelMiddleware,
149         userProfileGroupsMiddleware,
150         groupsPanelMiddleware,
151         groupDetailsPanelMembersMiddleware,
152         groupDetailsPanelPermissionsMiddleware,
153         linkPanelMiddleware,
154         apiClientAuthorizationMiddlewareService,
155         publicFavoritesMiddleware,
156         collectionsContentAddress,
157         subprocessMiddleware,
158         treePickerSearchMiddleware,
159         workflowProcessessPanelMiddleware
160     ];
161
162     const reduceMiddlewaresFn: (a: Middleware[], b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
163
164     middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
165
166     const enhancer = composeWithDevTools({
167         /* options */
168     })(applyMiddleware(redirectToMiddleware, ...middlewares));
169     return createStore(rootReducer, enhancer);
170 }
171
172 const createRootReducer = (services: ServiceRepository) =>
173     combineReducers({
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,
185         form: formReducer,
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,
206     });