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