(medium) site-finder/page.tsx FilterBarBridge: счётчик показывает «0 / 0 участков» во время загрузки/смены bbox вместо состояния загрузки #1419

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

Severity: medium · Категория: frontend · Файл: frontend/src/app/site-finder/page.tsx:59-71

page.tsx:59-71 — FilterBarBridge передаёт в MapFilterBar totalCount={allInBbox?.length ?? 0} и matchCount={filtered?.length ?? 0}. useParcelsBboxQuery (site-finder-api.ts:152-224) НЕ использует placeholderData: keepPreviousData (в отличие от useParcelAnalyzeQuery, site-finder-api.ts:521, где это сделано осознанно). queryKey включает minLat/minLon/maxLat/maxLon, поэтому при каждом пане/зуме карты ключ меняется и data становится undefined → ?? 0 маскирует «нет данных» как «0 участков». То же на первом рендере: page-level bbox === null до первого onBboxChange от EntryMap (page.tsx:198), запрос disabled (enabled: bbox != null). При этом EntryMap независимо рисует индикатор «Загрузка участков...» (EntryMap.tsx:257-273 по isFetching). Итог: MapFilterBar.tsx:137-138 показывает «0 / 0 участков», а карта одновременно говорит «загрузка» — прямое противоречие в подписи финансового дашборда. Импакт: транзиентное искажение подписи (cosmetic, без порчи данных). Фикс: добавить placeholderData: keepPreviousData в useParcelsBboxQuery и/или пробросить isFetching/isPending в MapFilterBar, чтобы при загрузке показывать «…» вместо 0.

Почему баг: useQuery возвращает data=undefined для нового queryKey до резолва; этот хук НЕ использует keepPreviousData (в отличие от useParcelAnalyzeQuery, где placeholderData:keepPreviousData стоит специально). ?? 0 маскирует «нет данных» под «ноль участков». Параллельно EntryMap рисует индикатор «Загрузка участков...» (EntryMap.tsx:257), т.е. счётчик прямо противоречит спиннеру: панель утверждает «0 участков», карта одновременно говорит «загрузка». Для дашборда финдиректора («государственная аналитика, которая считает за тебя») это враньё в подписи. matchCount/totalCount не различают «пусто» и «загружается».

Как чинить: Прокинуть isFetching/isLoading из обоих useParcelsBboxQuery в MapFilterBar и при загрузке рендерить «…/… участков» или скелет вместо «0 / 0»; либо добавить placeholderData: keepPreviousData в useParcelsBboxQuery, чтобы при смене bbox держать предыдущие числа, а не схлопывать в 0.


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

**Severity:** medium · **Категория:** frontend · **Файл:** `frontend/src/app/site-finder/page.tsx:59-71` page.tsx:59-71 — FilterBarBridge передаёт в MapFilterBar totalCount={allInBbox?.length ?? 0} и matchCount={filtered?.length ?? 0}. useParcelsBboxQuery (site-finder-api.ts:152-224) НЕ использует placeholderData: keepPreviousData (в отличие от useParcelAnalyzeQuery, site-finder-api.ts:521, где это сделано осознанно). queryKey включает minLat/minLon/maxLat/maxLon, поэтому при каждом пане/зуме карты ключ меняется и data становится undefined → `?? 0` маскирует «нет данных» как «0 участков». То же на первом рендере: page-level bbox === null до первого onBboxChange от EntryMap (page.tsx:198), запрос disabled (enabled: bbox != null). При этом EntryMap независимо рисует индикатор «Загрузка участков...» (EntryMap.tsx:257-273 по isFetching). Итог: MapFilterBar.tsx:137-138 показывает «0 / 0 участков», а карта одновременно говорит «загрузка» — прямое противоречие в подписи финансового дашборда. Импакт: транзиентное искажение подписи (cosmetic, без порчи данных). Фикс: добавить placeholderData: keepPreviousData в useParcelsBboxQuery и/или пробросить isFetching/isPending в MapFilterBar, чтобы при загрузке показывать «…» вместо 0. **Почему баг:** useQuery возвращает data=undefined для нового queryKey до резолва; этот хук НЕ использует keepPreviousData (в отличие от useParcelAnalyzeQuery, где placeholderData:keepPreviousData стоит специально). `?? 0` маскирует «нет данных» под «ноль участков». Параллельно EntryMap рисует индикатор «Загрузка участков...» (EntryMap.tsx:257), т.е. счётчик прямо противоречит спиннеру: панель утверждает «0 участков», карта одновременно говорит «загрузка». Для дашборда финдиректора («государственная аналитика, которая считает за тебя») это враньё в подписи. matchCount/totalCount не различают «пусто» и «загружается». **Как чинить:** Прокинуть isFetching/isLoading из обоих useParcelsBboxQuery в MapFilterBar и при загрузке рендерить «…/… участков» или скелет вместо «0 / 0»; либо добавить placeholderData: keepPreviousData в useParcelsBboxQuery, чтобы при смене bbox держать предыдущие числа, а не схлопывать в 0. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.82 · unit U81</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:53:51 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:01 +00:00
Owner

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

