17782: Additional imports and typing fixes.
[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 } from './tree-picker/tree-picker-reducer';
30 import { resourcesReducer } from 'store/resources/resources-reducer';
31 import { propertiesReducer } from './properties/properties-reducer';
32 import { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
33 import { TrashPanelMiddlewareService } from "store/trash-panel/trash-panel-middleware-service";
34 import { TRASH_PANEL_ID } from "store/trash-panel/trash-panel-action";
35 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
36 import { processPanelReducer } from 'store/process-panel/process-panel-reducer';
37 import { SHARED_WITH_ME_PANEL_ID } from 'store/shared-with-me-panel/shared-with-me-panel-actions';
38 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
39 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
40 import { runProcessPanelReducer } from 'store/run-process-panel/run-process-panel-reducer';
41 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
42 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
43 import { appInfoReducer } from 'store/app-info/app-info-reducer';
44 import { searchBarReducer } from './search-bar/search-bar-reducer';
45 import { SEARCH_RESULTS_PANEL_ID } from 'store/search-results-panel/search-results-panel-actions';
46 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
47 import { virtualMachinesReducer } from "store/virtual-machines/virtual-machines-reducer";
48 import { repositoriesReducer } from 'store/repositories/repositories-reducer';
49 import { keepServicesReducer } from 'store/keep-services/keep-services-reducer';
50 import { UserMiddlewareService } from 'store/users/user-panel-middleware-service';
51 import { USERS_PANEL_ID } from 'store/users/users-actions';
52 import { GroupsPanelMiddlewareService } from 'store/groups-panel/groups-panel-middleware-service';
53 import { GROUPS_PANEL_ID } from 'store/groups-panel/groups-panel-actions';
54 import { GroupDetailsPanelMiddlewareService } from 'store/group-details-panel/group-details-panel-middleware-service';
55 import { GROUP_DETAILS_PANEL_ID } from 'store/group-details-panel/group-details-panel-actions';
56 import { LINK_PANEL_ID } from 'store/link-panel/link-panel-actions';
57 import { LinkMiddlewareService } from 'store/link-panel/link-panel-middleware-service';
58 import { COMPUTE_NODE_PANEL_ID } from 'store/compute-nodes/compute-nodes-actions';
59 import { ComputeNodeMiddlewareService } from 'store/compute-nodes/compute-nodes-middleware-service';
60 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from 'store/api-client-authorizations/api-client-authorizations-actions';
61 import { ApiClientAuthorizationMiddlewareService } from 'store/api-client-authorizations/api-client-authorizations-middleware-service';
62 import { PublicFavoritesMiddlewareService } from 'store/public-favorites-panel/public-favorites-middleware-service';
63 import { PUBLIC_FAVORITE_PANEL_ID } from 'store/public-favorites-panel/public-favorites-action';
64 import { publicFavoritesReducer } from 'store/public-favorites/public-favorites-reducer';
65 import { linkAccountPanelReducer } from './link-account-panel/link-account-panel-reducer';
66 import { CollectionsWithSameContentAddressMiddlewareService } from 'store/collections-content-address-panel/collections-content-address-middleware-service';
67 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from 'store/collections-content-address-panel/collections-content-address-panel-actions';
68 import { ownerNameReducer } from 'store/owner-name/owner-name-reducer';
69 import { SubprocessMiddlewareService } from 'store/subprocess-panel/subprocess-panel-middleware-service';
70 import { SUBPROCESS_PANEL_ID } from 'store/subprocess-panel/subprocess-panel-actions';
71 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
72 import { Config } from 'common/config';
73 import { pluginConfig } from 'plugins';
74 import { MiddlewareListReducer } from 'common/plugintypes';
75
76 declare global {
77     interface Window {
78       __REDUX_DEVTOOLS_EXTENSION_COMPOSE__?: typeof compose;
79     }
80 }
81
82 const composeEnhancers =
83     (process.env.NODE_ENV === 'development' &&
84         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
85     compose;
86
87 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
88
89 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
90
91 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
92     const rootReducer = createRootReducer(services);
93
94     const projectPanelMiddleware = dataExplorerMiddleware(
95         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
96     );
97     const favoritePanelMiddleware = dataExplorerMiddleware(
98         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
99     );
100     const allProcessessPanelMiddleware = dataExplorerMiddleware(
101         new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
102     );
103     const trashPanelMiddleware = dataExplorerMiddleware(
104         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
105     );
106     const searchResultsPanelMiddleware = dataExplorerMiddleware(
107         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
108     );
109     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
110         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
111     );
112     const workflowPanelMiddleware = dataExplorerMiddleware(
113         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
114     );
115     const userPanelMiddleware = dataExplorerMiddleware(
116         new UserMiddlewareService(services, USERS_PANEL_ID)
117     );
118     const groupsPanelMiddleware = dataExplorerMiddleware(
119         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
120     );
121     const groupDetailsPanelMiddleware = dataExplorerMiddleware(
122         new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
123     );
124     const linkPanelMiddleware = dataExplorerMiddleware(
125         new LinkMiddlewareService(services, LINK_PANEL_ID)
126     );
127     const computeNodeMiddleware = dataExplorerMiddleware(
128         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
129     );
130     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
131         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
132     );
133     const publicFavoritesMiddleware = dataExplorerMiddleware(
134         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
135     );
136     const collectionsContentAddress = dataExplorerMiddleware(
137         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
138     );
139     const subprocessMiddleware = dataExplorerMiddleware(
140         new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
141     );
142     const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
143         const state = store.getState();
144
145         if (state.auth && state.auth.apiToken) {
146             handleRedirects(state.auth.apiToken, config);
147         }
148
149         return next(action);
150     };
151
152     let middlewares: Middleware[] = [
153         routerMiddleware(history),
154         thunkMiddleware.withExtraArgument(services),
155         authMiddleware(services),
156         projectPanelMiddleware,
157         favoritePanelMiddleware,
158         allProcessessPanelMiddleware,
159         trashPanelMiddleware,
160         searchResultsPanelMiddleware,
161         sharedWithMePanelMiddleware,
162         workflowPanelMiddleware,
163         userPanelMiddleware,
164         groupsPanelMiddleware,
165         groupDetailsPanelMiddleware,
166         linkPanelMiddleware,
167         computeNodeMiddleware,
168         apiClientAuthorizationMiddlewareService,
169         publicFavoritesMiddleware,
170         collectionsContentAddress,
171         subprocessMiddleware,
172     ];
173
174     const reduceMiddlewaresFn: (a: Middleware[],
175         b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
176
177     middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
178
179     const enhancer = composeEnhancers(applyMiddleware(redirectToMiddleware, ...middlewares));
180     return createStore(rootReducer, enhancer);
181 }
182
183 const createRootReducer = (services: ServiceRepository) => combineReducers({
184     auth: authReducer(services),
185     collectionPanel: collectionPanelReducer,
186     collectionPanelFiles: collectionPanelFilesReducer,
187     contextMenu: contextMenuReducer,
188     dataExplorer: dataExplorerReducer,
189     detailsPanel: detailsPanelReducer,
190     dialog: dialogReducer,
191     favorites: favoritesReducer,
192     ownerName: ownerNameReducer,
193     publicFavorites: publicFavoritesReducer,
194     form: formReducer,
195     processLogsPanel: processLogsPanelReducer,
196     properties: propertiesReducer,
197     resources: resourcesReducer,
198     router: routerReducer,
199     snackbar: snackbarReducer,
200     treePicker: treePickerReducer,
201     fileUploader: fileUploaderReducer,
202     processPanel: processPanelReducer,
203     progressIndicator: progressIndicatorReducer,
204     runProcessPanel: runProcessPanelReducer,
205     appInfo: appInfoReducer,
206     searchBar: searchBarReducer,
207     virtualMachines: virtualMachinesReducer,
208     repositories: repositoriesReducer,
209     keepServices: keepServicesReducer,
210     linkAccountPanel: linkAccountPanelReducer
211 });