From 3cdb819331fc1a964e144694d50eb143d0900d99 Mon Sep 17 00:00:00 2001 From: nns Date: Sat, 30 May 2026 12:45:56 +0500 Subject: [PATCH] =?UTF-8?q?fix(catalog):=20=D1=83=D0=B1=D0=B5=D1=80=D1=91?= =?UTF-8?q?=D0=BC=20cache-touch=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=20Delete?= =?UTF-8?q?=20=E2=80=94=20=D0=BF=D1=80=D0=BE=D1=81=D1=82=D0=BE=20navigate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Предыдущий фикс с qc.removeQueries({queryKey:['/api/catalog/products', id]}) + invalidateQueries(exact:true) — оказался не до конца верным: 1) removeQueries на ещё-mounted ProductEditPage с активной подпиской на этот key триггерит refetch (TanStack заполняет пустой cache на active subscriber). 2) invalidateQueries({queryKey:['/api/catalog/products'], exact:true}) на самом деле не матчит ни list (ключ имеет 6 элементов с пагинацией), ни item (ключ из 2 элементов) — exact=true ищет ровно [...] из 1 элемента. Правильно: просто navigate('/catalog/products'). React Query refetchOnMount сам обновит list при заходе на ProductsPage (staleTime=0 default). Co-Authored-By: Claude Opus 4.7 --- src/food-market.web/src/pages/ProductEditPage.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/food-market.web/src/pages/ProductEditPage.tsx b/src/food-market.web/src/pages/ProductEditPage.tsx index 1406470..84baef7 100644 --- a/src/food-market.web/src/pages/ProductEditPage.tsx +++ b/src/food-market.web/src/pages/ProductEditPage.tsx @@ -184,13 +184,13 @@ export function ProductEditPage() { const remove = useMutation({ mutationFn: async () => { await api.delete(`/api/catalog/products/${id}`) }, onSuccess: () => { - // Сначала навигируемся ПРОЧЬ с edit-страницы (иначе оставшийся - // useQuery(['/api/catalog/products', id]) после invalidate refetch'нёт - // удалённый id и Toaster покажет «Не найдено» поверх редиректа). Затем - // выкидываем item-кеш и обновляем список. + // Просто navigate — компонент размонтируется, useQuery cleanup'нёт + // подписку, мы НЕ дёргаем invalidate/removeQueries: они бы стриггерили + // refetch на уже удалённый id (active subscriber на момент срабатывания) + // и Toaster показал бы «Не найдено» поверх редиректа. + // На /catalog/products fresh fetch list-query сам подгрузит актуальный + // список без удалённой записи. navigate('/catalog/products') - qc.removeQueries({ queryKey: ['/api/catalog/products', id] }) - qc.invalidateQueries({ queryKey: ['/api/catalog/products'], exact: true }) }, meta: { successMessage: 'Удалено' }, })