X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/5b38ed263a3efd88a215c0911dc969303001645c..5eac24f1c4aca6227b9ead85a075315e98e4fc24:/src/store/data-explorer/data-explorer-middleware.ts diff --git a/src/store/data-explorer/data-explorer-middleware.ts b/src/store/data-explorer/data-explorer-middleware.ts index 146867c3..cc9c1a72 100644 --- a/src/store/data-explorer/data-explorer-middleware.ts +++ b/src/store/data-explorer/data-explorer-middleware.ts @@ -3,40 +3,75 @@ // // SPDX-License-Identifier: AGPL-3.0 +import { Dispatch } from 'redux'; +import { RootState } from '~/store/store'; +import { ServiceRepository } from '~/services/services'; import { Middleware } from "redux"; -import { dataExplorerActions, bindDataExplorerActions } from "./data-explorer-action"; +import { dataExplorerActions, bindDataExplorerActions, DataTableRequestState } from "./data-explorer-action"; +import { getDataExplorer } from "./data-explorer-reducer"; import { DataExplorerMiddlewareService } from "./data-explorer-middleware-service"; export const dataExplorerMiddleware = (service: DataExplorerMiddlewareService): Middleware => api => next => { - const handleAction = (handler: (data: T) => void) => - (data: T) => { - if (data.id === service.getId()) { - handler(data); - } - }; const actions = bindDataExplorerActions(service.getId()); return action => { + const handleAction = (handler: (data: T) => void) => + (data: T) => { + next(action); + if (data.id === service.getId()) { + handler(data); + } + }; dataExplorerActions.match(action, { SET_PAGE: handleAction(() => { - api.dispatch(actions.REQUEST_ITEMS()); + api.dispatch(actions.REQUEST_ITEMS(false)); }), SET_ROWS_PER_PAGE: handleAction(() => { - api.dispatch(actions.REQUEST_ITEMS()); + api.dispatch(actions.REQUEST_ITEMS(true)); }), SET_FILTERS: handleAction(() => { api.dispatch(actions.RESET_PAGINATION()); - api.dispatch(actions.REQUEST_ITEMS()); + api.dispatch(actions.REQUEST_ITEMS(true)); }), TOGGLE_SORT: handleAction(() => { - api.dispatch(actions.REQUEST_ITEMS()); + api.dispatch(actions.REQUEST_ITEMS(true)); }), - SET_SEARCH_VALUE: handleAction(() => { + SET_EXPLORER_SEARCH_VALUE: handleAction(() => { api.dispatch(actions.RESET_PAGINATION()); - api.dispatch(actions.REQUEST_ITEMS()); + api.dispatch(actions.REQUEST_ITEMS(true)); }), - REQUEST_ITEMS: handleAction(() => { - service.requestItems(api); + REQUEST_ITEMS: handleAction(({ criteriaChanged }) => { + api.dispatch(async (dispatch: Dispatch, getState: () => RootState, services: ServiceRepository) => { + while (true) { + let de = getDataExplorer(getState().dataExplorer, service.getId()); + switch (de.requestState) { + case DataTableRequestState.IDLE: + // Start a new request. + try { + dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.PENDING })); + await service.requestItems(api, criteriaChanged); + } catch { + dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.NEED_REFRESH })); + } + // Now check if the state is still PENDING, if it moved to NEED_REFRESH + // then we need to reissue requestItems + de = getDataExplorer(getState().dataExplorer, service.getId()); + const complete = (de.requestState === DataTableRequestState.PENDING); + dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.IDLE })); + if (complete) { + return; + } + break; + case DataTableRequestState.PENDING: + // State is PENDING, move it to NEED_REFRESH so that when the current request finishes it starts a new one. + dispatch(actions.SET_REQUEST_STATE({ requestState: DataTableRequestState.NEED_REFRESH })); + return; + case DataTableRequestState.NEED_REFRESH: + // Nothing to do right now. + return; + } + } + }); }), default: () => next(action) });