X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/54e859c204c3952a8eaf96d2145dfa96c199b934..7e31618f7fdc51d797a3bf22524731168de68553:/src/routes/route-change-handlers.ts diff --git a/src/routes/route-change-handlers.ts b/src/routes/route-change-handlers.ts index ef9e9ebc..ee48e6da 100644 --- a/src/routes/route-change-handlers.ts +++ b/src/routes/route-change-handlers.ts @@ -3,11 +3,16 @@ // SPDX-License-Identifier: AGPL-3.0 import { History, Location } from 'history'; +import { match } from 'react-router-dom'; +import { Dispatch } from 'redux'; +import { ThunkAction } from 'redux-thunk'; import { RootStore } from '~/store/store'; -import { matchProcessRoute, matchProcessLogRoute, matchProjectRoute, matchCollectionRoute, matchFavoritesRoute, matchTrashRoute, matchRootRoute, matchSharedWithMeRoute, matchRunProcessRoute, matchWorkflowRoute, matchSearchResultsRoute } from './routes'; -import { loadProject, loadCollection, loadFavorites, loadTrash, loadProcess, loadProcessLog } from '~/store/workbench/workbench-actions'; +import * as R from '~/routes/routes'; +import * as WA from '~/store/workbench/workbench-actions'; import { navigateToRootProject } from '~/store/navigation/navigation-action'; -import { loadSharedWithMe, loadRunProcess, loadWorkflow, loadSearchResults } from '~//store/workbench/workbench-actions'; +import { dialogActions } from '~/store/dialog/dialog-actions'; +import { contextMenuActions } from '~/store/context-menu/context-menu-actions'; +import { searchBarActions } from '~/store/search-bar/search-bar-actions'; export const addRouteChangeHandlers = (history: History, store: RootStore) => { const handler = handleLocationChange(store); @@ -16,39 +21,155 @@ export const addRouteChangeHandlers = (history: History, store: RootStore) => { }; const handleLocationChange = (store: RootStore) => ({ pathname }: Location) => { - const rootMatch = matchRootRoute(pathname); - const projectMatch = matchProjectRoute(pathname); - const collectionMatch = matchCollectionRoute(pathname); - const favoriteMatch = matchFavoritesRoute(pathname); - const trashMatch = matchTrashRoute(pathname); - const processMatch = matchProcessRoute(pathname); - const processLogMatch = matchProcessLogRoute(pathname); - const searchResultsMatch = matchSearchResultsRoute(pathname); - const sharedWithMeMatch = matchSharedWithMeRoute(pathname); - const runProcessMatch = matchRunProcessRoute(pathname); - const workflowMatch = matchWorkflowRoute(pathname); - - if (projectMatch) { - store.dispatch(loadProject(projectMatch.params.id)); - } else if (collectionMatch) { - store.dispatch(loadCollection(collectionMatch.params.id)); - } else if (favoriteMatch) { - store.dispatch(loadFavorites()); - } else if (trashMatch) { - store.dispatch(loadTrash()); - } else if (processMatch) { - store.dispatch(loadProcess(processMatch.params.id)); - } else if (processLogMatch) { - store.dispatch(loadProcessLog(processLogMatch.params.id)); - } else if (rootMatch) { - store.dispatch(navigateToRootProject); - } else if (sharedWithMeMatch) { - store.dispatch(loadSharedWithMe); - } else if (runProcessMatch) { - store.dispatch(loadRunProcess); - } else if (workflowMatch) { - store.dispatch(loadWorkflow); - } else if (searchResultsMatch) { - store.dispatch(loadSearchResults); - } + + store.dispatch(dialogActions.CLOSE_ALL_DIALOGS()); + store.dispatch(contextMenuActions.CLOSE_CONTEXT_MENU()); + store.dispatch(searchBarActions.CLOSE_SEARCH_VIEW()); + + locationChangeHandlers.find(handler => handler(store.dispatch, pathname)); + }; + +type MatchRoute = (route: string) => match | null; +type ActionCreator = (params: Params) => void; + +const handle = (matchRoute: MatchRoute, actionCreator: ActionCreator) => + (dispatch: Dispatch, route: string) => { + const match = matchRoute(route); + return match + ? ( + dispatch(actionCreator(match.params)), + true + ) + : false; + }; + +const locationChangeHandlers = [ + + handle( + R.matchApiClientAuthorizationsRoute, + () => WA.loadApiClientAuthorizations + ), + + handle( + R.matchCollectionRoute, + ({ id }) => WA.loadCollection(id) + ), + + handle( + R.matchComputeNodesRoute, + () => WA.loadComputeNodes + ), + + handle( + R.matchFavoritesRoute, + () => WA.loadFavorites + ), + + handle( + R.matchGroupDetailsRoute, + ({ id }) => WA.loadGroupDetailsPanel(id) + ), + + handle( + R.matchGroupsRoute, + () => WA.loadGroupsPanel + ), + + handle( + R.matchKeepServicesRoute, + () => WA.loadKeepServices + ), + + handle( + R.matchLinksRoute, + () => WA.loadLinks + ), + + handle( + R.matchMyAccountRoute, + () => WA.loadMyAccount + ), + + handle( + R.matchProcessLogRoute, + ({ id }) => WA.loadProcessLog(id) + ), + + handle( + R.matchProcessRoute, + ({ id }) => WA.loadProcess(id) + ), + + handle( + R.matchProjectRoute, + ({ id }) => WA.loadProject(id) + ), + + handle( + R.matchRepositoriesRoute, + () => WA.loadRepositories + ), + + handle( + R.matchRootRoute, + () => navigateToRootProject + ), + + handle( + R.matchRunProcessRoute, + () => WA.loadRunProcess + ), + + handle( + R.matchSearchResultsRoute, + () => WA.loadSearchResults + ), + + handle( + R.matchSharedWithMeRoute, + () => WA.loadSharedWithMe + ), + + handle( + R.matchSiteManagerRoute, + () => WA.loadSiteManager + ), + + handle( + R.matchSshKeysAdminRoute, + () => WA.loadSshKeys + ), + + handle( + R.matchSshKeysUserRoute, + () => WA.loadSshKeys + ), + + handle( + R.matchTrashRoute, + () => WA.loadTrash + ), + + handle( + R.matchUsersRoute, + () => WA.loadUsers + ), + + handle( + R.matchAdminVirtualMachineRoute, + () => WA.loadVirtualMachines + ), + + handle( + R.matchUserVirtualMachineRoute, + () => WA.loadVirtualMachines + ), + + handle( + R.matchWorkflowRoute, + () => WA.loadWorkflow + ), + +]; +