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