15768: merge cleanup Arvados-DCO-1.1-Signed-off-by: Lisa Knox <lisa.knox@curii.com>
[arvados-workbench2.git] / 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 { 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 { multiselectReducer } from "./multiselect/multiselect-reducer";
81 import { composeWithDevTools } from "redux-devtools-extension";
82 const composeEnhancers = (process.env.NODE_ENV === "development" && window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) || compose;
83
84 declare global {
85     interface Window {
86         __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
87     }
88 }
89
90 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
91
92 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
93
94 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
95     const rootReducer = createRootReducer(services);
96
97     const projectPanelMiddleware = dataExplorerMiddleware(new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID));
98     const favoritePanelMiddleware = dataExplorerMiddleware(new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID));
99     const allProcessessPanelMiddleware = dataExplorerMiddleware(new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID));
100     const trashPanelMiddleware = dataExplorerMiddleware(new TrashPanelMiddlewareService(services, TRASH_PANEL_ID));
101     const searchResultsPanelMiddleware = dataExplorerMiddleware(new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID));
102     const sharedWithMePanelMiddleware = dataExplorerMiddleware(new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID));
103     const workflowPanelMiddleware = dataExplorerMiddleware(new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID));
104     const userPanelMiddleware = dataExplorerMiddleware(new UserMiddlewareService(services, USERS_PANEL_ID));
105     const userProfileGroupsMiddleware = dataExplorerMiddleware(new UserProfileGroupsMiddlewareService(services, USER_PROFILE_PANEL_ID));
106     const groupsPanelMiddleware = dataExplorerMiddleware(new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID));
107     const groupDetailsPanelMembersMiddleware = dataExplorerMiddleware(
108         new GroupDetailsPanelMembersMiddlewareService(services, GROUP_DETAILS_MEMBERS_PANEL_ID)
109     );
110     const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
111         new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
112     );
113     const linkPanelMiddleware = dataExplorerMiddleware(new LinkMiddlewareService(services, LINK_PANEL_ID));
114     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
115         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
116     );
117     const publicFavoritesMiddleware = dataExplorerMiddleware(new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID));
118     const collectionsContentAddress = dataExplorerMiddleware(
119         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
120     );
121     const subprocessMiddleware = dataExplorerMiddleware(new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID));
122
123     const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
124         const state = store.getState();
125
126         if (state.auth && state.auth.apiToken) {
127             handleRedirects(state.auth.apiToken, config);
128         }
129
130         return next(action);
131     };
132
133     let middlewares: Middleware[] = [
134         routerMiddleware(history),
135         thunkMiddleware.withExtraArgument(services),
136         authMiddleware(services),
137         tooltipsMiddleware(services),
138         projectPanelMiddleware,
139         favoritePanelMiddleware,
140         allProcessessPanelMiddleware,
141         trashPanelMiddleware,
142         searchResultsPanelMiddleware,
143         sharedWithMePanelMiddleware,
144         workflowPanelMiddleware,
145         userPanelMiddleware,
146         userProfileGroupsMiddleware,
147         groupsPanelMiddleware,
148         groupDetailsPanelMembersMiddleware,
149         groupDetailsPanelPermissionsMiddleware,
150         linkPanelMiddleware,
151         apiClientAuthorizationMiddlewareService,
152         publicFavoritesMiddleware,
153         collectionsContentAddress,
154         subprocessMiddleware,
155         treePickerSearchMiddleware,
156     ];
157
158     const reduceMiddlewaresFn: (a: Middleware[], b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
159
160     middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
161
162     const enhancer = composeWithDevTools({
163         /* options */
164     })(applyMiddleware(redirectToMiddleware, ...middlewares));
165     return createStore(rootReducer, enhancer);
166 }
167
168 const createRootReducer = (services: ServiceRepository) =>
169     combineReducers({
170         auth: authReducer(services),
171         banner: bannerReducer,
172         collectionPanel: collectionPanelReducer,
173         collectionPanelFiles: collectionPanelFilesReducer,
174         contextMenu: contextMenuReducer,
175         dataExplorer: dataExplorerReducer,
176         detailsPanel: detailsPanelReducer,
177         dialog: dialogReducer,
178         favorites: favoritesReducer,
179         ownerName: ownerNameReducer,
180         publicFavorites: publicFavoritesReducer,
181         form: formReducer,
182         processLogsPanel: processLogsPanelReducer,
183         properties: propertiesReducer,
184         resources: resourcesReducer,
185         router: routerReducer,
186         snackbar: snackbarReducer,
187         treePicker: treePickerReducer,
188         treePickerSearch: treePickerSearchReducer,
189         fileUploader: fileUploaderReducer,
190         processPanel: processPanelReducer,
191         progressIndicator: progressIndicatorReducer,
192         runProcessPanel: runProcessPanelReducer,
193         appInfo: appInfoReducer,
194         searchBar: searchBarReducer,
195         virtualMachines: virtualMachinesReducer,
196         repositories: repositoriesReducer,
197         keepServices: keepServicesReducer,
198         linkAccountPanel: linkAccountPanelReducer,
199         sidePanel: sidePanelReducer,
200         multiselect: multiselectReducer,
201     });