Текущее состояние кода: frontend/src/app/site-finder/page.tsx:59-71 (FilterBarBridge): передаёт totalCount={allInBbox?.length ?? 0} (стр. 67) и matchCount={filtered?.length ?? 0} (стр. 68) из двух useParcelsBboxQuery(bbox, ...). Хук frontend/src/lib/site-finder-api.ts:152-225: queryKey включает bbox?.minLat/minLon/maxLat/maxLon (стр. 157-162), enabled: MOCK_PARCELS_BBOX || bbox != null (стр. 221), staleTime: 30_000 (стр. 222), нет placeholderData: keepPreviousData — в отличие от useParcelAnalyzeQuery (:521 placeholderData: keepPreviousData, сделано осознанно).

Корень: При пане/зуме queryKey меняется → data === undefined до резолва → ?? 0 маскирует «нет данных» как «0 участков». То же на первом рендере (bbox === null, запрос disabled). Параллельно EntryMap независимо рисует «Загрузка участков…» по isFetching — прямое противоречие подписи дашборда («0 / 0 участков» против спиннера).

Что править (любой/оба):

  • Добавить placeholderData: keepPreviousData в useParcelsBboxQuery (site-finder-api.ts:152-225) — при смене bbox держать предыдущие числа вместо схлопывания в 0. keepPreviousData уже импортирован (:11).
  • И/или пробросить isFetching/isPending из обоих хуков в FilterBarBridge → в MapFilterBar рендерить «…/… участков» (или скелет) на время загрузки вместо «0 / 0». Counter рисуется в MapFilterBar.tsx (строки ~137-138 в теле — проверить актуальные).

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

  • Код: site-finder/page.tsx:59-71; site-finder-api.ts:152-225 (bbox-хук) vs :518-521 (analyze-хук как референс); components/site-finder/entry/MapFilterBar.tsx (рендер counter) и EntryMap.tsx (индикатор загрузки).
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** `frontend/src/app/site-finder/page.tsx:59-71` (`FilterBarBridge`): передаёт `totalCount={allInBbox?.length ?? 0}` (стр. 67) и `matchCount={filtered?.length ?? 0}` (стр. 68) из двух `useParcelsBboxQuery(bbox, ...)`. Хук `frontend/src/lib/site-finder-api.ts:152-225`: queryKey включает `bbox?.minLat/minLon/maxLat/maxLon` (стр. 157-162), `enabled: MOCK_PARCELS_BBOX || bbox != null` (стр. 221), `staleTime: 30_000` (стр. 222), **нет** `placeholderData: keepPreviousData` — в отличие от `useParcelAnalyzeQuery` (`:521 placeholderData: keepPreviousData`, сделано осознанно). **Корень:** При пане/зуме queryKey меняется → `data === undefined` до резолва → `?? 0` маскирует «нет данных» как «0 участков». То же на первом рендере (bbox === null, запрос disabled). Параллельно EntryMap независимо рисует «Загрузка участков…» по `isFetching` — прямое противоречие подписи дашборда («0 / 0 участков» против спиннера). **Что править (любой/оба):** - Добавить `placeholderData: keepPreviousData` в `useParcelsBboxQuery` (`site-finder-api.ts:152-225`) — при смене bbox держать предыдущие числа вместо схлопывания в 0. `keepPreviousData` уже импортирован (`:11`). - И/или пробросить `isFetching`/`isPending` из обоих хуков в `FilterBarBridge` → в `MapFilterBar` рендерить «…/… участков» (или скелет) на время загрузки вместо «0 / 0». Counter рисуется в `MapFilterBar.tsx` (строки ~137-138 в теле — проверить актуальные). **Что посмотреть:** - Код: `site-finder/page.tsx:59-71`; `site-finder-api.ts:152-225` (bbox-хук) vs `:518-521` (analyze-хук как референс); `components/site-finder/entry/MapFilterBar.tsx` (рендер counter) и `EntryMap.tsx` (индикатор загрузки). - 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#1419
No description provided.