(medium) trade-in/page.tsx: протухшая/битая shared-ссылка молча показывает EmptyState «Введите параметры», ошибка GET /estimate/{id} не отображается #1426

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

Severity: medium · Категория: frontend · Файл: frontend/src/app/trade-in/page.tsx:127-136

page.tsx:127-136 — ветвление правой колонки: resultData ? EstimateResult : restoredEstimate.isLoading ? EstimateProgress : EmptyState. restoredEstimate.error нигде не проверяется. Оценки протухают (AggregatedEstimate.expires_at, types/trade-in.ts:51; staleTime в useEstimate с комментарием 'estimates expire at expires_at', trade-in-api.ts:37). При открытии устаревшей/несуществующей ссылки ?id=... apiFetch бросает Error на !response.ok (api.ts:38-39), restoredEstimate.data остаётся undefined, isLoading становится false → пользователь проваливается в EmptyState с текстом «Введите параметры квартиры / Оценка появится здесь после нажатия Оценить» (page.tsx:155-183). Импакт: по нерабочей расшаренной ссылке клиент видит приглашение ввести данные, а не сообщение «ссылка устарела/не найдена» — потеря понятного фидбэка, вводящее в заблуждение состояние. Как чинить: добавить ветку restoredEstimate.error (или urlEstimateId && !isLoading && error) с явным сообщением об устаревшей/несуществующей оценке до фоллбэка на EmptyState.

Почему баг: Оценки протухают (тип AggregatedEstimate.expires_at; staleTime в useEstimate прямо комментирует «estimates expire at expires_at»). При открытии устаревшей или несуществующей ссылки ?id=... apiFetch бросит ошибку (api.ts:38-39 throw на !response.ok), restoredEstimate.data останется undefined, isLoading станет false → пользователь проваливается в EmptyState с текстом «Введите параметры квартиры / Оценка появится здесь после нажатия Оценить». То есть по нерабочей расшаренной ссылке клиент видит приглашение ввести данные, а не сообщение «ссылка устарела/не найдена» — вводящее в заблуждение состояние, потеря понятного фидбэка об ошибке.

Как чинить: Добавить ветку для restoredEstimate.isError (и/или urlEstimateId есть, но data нет): показать сообщение вида «Расчёт по ссылке не найден или устарел» вместо EmptyState.


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

**Severity:** medium · **Категория:** frontend · **Файл:** `frontend/src/app/trade-in/page.tsx:127-136` page.tsx:127-136 — ветвление правой колонки: resultData ? EstimateResult : restoredEstimate.isLoading ? EstimateProgress : EmptyState. restoredEstimate.error нигде не проверяется. Оценки протухают (AggregatedEstimate.expires_at, types/trade-in.ts:51; staleTime в useEstimate с комментарием 'estimates expire at expires_at', trade-in-api.ts:37). При открытии устаревшей/несуществующей ссылки ?id=... apiFetch бросает Error на !response.ok (api.ts:38-39), restoredEstimate.data остаётся undefined, isLoading становится false → пользователь проваливается в EmptyState с текстом «Введите параметры квартиры / Оценка появится здесь после нажатия Оценить» (page.tsx:155-183). Импакт: по нерабочей расшаренной ссылке клиент видит приглашение ввести данные, а не сообщение «ссылка устарела/не найдена» — потеря понятного фидбэка, вводящее в заблуждение состояние. Как чинить: добавить ветку restoredEstimate.error (или urlEstimateId && !isLoading && error) с явным сообщением об устаревшей/несуществующей оценке до фоллбэка на EmptyState. **Почему баг:** Оценки протухают (тип AggregatedEstimate.expires_at; staleTime в useEstimate прямо комментирует «estimates expire at expires_at»). При открытии устаревшей или несуществующей ссылки ?id=... apiFetch бросит ошибку (api.ts:38-39 throw на !response.ok), restoredEstimate.data останется undefined, isLoading станет false → пользователь проваливается в EmptyState с текстом «Введите параметры квартиры / Оценка появится здесь после нажатия Оценить». То есть по нерабочей расшаренной ссылке клиент видит приглашение ввести данные, а не сообщение «ссылка устарела/не найдена» — вводящее в заблуждение состояние, потеря понятного фидбэка об ошибке. **Как чинить:** Добавить ветку для restoredEstimate.isError (и/или urlEstimateId есть, но data нет): показать сообщение вида «Расчёт по ссылке не найден или устарел» вместо EmptyState. --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.85 · unit U84</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:54:41 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:02 +00:00
Owner

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

