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