18874: Merge commit '6f8dcb2b13f3058db656908fb26b09e23b527f08' into 18874-merge-wb2
[arvados.git] / services / workbench2 / 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, 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 import { handleRedirects } from '../common/redirect-to';
10
11 import { authReducer } from "./auth/auth-reducer";
12 import { authMiddleware } from "./auth/auth-middleware";
13 import { dataExplorerReducer } from './data-explorer/data-explorer-reducer';
14 import { detailsPanelReducer } from './details-panel/details-panel-reducer';
15 import { contextMenuReducer } from './context-menu/context-menu-reducer';
16 import { reducer as formReducer } from 'redux-form';
17 import { favoritesReducer } from './favorites/favorites-reducer';
18 import { snackbarReducer } from './snackbar/snackbar-reducer';
19 import { collectionPanelFilesReducer } from './collection-panel/collection-panel-files/collection-panel-files-reducer';
20 import { dataExplorerMiddleware } from "./data-explorer/data-explorer-middleware";
21 import { FAVORITE_PANEL_ID } from "./favorite-panel/favorite-panel-action";
22 import { PROJECT_PANEL_ID } from "./project-panel/project-panel-action";
23 import { ProjectPanelMiddlewareService } from "./project-panel/project-panel-middleware-service";
24 import { FavoritePanelMiddlewareService } from "./favorite-panel/favorite-panel-middleware-service";
25 import { AllProcessesPanelMiddlewareService } from "./all-processes-panel/all-processes-panel-middleware-service";
26 import { collectionPanelReducer } from './collection-panel/collection-panel-reducer';
27 import { dialogReducer } from './dialog/dialog-reducer';
28 import { ServiceRepository } from "services/services";
29 import { treePickerReducer, treePickerSearchReducer } from './tree-picker/tree-picker-reducer';
30 import { treePickerSearchMiddleware } from './tree-picker/tree-picker-middleware';
31 import { resourcesReducer } from 'store/resources/resources-reducer';
32 import { propertiesReducer } from './properties/properties-reducer';
33 import { fileUploaderReducer } from './file-uploader/file-uploader-reducer';
34 import { TrashPanelMiddlewareService } from "store/trash-panel/trash-panel-middleware-service";
35 import { TRASH_PANEL_ID } from "store/trash-panel/trash-panel-action";
36 import { processLogsPanelReducer } from './process-logs-panel/process-logs-panel-reducer';
37 import { processPanelReducer } from 'store/process-panel/process-panel-reducer';
38 import { SHARED_WITH_ME_PANEL_ID } from 'store/shared-with-me-panel/shared-with-me-panel-actions';
39 import { SharedWithMeMiddlewareService } from './shared-with-me-panel/shared-with-me-middleware-service';
40 import { progressIndicatorReducer } from './progress-indicator/progress-indicator-reducer';
41 import { runProcessPanelReducer } from 'store/run-process-panel/run-process-panel-reducer';
42 import { WorkflowMiddlewareService } from './workflow-panel/workflow-middleware-service';
43 import { WORKFLOW_PANEL_ID } from './workflow-panel/workflow-panel-actions';
44 import { appInfoReducer } from 'store/app-info/app-info-reducer';
45 import { searchBarReducer } from './search-bar/search-bar-reducer';
46 import { SEARCH_RESULTS_PANEL_ID } from 'store/search-results-panel/search-results-panel-actions';
47 import { SearchResultsMiddlewareService } from './search-results-panel/search-results-middleware-service';
48 import { virtualMachinesReducer } from "store/virtual-machines/virtual-machines-reducer";
49 import { repositoriesReducer } from 'store/repositories/repositories-reducer';
50 import { keepServicesReducer } from 'store/keep-services/keep-services-reducer';
51 import { UserMiddlewareService } from 'store/users/user-panel-middleware-service';
52 import { USERS_PANEL_ID } from 'store/users/users-actions';
53 import { UserProfileGroupsMiddlewareService } from 'store/user-profile/user-profile-groups-middleware-service';
54 import { USER_PROFILE_PANEL_ID } from 'store/user-profile/user-profile-actions'
55 import { GroupsPanelMiddlewareService } from 'store/groups-panel/groups-panel-middleware-service';
56 import { GROUPS_PANEL_ID } from 'store/groups-panel/groups-panel-actions';
57 import { GroupDetailsPanelMembersMiddlewareService } from 'store/group-details-panel/group-details-panel-members-middleware-service';
58 import { GroupDetailsPanelPermissionsMiddlewareService } from 'store/group-details-panel/group-details-panel-permissions-middleware-service';
59 import { GROUP_DETAILS_MEMBERS_PANEL_ID, GROUP_DETAILS_PERMISSIONS_PANEL_ID } from 'store/group-details-panel/group-details-panel-actions';
60 import { LINK_PANEL_ID } from 'store/link-panel/link-panel-actions';
61 import { LinkMiddlewareService } from 'store/link-panel/link-panel-middleware-service';
62 import { API_CLIENT_AUTHORIZATION_PANEL_ID } from 'store/api-client-authorizations/api-client-authorizations-actions';
63 import { ApiClientAuthorizationMiddlewareService } from 'store/api-client-authorizations/api-client-authorizations-middleware-service';
64 import { PublicFavoritesMiddlewareService } from 'store/public-favorites-panel/public-favorites-middleware-service';
65 import { PUBLIC_FAVORITE_PANEL_ID } from 'store/public-favorites-panel/public-favorites-action';
66 import { publicFavoritesReducer } from 'store/public-favorites/public-favorites-reducer';
67 import { linkAccountPanelReducer } from './link-account-panel/link-account-panel-reducer';
68 import { CollectionsWithSameContentAddressMiddlewareService } from 'store/collections-content-address-panel/collections-content-address-middleware-service';
69 import { COLLECTIONS_CONTENT_ADDRESS_PANEL_ID } from 'store/collections-content-address-panel/collections-content-address-panel-actions';
70 import { ownerNameReducer } from 'store/owner-name/owner-name-reducer';
71 import { SubprocessMiddlewareService } from 'store/subprocess-panel/subprocess-panel-middleware-service';
72 import { SUBPROCESS_PANEL_ID } from 'store/subprocess-panel/subprocess-panel-actions';
73 import { ALL_PROCESSES_PANEL_ID } from './all-processes-panel/all-processes-panel-action';
74 import { Config } from 'common/config';
75 import { pluginConfig } from 'plugins';
76 import { MiddlewareListReducer } from 'common/plugintypes';
77 import { tooltipsMiddleware } from './tooltips/tooltips-middleware';
78 import { sidePanelReducer } from './side-panel/side-panel-reducer'
79 import { bannerReducer } from './banner/banner-reducer';
80 import { composeWithDevTools } from 'redux-devtools-extension';
81
82 export type RootState = ReturnType<ReturnType<typeof createRootReducer>>;
83
84 export type RootStore = Store<RootState, Action> & { dispatch: Dispatch<any> };
85
86 export function configureStore(history: History, services: ServiceRepository, config: Config): RootStore {
87     const rootReducer = createRootReducer(services);
88
89     const projectPanelMiddleware = dataExplorerMiddleware(
90         new ProjectPanelMiddlewareService(services, PROJECT_PANEL_ID)
91     );
92     const favoritePanelMiddleware = dataExplorerMiddleware(
93         new FavoritePanelMiddlewareService(services, FAVORITE_PANEL_ID)
94     );
95     const allProcessessPanelMiddleware = dataExplorerMiddleware(
96         new AllProcessesPanelMiddlewareService(services, ALL_PROCESSES_PANEL_ID)
97     );
98     const trashPanelMiddleware = dataExplorerMiddleware(
99         new TrashPanelMiddlewareService(services, TRASH_PANEL_ID)
100     );
101     const searchResultsPanelMiddleware = dataExplorerMiddleware(
102         new SearchResultsMiddlewareService(services, SEARCH_RESULTS_PANEL_ID)
103     );
104     const sharedWithMePanelMiddleware = dataExplorerMiddleware(
105         new SharedWithMeMiddlewareService(services, SHARED_WITH_ME_PANEL_ID)
106     );
107     const workflowPanelMiddleware = dataExplorerMiddleware(
108         new WorkflowMiddlewareService(services, WORKFLOW_PANEL_ID)
109     );
110     const userPanelMiddleware = dataExplorerMiddleware(
111         new UserMiddlewareService(services, USERS_PANEL_ID)
112     );
113     const userProfileGroupsMiddleware = dataExplorerMiddleware(
114         new UserProfileGroupsMiddlewareService(services, USER_PROFILE_PANEL_ID)
115     );
116     const groupsPanelMiddleware = dataExplorerMiddleware(
117         new GroupsPanelMiddlewareService(services, GROUPS_PANEL_ID)
118     );
119     const groupDetailsPanelMembersMiddleware = dataExplorerMiddleware(
120         new GroupDetailsPanelMembersMiddlewareService(services, GROUP_DETAILS_MEMBERS_PANEL_ID)
121     );
122     const groupDetailsPanelPermissionsMiddleware = dataExplorerMiddleware(
123         new GroupDetailsPanelPermissionsMiddlewareService(services, GROUP_DETAILS_PERMISSIONS_PANEL_ID)
124     );
125     const linkPanelMiddleware = dataExplorerMiddleware(
126         new LinkMiddlewareService(services, LINK_PANEL_ID)
127     );
128     const apiClientAuthorizationMiddlewareService = dataExplorerMiddleware(
129         new ApiClientAuthorizationMiddlewareService(services, API_CLIENT_AUTHORIZATION_PANEL_ID)
130     );
131     const publicFavoritesMiddleware = dataExplorerMiddleware(
132         new PublicFavoritesMiddlewareService(services, PUBLIC_FAVORITE_PANEL_ID)
133     );
134     const collectionsContentAddress = dataExplorerMiddleware(
135         new CollectionsWithSameContentAddressMiddlewareService(services, COLLECTIONS_CONTENT_ADDRESS_PANEL_ID)
136     );
137     const subprocessMiddleware = dataExplorerMiddleware(
138         new SubprocessMiddlewareService(services, SUBPROCESS_PANEL_ID)
139     );
140     const redirectToMiddleware = (store: any) => (next: any) => (action: any) => {
141         const state = store.getState();
142
143         if (state.auth && state.auth.apiToken) {
144             handleRedirects(state.auth.apiToken, config);
145         }
146
147         return next(action);
148     };
149
150     let middlewares: Middleware[] = [
151         routerMiddleware(history),
152         thunkMiddleware.withExtraArgument(services),
153         authMiddleware(services),
154         tooltipsMiddleware(services),
155         projectPanelMiddleware,
156         favoritePanelMiddleware,
157         allProcessessPanelMiddleware,
158         trashPanelMiddleware,
159         searchResultsPanelMiddleware,
160         sharedWithMePanelMiddleware,
161         workflowPanelMiddleware,
162         userPanelMiddleware,
163         userProfileGroupsMiddleware,
164         groupsPanelMiddleware,
165         groupDetailsPanelMembersMiddleware,
166         groupDetailsPanelPermissionsMiddleware,
167         linkPanelMiddleware,
168         apiClientAuthorizationMiddlewareService,
169         publicFavoritesMiddleware,
170         collectionsContentAddress,
171         subprocessMiddleware,
172         treePickerSearchMiddleware
173     ];
174
175     const reduceMiddlewaresFn: (a: Middleware[],
176         b: MiddlewareListReducer) => Middleware[] = (a, b) => b(a, services);
177
178     middlewares = pluginConfig.middlewares.reduce(reduceMiddlewaresFn, middlewares);
179
180     const enhancer = composeWithDevTools({/* options */ })(applyMiddleware(redirectToMiddleware, ...middlewares));
181     return createStore(rootReducer, enhancer);
182 }
183
184 const createRootReducer = (services: ServiceRepository) => combineReducers({
185     auth: authReducer(services),
186     banner: bannerReducer,
187     collectionPanel: collectionPanelReducer,
188     collectionPanelFiles: collectionPanelFilesReducer,
189     contextMenu: contextMenuReducer,
190     dataExplorer: dataExplorerReducer,
191     detailsPanel: detailsPanelReducer,
192     dialog: dialogReducer,
193     favorites: favoritesReducer,
194     ownerName: ownerNameReducer,
195     publicFavorites: publicFavoritesReducer,
196     form: formReducer,
197     processLogsPanel: processLogsPanelReducer,
198     properties: propertiesReducer,
199     resources: resourcesReducer,
200     router: routerReducer,
201     snackbar: snackbarReducer,
202     treePicker: treePickerReducer,
203     treePickerSearch: treePickerSearchReducer,
204     fileUploader: fileUploaderReducer,
205     processPanel: processPanelReducer,
206     progressIndicator: progressIndicatorReducer,
207     runProcessPanel: runProcessPanelReducer,
208     appInfo: appInfoReducer,
209     searchBar: searchBarReducer,
210     virtualMachines: virtualMachinesReducer,
211     repositories: repositoriesReducer,
212     keepServices: keepServicesReducer,
213     linkAccountPanel: linkAccountPanelReducer,
214     sidePanel: sidePanelReducer
215 });