From b9c96f8c76ab61d9345de8e8022050ac34a95943 Mon Sep 17 00:00:00 2001 From: Ivan <8611739+IRBorisov@users.noreply.github.com> Date: Tue, 4 Feb 2025 23:55:48 +0300 Subject: [PATCH] B: Add timeout for cache invalidation after schema delete --- rsconcept/frontend/src/backend/apiTransport.ts | 7 +++++-- .../src/backend/library/useDeleteItem.tsx | 17 ++++++++++------- .../src/pages/OssPage/OssEditContext.tsx | 10 +++++++++- .../src/pages/RSFormPage/RSEditContext.tsx | 6 ++++++ rsconcept/frontend/src/utils/constants.ts | 1 + 5 files changed, 31 insertions(+), 10 deletions(-) diff --git a/rsconcept/frontend/src/backend/apiTransport.ts b/rsconcept/frontend/src/backend/apiTransport.ts index 12b8b89a..122c29fb 100644 --- a/rsconcept/frontend/src/backend/apiTransport.ts +++ b/rsconcept/frontend/src/backend/apiTransport.ts @@ -53,8 +53,11 @@ export function axiosGet({ endpoint, options }: IAxiosGetRequest) .get(endpoint, options) .then(response => response.data) .catch((error: Error | AxiosError) => { - toast.error(extractErrorMessage(error)); - console.error(error); + if (error.name !== 'CanceledError') { + // Note: Ignore cancellation errors + toast.error(extractErrorMessage(error)); + console.error(error); + } throw error; }); } diff --git a/rsconcept/frontend/src/backend/library/useDeleteItem.tsx b/rsconcept/frontend/src/backend/library/useDeleteItem.tsx index be09a490..bdd0623a 100644 --- a/rsconcept/frontend/src/backend/library/useDeleteItem.tsx +++ b/rsconcept/frontend/src/backend/library/useDeleteItem.tsx @@ -2,7 +2,8 @@ import { useMutation, useQueryClient } from '@tanstack/react-query'; import { ossApi } from '@/backend/oss/api'; import { rsformsApi } from '@/backend/rsform/api'; -import { ILibraryItem, LibraryItemID } from '@/models/library'; +import { LibraryItemID } from '@/models/library'; +import { PARAMETER } from '@/utils/constants'; import { libraryApi } from './api'; @@ -12,13 +13,15 @@ export const useDeleteItem = () => { mutationKey: [libraryApi.baseKey, 'delete-item'], mutationFn: libraryApi.deleteItem, onSuccess: (_, variables) => { - client.setQueryData(libraryApi.libraryListKey, (prev: ILibraryItem[] | undefined) => - prev?.filter(item => item.id !== variables) + client.invalidateQueries({ queryKey: libraryApi.libraryListKey }).catch(console.error); + setTimeout( + () => + void Promise.allSettled([ + client.invalidateQueries({ queryKey: [ossApi.baseKey] }), + client.invalidateQueries({ queryKey: rsformsApi.getRSFormQueryOptions({ itemID: variables }).queryKey }) + ]).catch(console.error), + PARAMETER.navigationDuration ); - return Promise.allSettled([ - client.invalidateQueries({ queryKey: [ossApi.baseKey] }), - client.invalidateQueries({ queryKey: rsformsApi.getRSFormQueryOptions({ itemID: variables }).queryKey }) - ]); } }); return { diff --git a/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx b/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx index b584865a..160ecdc8 100644 --- a/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx +++ b/rsconcept/frontend/src/pages/OssPage/OssEditContext.tsx @@ -19,6 +19,7 @@ import { IOperationPosition, IOperationSchema, OperationID, OperationType } from import { UserRole } from '@/models/user'; import { RSTabID } from '@/pages/RSFormPage/RSEditContext'; import { useDialogsStore } from '@/stores/dialogs'; +import { useLibrarySearchStore } from '@/stores/librarySearch'; import { usePreferencesStore } from '@/stores/preferences'; import { useRoleStore } from '@/stores/role'; import { PARAMETER } from '@/utils/constants'; @@ -81,6 +82,8 @@ export const OssEditState = ({ itemID, children }: React.PropsWithChildren state.role); const adjustRole = useRoleStore(state => state.adjustRole); + const setSearchLocation = useLibrarySearchStore(state => state.setLocation); + const searchLocation = useLibrarySearchStore(state => state.location); const { user } = useAuthSuspense(); const { schema } = useOssSuspense({ itemID: itemID }); @@ -139,7 +142,12 @@ export const OssEditState = ({ itemID, children }: React.PropsWithChildren router.push(urls.library)); + deleteItem(schema.id, () => { + if (searchLocation === schema.location) { + setSearchLocation(''); + } + router.push(urls.library); + }); } function promptCreateOperation({ defaultX, defaultY, inputs, positions, callback }: ICreateOperationPrompt) { diff --git a/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx b/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx index 05718d39..d0e59c91 100644 --- a/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx +++ b/rsconcept/frontend/src/pages/RSFormPage/RSEditContext.tsx @@ -16,6 +16,7 @@ import { ConstituentaID, CstType, IConstituenta, IRSForm } from '@/models/rsform import { generateAlias } from '@/models/rsformAPI'; import { UserRole } from '@/models/user'; import { useDialogsStore } from '@/stores/dialogs'; +import { useLibrarySearchStore } from '@/stores/librarySearch'; import { useModificationStore } from '@/stores/modification'; import { usePreferencesStore } from '@/stores/preferences'; import { useRoleStore } from '@/stores/role'; @@ -91,6 +92,8 @@ export const RSEditState = ({ const adminMode = usePreferencesStore(state => state.adminMode); const role = useRoleStore(state => state.role); const adjustRole = useRoleStore(state => state.adjustRole); + const setSearchLocation = useLibrarySearchStore(state => state.setLocation); + const searchLocation = useLibrarySearchStore(state => state.location); const { user } = useAuthSuspense(); const { schema } = useRSFormSuspense({ itemID: itemID, version: activeVersion }); @@ -175,6 +178,9 @@ export const RSEditState = ({ if (ossID) { router.push(urls.oss(ossID, OssTabID.GRAPH)); } else { + if (searchLocation === schema.location) { + setSearchLocation(''); + } router.push(urls.library); } }); diff --git a/rsconcept/frontend/src/utils/constants.ts b/rsconcept/frontend/src/utils/constants.ts index ba7fd4b8..03be0cd8 100644 --- a/rsconcept/frontend/src/utils/constants.ts +++ b/rsconcept/frontend/src/utils/constants.ts @@ -11,6 +11,7 @@ export const PARAMETER = { refreshTimeout: 100, // milliseconds delay for post-refresh actions minimalTimeout: 10, // milliseconds delay for fast updates zoomDuration: 500, // milliseconds animation duration + navigationDuration: 300, // milliseconds navigation duration ossImageWidth: 1280, // pixels - size of OSS image ossImageHeight: 960, // pixels - size of OSS image