15856: Merge branch 'master' into 15856-illegal-chars-warning
[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 { 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
69 const composeEnhancers =
70     (process.env.NODE_ENV === 'development' &&
71         window && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ &&
72         window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true, traceLimit: 25 })) ||
73     compose;
74
75 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
76
77 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
78
79 export function configureStore(history: History, services: ServiceRepository): RootStore {
80     const rootReducer = createRootReducer(services);
81
82     const projectPanelMiddleware = dataExplorerMiddleware(
83         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
84     );
85     const favoritePanelMiddleware = dataExplorerMiddleware(
86         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
87     );
88     const trashPanelMiddleware = dataExplorerMiddleware(
89         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
90     );
91     const searchResultsPanelMiddleware = dataExplorerMiddleware(
92         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
93     );
94     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
95         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
96     );
97     const workflowPanelMiddleware = dataExplorerMiddleware(
98         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
99     );
100     const userPanelMiddleware = dataExplorerMiddleware(
101         new UserMiddlewareService(services, USERS_PANEL_ID)
102     );
103     const groupsPanelMiddleware = dataExplorerMiddleware(
104         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
105     );
106     const groupDetailsPanelMiddleware = dataExplorerMiddleware(
107         new GroupDetailsPanelMiddlewareService(services, GROUP_DETAILS_PANEL_ID)
108     );
109     const linkPanelMiddleware = dataExplorerMiddleware(
110         new LinkMiddlewareService(services, LINK_PANEL_ID)
111     );
112     const computeNodeMiddleware = dataExplorerMiddleware(
113         new ComputeNodeMiddlewareService(services, COMPUTE_NODE_PANEL_ID)
114     );
115     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
116         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
117     );
118     const publicFavoritesMiddleware = dataExplorerMiddleware(
119         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
120     );
121     const collectionsContentAddress = dataExplorerMiddleware(
122         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
123     );
124
125     const middlewares: Middleware[] = [
126         routerMiddleware(history),
127         thunkMiddleware.withExtraArgument(services),
128         projectPanelMiddleware,
129         favoritePanelMiddleware,
130         trashPanelMiddleware,
131         searchResultsPanelMiddleware,
132         sharedWithMePanelMiddleware,
133         workflowPanelMiddleware,
134         userPanelMiddleware,
135         groupsPanelMiddleware,
136         groupDetailsPanelMiddleware,
137         linkPanelMiddleware,
138         computeNodeMiddleware,
139         apiClientAuthorizationMiddlewareService,
140         publicFavoritesMiddleware,
141         collectionsContentAddress
142     ];
143     const enhancer = composeEnhancers(applyMiddleware(...middlewares));
144     return createStore(rootReducer, enhancer);
145 }
146
147 const createRootReducer = (services: ServiceRepository) => combineReducers({
148     auth: authReducer(services),
149     config: configReducer,
150     collectionPanel: collectionPanelReducer,
151     collectionPanelFiles: collectionPanelFilesReducer,
152     contextMenu: contextMenuReducer,
153     dataExplorer: dataExplorerReducer,
154     detailsPanel: detailsPanelReducer,
155     dialog: dialogReducer,
156     favorites: favoritesReducer,
157     ownerName: ownerNameReducer,
158     publicFavorites: publicFavoritesReducer,
159     form: formReducer,
160     processLogsPanel: processLogsPanelReducer,
161     properties: propertiesReducer,
162     resources: resourcesReducer,
163     router: routerReducer,
164     snackbar: snackbarReducer,
165     treePicker: treePickerReducer,
166     fileUploader: fileUploaderReducer,
167     processPanel: processPanelReducer,
168     progressIndicator: progressIndicatorReducer,
169     runProcessPanel: runProcessPanelReducer,
170     appInfo: appInfoReducer,
171     searchBar: searchBarReducer,
172     virtualMachines: virtualMachinesReducer,
173     repositories: repositoriesReducer,
174     keepServices: keepServicesReducer,
175     linkAccountPanel: linkAccountPanelReducer
176 });