21700: Install Bundler system-wide in Rails postinst
[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
85 declare global {
86     interface Window {
87         __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
88     }
89 }
90
91 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
92
93 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
94
95 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
96     const rootReducer = createRootReducer(services);
97
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)
111     );
112     const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
113         new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
114     );
115     const linkPanelMiddleware = dataExplorerMiddleware(new LinkMiddlewareService(services, LINK_PANEL_ID));
116     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
117         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
118     );
119     const publicFavoritesMiddleware = dataExplorerMiddleware(new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID));
120     const collectionsContentAddress = dataExplorerMiddleware(
121         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
122     );
123     const subprocessMiddleware = dataExplorerMiddleware(new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID));
124
125     const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
126         const state = store.getState();
127
128         if (state.auth && state.auth.apiToken) {
129             handleRedirects(state.auth.apiToken, config);
130         }
131
132         return next(action);
133     };
134
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,
147         userPanelMiddleware,
148         userProfileGroupsMiddleware,
149         groupsPanelMiddleware,
150         groupDetailsPanelMembersMiddleware,
151         groupDetailsPanelPermissionsMiddleware,
152         linkPanelMiddleware,
153         apiClientAuthorizationMiddlewareService,
154         publicFavoritesMiddleware,
155         collectionsContentAddress,
156         subprocessMiddleware,
157         treePickerSearchMiddleware,
158         workflowProcessessPanelMiddleware
159     ];
160
161     const reduceMiddlewaresFn: (a: Middleware[], b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
162
163     middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
164
165     const enhancer = composeWithDevTools({
166         /* options */
167     })(applyMiddleware(redirectToMiddleware, ...middlewares));
168     return createStore(rootReducer, enhancer);
169 }
170
171 const createRootReducer = (services: ServiceRepository) =>
172     combineReducers({
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,
184         form: formReducer,
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,
204     });