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