data-explorer-routing-and-admins-context-menu-for-resources
[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 { configReducer } from "./config/config-reducer";
12 import { dataExplorerReducer } from './data-explorer/data-explorer-reducer';
13 import { detailsPanelReducer } from './details-panel/details-panel-reducer';
14 import { contextMenuReducer } from './context-menu/context-menu-reducer';
15 import { reducer as formReducer } from 'redux-form';
16 import { favoritesReducer } from './favorites/favorites-reducer';
17 import { snackbarReducer } from './snackbar/snackbar-reducer';
18 import { collectionPanelFilesReducer } from './collection-panel/collection-panel-files/collection-panel-files-reducer';
19 import { dataExplorerMiddleware } from "./data-explorer/data-explorer-middleware";
20 import { FAVORITE_PANEL_ID } from "./favorite-panel/favorite-panel-action";
21 import { PROJECT_PANEL_ID } from "./project-panel/project-panel-action";
22 import { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
23 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
24 import { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
25 import { dialogReducer } from './dialog/dialog-reducer';
26 import { ServiceRepository } from "~/services/services";
27 import { treePickerReducer } from './tree-picker/tree-picker-reducer';
28 import { resourcesReducer } from '~/store/resources/resources-reducer';
29 import { propertiesReducer } from './properties/properties-reducer';
30 import { RootState } from './store';
31 import { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
32 import { TrashPanelMiddlewareService } from "~/store/trash-panel/trash-panel-middleware-service";
33 import { TRASH_PANEL_ID } from "~/store/trash-panel/trash-panel-action";
34 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
35 import { processPanelReducer } from '~/store/process-panel/process-panel-reducer';
36 import { SHARED_WITH_ME_PANEL_ID } from '~/store/shared-with-me-panel/shared-with-me-panel-actions';
37 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
38 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
39 import { runProcessPanelReducer } from '~/store/run-process-panel/run-process-panel-reducer';
40 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
41 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
42 import { appInfoReducer } from '~/store/app-info/app-info-reducer';
43 import { searchBarReducer } from './search-bar/search-bar-reducer';
44 import { SEARCH_RESULTS_PANEL_ID } from '~/store/search-results-panel/search-results-panel-actions';
45 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
46 import { resourcesDataReducer } from "~/store/resources-data/resources-data-reducer";
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
65 const composeEnhancers =
66     (process.env.NODE_ENV === 'development' &&
67         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
68         window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
69     compose;
70
71 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
72
73 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
74
75 export function configureStore(history: History, services: ServiceRepository): RootStore {
76     const rootReducer = createRootReducer(services);
77
78     const projectPanelMiddleware = dataExplorerMiddleware(
79         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
80     );
81     const favoritePanelMiddleware = dataExplorerMiddleware(
82         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
83     );
84     const trashPanelMiddleware = dataExplorerMiddleware(
85         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
86     );
87     const searchResultsPanelMiddleware = dataExplorerMiddleware(
88         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
89     );
90     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
91         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
92     );
93     const workflowPanelMiddleware = dataExplorerMiddleware(
94         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
95     );
96     const userPanelMiddleware = dataExplorerMiddleware(
97         new UserMiddlewareService(services, USERS_PANEL_ID)
98     );
99     const groupsPanelMiddleware = dataExplorerMiddleware(
100         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
101     );
102     const groupDetailsPanelMiddleware = dataExplorerMiddleware(
103         new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
104     );
105     const linkPanelMiddleware = dataExplorerMiddleware(
106         new LinkMiddlewareService(services, LINK_PANEL_ID)
107     );
108     const computeNodeMiddleware = dataExplorerMiddleware(
109         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
110     );
111     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
112         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
113     );
114     const publicFavoritesMiddleware = dataExplorerMiddleware(
115         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
116     );
117     const middlewares: Middleware[] = [
118         routerMiddleware(history),
119         thunkMiddleware.withExtraArgument(services),
120         projectPanelMiddleware,
121         favoritePanelMiddleware,
122         trashPanelMiddleware,
123         searchResultsPanelMiddleware,
124         sharedWithMePanelMiddleware,
125         workflowPanelMiddleware,
126         userPanelMiddleware,
127         groupsPanelMiddleware,
128         groupDetailsPanelMiddleware,
129         linkPanelMiddleware,
130         computeNodeMiddleware,
131         apiClientAuthorizationMiddlewareService,
132         publicFavoritesMiddleware
133     ];
134     const enhancer = composeEnhancers(applyMiddleware(...middlewares));
135     return createStore(rootReducer, enhancer);
136 }
137
138 const createRootReducer = (services: ServiceRepository) => combineReducers({
139     auth: authReducer(services),
140     config: configReducer,
141     collectionPanel: collectionPanelReducer,
142     collectionPanelFiles: collectionPanelFilesReducer,
143     contextMenu: contextMenuReducer,
144     dataExplorer: dataExplorerReducer,
145     detailsPanel: detailsPanelReducer,
146     dialog: dialogReducer,
147     favorites: favoritesReducer,
148     form: formReducer,
149     processLogsPanel: processLogsPanelReducer,
150     properties: propertiesReducer,
151     resources: resourcesReducer,
152     resourcesData: resourcesDataReducer,
153     router: routerReducer,
154     snackbar: snackbarReducer,
155     treePicker: treePickerReducer,
156     fileUploader: fileUploaderReducer,
157     processPanel: processPanelReducer,
158     progressIndicator: progressIndicatorReducer,
159     runProcessPanel: runProcessPanelReducer,
160     appInfo: appInfoReducer,
161     searchBar: searchBarReducer,
162     virtualMachines: virtualMachinesReducer,
163     repositories: repositoriesReducer,
164     keepServices: keepServicesReducer
165 });