15803: Refactor internal user and API token management
[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
10 import { authReducer } from "./auth/auth-reducer";
11 import { authMiddleware } from "./auth/auth-middleware";
12 import { configReducer } from "./config/config-reducer";
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 { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
26 import { dialogReducer } from './dialog/dialog-reducer';
27 import { ServiceRepository } from "~/services/services";
28 import { treePickerReducer } from './tree-picker/tree-picker-reducer';
29 import { resourcesReducer } from '~/store/resources/resources-reducer';
30 import { propertiesReducer } from './properties/properties-reducer';
31 import { RootState } from './store';
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 { resourcesDataReducer } from "~/store/resources-data/resources-data-reducer";
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 { GroupsPanelMiddlewareService } from '~/store/groups-panel/groups-panel-middleware-service';
54 import { GROUPS_PANEL_ID } from '~/store/groups-panel/groups-panel-actions';
55 import { GroupDetailsPanelMiddlewareService } from '~/store/group-details-panel/group-details-panel-middleware-service';
56 import { GROUP_DETAILS_PANEL_ID } from '~/store/group-details-panel/group-details-panel-actions';
57 import { LINK_PANEL_ID } from '~/store/link-panel/link-panel-actions';
58 import { LinkMiddlewareService } from '~/store/link-panel/link-panel-middleware-service';
59 import { COMPUTE_NODE_PANEL_ID } from '~/store/compute-nodes/compute-nodes-actions';
60 import { ComputeNodeMiddlewareService } from '~/store/compute-nodes/compute-nodes-middleware-service';
61 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from '~/store/api-client-authorizations/api-client-authorizations-actions';
62 import { ApiClientAuthorizationMiddlewareService } from '~/store/api-client-authorizations/api-client-authorizations-middleware-service';
63 import { PublicFavoritesMiddlewareService } from '~/store/public-favorites-panel/public-favorites-middleware-service';
64 import { PUBLIC_FAVORITE_PANEL_ID } from '~/store/public-favorites-panel/public-favorites-action';
65 import { publicFavoritesReducer } from '~/store/public-favorites/public-favorites-reducer';
66 import { linkAccountPanelReducer } from './link-account-panel/link-account-panel-reducer';
67 import { CollectionsWithSameContentAddressMiddlewareService } from '~/store/collections-content-address-panel/collections-content-address-middleware-service';
68 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from '~/store/collections-content-address-panel/collections-content-address-panel-actions';
69 import { ownerNameReducer } from '~/store/owner-name/owner-name-reducer';
70
71 const composeEnhancers =
72     (process.env.NODE_ENV === 'development' &&
73         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
74         window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
75     compose;
76
77 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
78
79 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
80
81 export function configureStore(history: History, services: ServiceRepository): RootStore {
82     const rootReducer = createRootReducer(services);
83
84     const projectPanelMiddleware = dataExplorerMiddleware(
85         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
86     );
87     const favoritePanelMiddleware = dataExplorerMiddleware(
88         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
89     );
90     const trashPanelMiddleware = dataExplorerMiddleware(
91         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
92     );
93     const searchResultsPanelMiddleware = dataExplorerMiddleware(
94         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
95     );
96     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
97         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
98     );
99     const workflowPanelMiddleware = dataExplorerMiddleware(
100         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
101     );
102     const userPanelMiddleware = dataExplorerMiddleware(
103         new UserMiddlewareService(services, USERS_PANEL_ID)
104     );
105     const groupsPanelMiddleware = dataExplorerMiddleware(
106         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
107     );
108     const groupDetailsPanelMiddleware = dataExplorerMiddleware(
109         new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
110     );
111     const linkPanelMiddleware = dataExplorerMiddleware(
112         new LinkMiddlewareService(services, LINK_PANEL_ID)
113     );
114     const computeNodeMiddleware = dataExplorerMiddleware(
115         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
116     );
117     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
118         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
119     );
120     const publicFavoritesMiddleware = dataExplorerMiddleware(
121         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
122     );
123     const collectionsContentAddress = dataExplorerMiddleware(
124         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
125     );
126
127     const middlewares: Middleware[] = [
128         routerMiddleware(history),
129         thunkMiddleware.withExtraArgument(services),
130         authMiddleware(services),
131         projectPanelMiddleware,
132         favoritePanelMiddleware,
133         trashPanelMiddleware,
134         searchResultsPanelMiddleware,
135         sharedWithMePanelMiddleware,
136         workflowPanelMiddleware,
137         userPanelMiddleware,
138         groupsPanelMiddleware,
139         groupDetailsPanelMiddleware,
140         linkPanelMiddleware,
141         computeNodeMiddleware,
142         apiClientAuthorizationMiddlewareService,
143         publicFavoritesMiddleware,
144         collectionsContentAddress
145     ];
146     const enhancer = composeEnhancers(applyMiddleware(...middlewares));
147     return createStore(rootReducer, enhancer);
148 }
149
150 const createRootReducer = (services: ServiceRepository) => combineReducers({
151     auth: authReducer(services),
152     config: configReducer,
153     collectionPanel: collectionPanelReducer,
154     collectionPanelFiles: collectionPanelFilesReducer,
155     contextMenu: contextMenuReducer,
156     dataExplorer: dataExplorerReducer,
157     detailsPanel: detailsPanelReducer,
158     dialog: dialogReducer,
159     favorites: favoritesReducer,
160     ownerName: ownerNameReducer,
161     publicFavorites: publicFavoritesReducer,
162     form: formReducer,
163     processLogsPanel: processLogsPanelReducer,
164     properties: propertiesReducer,
165     resources: resourcesReducer,
166     resourcesData: resourcesDataReducer,
167     router: routerReducer,
168     snackbar: snackbarReducer,
169     treePicker: treePickerReducer,
170     fileUploader: fileUploaderReducer,
171     processPanel: processPanelReducer,
172     progressIndicator: progressIndicatorReducer,
173     runProcessPanel: runProcessPanelReducer,
174     appInfo: appInfoReducer,
175     searchBar: searchBarReducer,
176     virtualMachines: virtualMachinesReducer,
177     repositories: repositoriesReducer,
178     keepServices: keepServicesReducer,
179     linkAccountPanel: linkAccountPanelReducer
180 });