Текущее состояние кода: ветвление правой колонки frontend/src/app/trade-in/page.tsx:127-136resultData ? EstimateResult : restoredEstimate.isLoading ? EstimateProgress : EmptyState. restoredEstimate.error/isError нигде не проверяется (grep по page.tsx: только mutation.error на стр.55).

Корень: оценки протухают (AggregatedEstimate.expires_at; useEstimate staleTime с комментарием «estimates expire at expires_at», lib/trade-in-api.ts:37). При устаревшей/несуществующей ссылке apiFetch бросает Error на !response.ok (lib/api.ts:38-39), restoredEstimate.data остаётся undefined, isLoadingfalse → проваливается в EmptyState («Введите параметры квартиры», page.tsx:155-183). Пользователь по битой ссылке видит приглашение ввести данные, а не сообщение об ошибке.

Что править:

  • Добавить ветку перед EmptyState: restoredEstimate.isError (или urlEstimateId && !restoredEstimate.isLoading && !restoredEstimate.data) → явное сообщение «Расчёт по ссылке не найден или устарел».
  • Опционально: отличать 404 от 410/expired по статусу (api.ts бросает обычный Error с текстом API error <status> — можно перейти на apiFetchWithStatus/HTTPError для гранулярного текста).

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

  • Код: page.tsx:127-136, lib/trade-in-api.ts:31-39 (useEstimate), lib/api.ts:26-54 (apiFetch throw) и api.ts:62-104 (HTTPError/apiFetchWithStatus), types/trade-in.ts (expires_at).
  • Vault: релевантных заметок не найдено.
**🔍 week ревью 1 — верификация (ПОДТВЕРЖДЕНО)** **Текущее состояние кода:** ветвление правой колонки `frontend/src/app/trade-in/page.tsx:127-136` — `resultData ? EstimateResult : restoredEstimate.isLoading ? EstimateProgress : EmptyState`. `restoredEstimate.error`/`isError` нигде не проверяется (grep по page.tsx: только `mutation.error` на стр.55). **Корень:** оценки протухают (`AggregatedEstimate.expires_at`; `useEstimate` staleTime с комментарием «estimates expire at expires_at», `lib/trade-in-api.ts:37`). При устаревшей/несуществующей ссылке `apiFetch` бросает `Error` на `!response.ok` (`lib/api.ts:38-39`), `restoredEstimate.data` остаётся `undefined`, `isLoading` → `false` → проваливается в `EmptyState` («Введите параметры квартиры», page.tsx:155-183). Пользователь по битой ссылке видит приглашение ввести данные, а не сообщение об ошибке. **Что править:** - Добавить ветку перед EmptyState: `restoredEstimate.isError` (или `urlEstimateId && !restoredEstimate.isLoading && !restoredEstimate.data`) → явное сообщение «Расчёт по ссылке не найден или устарел». - Опционально: отличать 404 от 410/expired по статусу (api.ts бросает обычный `Error` с текстом `API error <status>` — можно перейти на `apiFetchWithStatus`/`HTTPError` для гранулярного текста). **Что посмотреть:** - Код: `page.tsx:127-136`, `lib/trade-in-api.ts:31-39` (`useEstimate`), `lib/api.ts:26-54` (`apiFetch` throw) и `api.ts:62-104` (`HTTPError`/`apiFetchWithStatus`), `types/trade-in.ts` (`expires_at`). - 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#1426
No description provided.