Merge branch '19051-handle-quotes-in-search' into main
[arvados-workbench2.git] / src / store / progress-indicator / progress-indicator-reducer.ts
index 190ad13f54b40a3494ae29b69747f9a58481ec75..67a06b8e65942c18ee1222c8a7032caf03887e28 100644 (file)
@@ -2,26 +2,39 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { ProgressIndicatorAction, progressIndicatorActions } from "~/store/progress-indicator/progress-indicator-actions";
+import { ProgressIndicatorAction, progressIndicatorActions } from "store/progress-indicator/progress-indicator-actions";
 
-export interface ProgressIndicatorState {
-    [key: string]: {
-        working: boolean
-    };
-}
+export type ProgressIndicatorState = { id: string, working: boolean }[];
 
-const initialState: ProgressIndicatorState = {
-};
+const initialState: ProgressIndicatorState = [];
 
 export const progressIndicatorReducer = (state: ProgressIndicatorState = initialState, action: ProgressIndicatorAction) => {
+    const stopWorking = (id: string) => state.filter(p => p.id !== id);
+
     return progressIndicatorActions.match(action, {
-        START: id => ({ ...state, [id]: { working: true } }),
-        STOP: id => ({ ...state, [id]: { working: false } }),
-        TOGGLE: ({ id, working }) => ({ ...state, [id]: { working }}),
+        START_WORKING: id => startWorking(id, state),
+        STOP_WORKING: id => stopWorking(id),
+        PERSIST_STOP_WORKING: id => state.map(p => ({
+            ...p,
+            working: p.id === id ? false : p.working
+        })),
+        TOGGLE_WORKING: ({ id, working }) => working ? startWorking(id, state) : stopWorking(id),
         default: () => state,
     });
 };
 
+const startWorking = (id: string, state: ProgressIndicatorState) => {
+    return getProgressIndicator(id)(state)
+        ? state.map(indicator => indicator.id === id
+            ? { ...indicator, working: true }
+            : indicator)
+        : state.concat({ id, working: true });
+};
+
 export function isSystemWorking(state: ProgressIndicatorState): boolean {
-    return Object.keys(state).reduce((working, k) => working ? true : state[k].working, false);
+    return state.length > 0 && state.reduce((working, p) => working ? true : p.working, false);
 }
+
+export const getProgressIndicator = (id: string) =>
+    (state: ProgressIndicatorState) =>
+        state.find(state => state.id === id);