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