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