(medium) site-finder/useRecentParcels: «Недавние» не обновляются до 60с после визита (нет инвалидации кэша) #1476

Closed
opened 2026-06-15 05:57:40 +00:00 by bot-backend · 1 comment
Collaborator

Severity: medium · Категория: frontend · Файл: frontend/src/components/site-finder/entry/RecentParcels.tsx:9-10

page.tsx:91-101 — handleParcelOpen пишет визит через addLocalRecentParcel и сразу делает router.push, но не инвалидирует кэш. useRecentParcels (site-finder-api.ts:232-256) имеет staleTime:60_000 и читает localStorage только внутри queryFn (стр.236). Grep подтверждает: invalidateQueries/setQueryData по ['recent-parcels'] отсутствуют во всём src. QueryClient переживает client-side навигацию, поэтому при возврате на /site-finder в течение 60с RecentParcels показывает устаревший снимок без только что открытого участка. Импакт: «История просмотров» врёт ~до минуты для основного сценария; данные в localStorage не теряются (refresh лечит). Чинить: после addLocalRecentParcel вызвать queryClient.invalidateQueries({queryKey:['recent-parcels']}) (или setQueryData с локальным списком), либо снизить staleTime для recent-parcels до 0, либо читать localStorage реактивно вне queryFn.

Почему баг: Нет вызова queryClient.invalidateQueries(['recent-parcels']) или setQueryData после addLocalRecentParcel (grep по page.tsx/RecentParcels.tsx подтверждает отсутствие invalidateQueries/setQueryData). useRecentParcels читает localStorage только при выполнении queryFn, а с staleTime 60с queryFn не перевыполняется при возврате на смонтированный/закэшированный экран. Это рассинхрон состояния (localStorage обновлён, кэш — нет): вторичная фича показывает неверные данные.

Как чинить: После addLocalRecentParcel вызывать queryClient.invalidateQueries({ queryKey: ['recent-parcels'] }) (или оптимистично setQueryData), либо снизить staleTime для recent-parcels до 0, чтобы при ремонтировании список перечитывал localStorage.


deep-audit «армия ботов 2» · verify+harden, confidence 0.78 · unit U102

**Severity:** medium · **Категория:** frontend · **Файл:** `frontend/src/components/site-finder/entry/RecentParcels.tsx:9-10` page.tsx:91-101 — handleParcelOpen пишет визит через addLocalRecentParcel и сразу делает router.push, но не инвалидирует кэш. useRecentParcels (site-finder-api.ts:232-256) имеет staleTime:60_000 и читает localStorage только внутри queryFn (стр.236). Grep подтверждает: invalidateQueries/setQueryData по ['recent-parcels'] отсутствуют во всём src. QueryClient переживает client-side навигацию, поэтому при возврате на /site-finder в течение 60с RecentParcels показывает устаревший снимок без только что открытого участка. Импакт: «История просмотров» врёт ~до минуты для основного сценария; данные в localStorage не теряются (refresh лечит). Чинить: после addLocalRecentParcel вызвать queryClient.invalidateQueries({queryKey:['recent-parcels']}) (или setQueryData с локальным списком), либо снизить staleTime для recent-parcels до 0, либо читать localStorage реактивно вне queryFn. **Почему баг:** Нет вызова queryClient.invalidateQueries(['recent-parcels']) или setQueryData после addLocalRecentParcel (grep по page.tsx/RecentParcels.tsx подтверждает отсутствие invalidateQueries/setQueryData). useRecentParcels читает localStorage только при выполнении queryFn, а с staleTime 60с queryFn не перевыполняется при возврате на смонтированный/закэшированный экран. Это рассинхрон состояния (localStorage обновлён, кэш — нет): вторичная фича показывает неверные данные. **Как чинить:** После addLocalRecentParcel вызывать queryClient.invalidateQueries({ queryKey: ['recent-parcels'] }) (или оптимистично setQueryData), либо снизить staleTime для recent-parcels до 0, чтобы при ремонтировании список перечитывал localStorage. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.78 · unit U102</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:57:40 +00:00
bot-backend added the
scope/backend
label 2026-06-15 11:02:10 +00:00
Owner

🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)

Текущее состояние кода: app/site-finder/page.tsx:91-101 (handleParcelOpenaddLocalRecentParcel + router.push, без инвалидации), useRecentParcels lib/site-finder-api.ts:226-251 (staleTime: 60_000, localStorage читается только в queryFn line 230).

Корень: После addLocalRecentParcel нет queryClient.invalidateQueries({queryKey:['recent-parcels']}) / setQueryData. Grep подтверждает: во всём frontend/src НЕТ ни одного invalidateQueries/setQueryData по ['recent-parcels'] (есть только по другим ключам — parcel-forecast, scrape-runs, job-settings и т.д.). С staleTime 60_000 queryFn не перевыполняется при возврате на смонтированный/закэшированный /site-finder в течение 60с → RecentParcels показывает устаревший снимок без только что открытого участка. localStorage обновлён, кэш — нет (рассинхрон). Refresh лечит.

Что править:

  • В handleParcelOpen (page.tsx:91-101) после addLocalRecentParcel вызвать queryClient.invalidateQueries({ queryKey: ['recent-parcels'] }) (нужен useQueryClient() в компоненте), либо оптимистично setQueryData.
  • Альтернатива: снизить staleTime recent-parcels (site-finder-api.ts:249) до 0.

Что посмотреть:

  • Код: app/site-finder/page.tsx:91-101, lib/site-finder-api.ts:226-251; паттерн инвалидации — hooks/useCustomPois.ts:71-101, lib/api/weightProfiles.ts:126-169.
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `app/site-finder/page.tsx:91-101` (`handleParcelOpen` → `addLocalRecentParcel` + `router.push`, без инвалидации), `useRecentParcels` `lib/site-finder-api.ts:226-251` (`staleTime: 60_000`, localStorage читается только в queryFn line 230). **Корень:** После `addLocalRecentParcel` нет `queryClient.invalidateQueries({queryKey:['recent-parcels']})` / `setQueryData`. Grep подтверждает: во всём `frontend/src` НЕТ ни одного `invalidateQueries`/`setQueryData` по `['recent-parcels']` (есть только по другим ключам — parcel-forecast, scrape-runs, job-settings и т.д.). С `staleTime 60_000` queryFn не перевыполняется при возврате на смонтированный/закэшированный `/site-finder` в течение 60с → RecentParcels показывает устаревший снимок без только что открытого участка. localStorage обновлён, кэш — нет (рассинхрон). Refresh лечит. **Что править:** - В `handleParcelOpen` (page.tsx:91-101) после `addLocalRecentParcel` вызвать `queryClient.invalidateQueries({ queryKey: ['recent-parcels'] })` (нужен `useQueryClient()` в компоненте), либо оптимистично `setQueryData`. - Альтернатива: снизить `staleTime` recent-parcels (site-finder-api.ts:249) до 0. **Что посмотреть:** - Код: `app/site-finder/page.tsx:91-101`, `lib/site-finder-api.ts:226-251`; паттерн инвалидации — `hooks/useCustomPois.ts:71-101`, `lib/api/weightProfiles.ts:126-169`. - Vault: релевантных заметок не найдено.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1476
No description provided.