929ca616193287929b30c9020eb313a0caae26c0
[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 { ownerNameUuidEnhancerReducer } from './owner-name-uuid-enhancer/owner-name-uuid-enhancer-reducer';
70 import { SubprocessMiddlewareService } from '~/store/subprocess-panel/subprocess-panel-middleware-service';
71 import { SUBPROCESS_PANEL_ID } from '~/store/subprocess-panel/subprocess-panel-actions';
72 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
73 import { Config } from '~/common/config';
74
75 const composeEnhancers =
76     (process.env.NODE_ENV === 'development' &&
77         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
78         window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
79     compose;
80
81 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
82
83 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
84
85 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
86     const rootReducer = createRootReducer(services);
87
88     const projectPanelMiddleware = dataExplorerMiddleware(
89         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
90     );
91     const favoritePanelMiddleware = dataExplorerMiddleware(
92         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
93     );
94     const allProcessessPanelMiddleware = dataExplorerMiddleware(
95         new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
96     );
97     const trashPanelMiddleware = dataExplorerMiddleware(
98         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
99     );
100     const searchResultsPanelMiddleware = dataExplorerMiddleware(
101         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
102     );
103     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
104         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
105     );
106     const workflowPanelMiddleware = dataExplorerMiddleware(
107         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
108     );
109     const userPanelMiddleware = dataExplorerMiddleware(
110         new UserMiddlewareService(services, USERS_PANEL_ID)
111     );
112     const groupsPanelMiddleware = dataExplorerMiddleware(
113         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
114     );
115     const groupDetailsPanelMiddleware = dataExplorerMiddleware(
116         new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
117     );
118     const linkPanelMiddleware = dataExplorerMiddleware(
119         new LinkMiddlewareService(services, LINK_PANEL_ID)
120     );
121     const computeNodeMiddleware = dataExplorerMiddleware(
122         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
123     );
124     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
125         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
126     );
127     const publicFavoritesMiddleware = dataExplorerMiddleware(
128         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
129     );
130     const collectionsContentAddress = dataExplorerMiddleware(
131         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
132     );
133     const subprocessMiddleware = dataExplorerMiddleware(
134         new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
135     );
136     const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
137         const state = store.getState();
138
139         if (state.auth && state.auth.apiToken) {
140             handleRedirects(state.auth.apiToken, config);
141         }
142
143         return next(action);
144     };
145
146     const middlewares: Middleware[] = [
147         routerMiddleware(history),
148         thunkMiddleware.withExtraArgument(services),
149         authMiddleware(services),
150         projectPanelMiddleware,
151         favoritePanelMiddleware,
152         allProcessessPanelMiddleware,
153         trashPanelMiddleware,
154         searchResultsPanelMiddleware,
155         sharedWithMePanelMiddleware,
156         workflowPanelMiddleware,
157         userPanelMiddleware,
158         groupsPanelMiddleware,
159         groupDetailsPanelMiddleware,
160         linkPanelMiddleware,
161         computeNodeMiddleware,
162         apiClientAuthorizationMiddlewareService,
163         publicFavoritesMiddleware,
164         collectionsContentAddress,
165         subprocessMiddleware,
166     ];
167
168     const enhancer = composeEnhancers(applyMiddleware(redirectToMiddleware, ...middlewares));
169     return createStore(rootReducer, enhancer);
170 }
171
172 const createRootReducer = (services: ServiceRepository) => combineReducers({
173     auth: authReducer(services),
174     collectionPanel: collectionPanelReducer,
175     collectionPanelFiles: collectionPanelFilesReducer,
176     contextMenu: contextMenuReducer,
177     dataExplorer: dataExplorerReducer,
178     detailsPanel: detailsPanelReducer,
179     dialog: dialogReducer,
180     favorites: favoritesReducer,
181     ownerName: ownerNameReducer,
182     ownerNameUuidEnhancer: ownerNameUuidEnhancerReducer,
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     fileUploader: fileUploaderReducer,
192     processPanel: processPanelReducer,
193     progressIndicator: progressIndicatorReducer,
194     runProcessPanel: runProcessPanelReducer,
195     appInfo: appInfoReducer,
196     searchBar: searchBarReducer,
197     virtualMachines: virtualMachinesReducer,
198     repositories: repositoriesReducer,
199     keepServices: keepServicesReducer,
200     linkAccountPanel: linkAccountPanelReducer
201 });