fix(catalog): уберём cache-touch после Delete — просто navigate

Предыдущий фикс с 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 <noreply@anthropic.com>
This commit is contained in:
nns 2026-05-30 12:45:56 +05:00
parent 61ca7fee90
commit 3cdb819331

View file

@ -184,13 +184,13 @@ export function ProductEditPage() {
const remove = useMutation({ const remove = useMutation({
mutationFn: async () => { await api.delete(`/api/catalog/products/${id}`) }, mutationFn: async () => { await api.delete(`/api/catalog/products/${id}`) },
onSuccess: () => { onSuccess: () => {
// Сначала навигируемся ПРОЧЬ с edit-страницы (иначе оставшийся // Просто navigate — компонент размонтируется, useQuery cleanup'нёт
// useQuery(['/api/catalog/products', id]) после invalidate refetch'нёт // подписку, мы НЕ дёргаем invalidate/removeQueries: они бы стриггерили
// удалённый id и Toaster покажет «Не найдено» поверх редиректа). Затем // refetch на уже удалённый id (active subscriber на момент срабатывания)
// выкидываем item-кеш и обновляем список. // и Toaster показал бы «Не найдено» поверх редиректа.
// На /catalog/products fresh fetch list-query сам подгрузит актуальный
// список без удалённой записи.
navigate('/catalog/products') navigate('/catalog/products')
qc.removeQueries({ queryKey: ['/api/catalog/products', id] })
qc.invalidateQueries({ queryKey: ['/api/catalog/products'], exact: true })
}, },
meta: { successMessage: 'Удалено' }, meta: { successMessage: 'Удалено' },
}) })