18559: Fix group detail refresh bug
[arvados-workbench2.git] / src / store / data-explorer / data-explorer-middleware.ts
index f90f9a6ce39d1ceddff638959544d1ec24c1d06c..efe51fe3740e73c368e077ee2d0ca0db707b6433 100644 (file)
@@ -3,8 +3,12 @@
 //
 // 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 => {
@@ -20,24 +24,54 @@ export const dataExplorerMiddleware = (service: DataExplorerMiddlewareService):
             };
         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_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<any>(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)
         });