[tradein][v2] Форма лида (#2377) невидима на проде — смонтирована в мёртвом legacy-дереве, не в v2 #2395

Closed
opened 2026-07-04 08:18:30 +00:00 by lekss361 · 1 comment
Owner

Найдено QA-smoke после мержа+деплоя PR #2393 (#2377).

Проблема

HeroTransparency.tsx (где смонтирована новая форма лида — телефон+согласие→POST /api/v1/trade-in/lead) рендерится через HeroSummary.tsxsrc/app/page.tsx. Но единственный живой прод-роут — /trade-in/v2: / и /trade-in делают 307-редирект на /v2 (next.config.ts redirects rule). /trade-in/v2 использует ПОЛНОСТЬЮ ДРУГОЕ дерево компонентов (components/trade-in/v2/HeroBar.tsx, ResultPanel.tsx, ObjectSummary.tsx и т.д.) — ноль ссылок на HeroTransparency/HeroSummary.

Живая проверка: document.querySelector('.hero-lead-form') на /trade-in/v2 после реальной оценки → null. ui-preview/estimate (раньше был воркэраунд для доступа к legacy-дереву) сейчас сам 404-ится.

Backend полностью исправен и работает (200/422/404 все корректны, trade_in_leads персистит правильно, live-запись подтверждена: id=c48d006f-c8aa-4ab6-9765-c0bc1e719238, тестовая — не чистил по no-destructive-ops policy QA). Проблема ЧИСТО в размещении frontend-компонента.

Root cause

Issue #2377 (сам сформулирован на основе grep mailto: по кодовой базе, который нашёл только HeroTransparency.tsx — единственный литеральный mailto-стаб) не проверил, что этот компонент physически недостижим в живом роутинге. Regression не является — mailto-стаб был ТАК ЖЕ мёртв, просто вопрос лид-флоу для реальных юзеров остаётся нерешённым.

DoD

Перенести форму лида (логика уже готова — useCreateLeadMutation в trade-in-api.ts, backend полностью рабочий) в v2-дерево компонентов, в подходящее место (вероятно рядом с ResultPanel.tsx/Footer.tsx v2 или отдельная секция в ObjectSummary.tsx) — с использованием v2 tokens.ts/дизайн-системы, НЕ старых CSS-классов .hero-lead* из trade-in.css (те — legacy-стиль, не v2 HUD-эстетика).

Референсы

  • tradein-mvp/frontend/src/components/trade-in/HeroTransparency.tsx — готовая логика формы (можно переиспользовать hook/валидацию, не JSX/CSS)
  • tradein-mvp/frontend/src/lib/trade-in-api.tsuseCreateLeadMutation (готов, переиспользуем как есть)
  • tradein-mvp/frontend/src/components/trade-in/v2/ResultPanel.tsx / Footer.tsx — вероятные места монтирования
  • tradein-mvp/frontend/next.config.ts — redirect rule подтверждающий что /v2 единственный живой путь

Refs #2377, #1971

Найдено QA-smoke после мержа+деплоя PR #2393 (#2377). ## Проблема `HeroTransparency.tsx` (где смонтирована новая форма лида — телефон+согласие→`POST /api/v1/trade-in/lead`) рендерится через `HeroSummary.tsx` → `src/app/page.tsx`. Но **единственный живой прод-роут — `/trade-in/v2`**: `/` и `/trade-in` делают 307-редирект на `/v2` (`next.config.ts` redirects rule). `/trade-in/v2` использует ПОЛНОСТЬЮ ДРУГОЕ дерево компонентов (`components/trade-in/v2/HeroBar.tsx`, `ResultPanel.tsx`, `ObjectSummary.tsx` и т.д.) — ноль ссылок на `HeroTransparency`/`HeroSummary`. Живая проверка: `document.querySelector('.hero-lead-form')` на `/trade-in/v2` после реальной оценки → `null`. `ui-preview/estimate` (раньше был воркэраунд для доступа к legacy-дереву) сейчас сам 404-ится. **Backend полностью исправен и работает** (200/422/404 все корректны, `trade_in_leads` персистит правильно, live-запись подтверждена: `id=c48d006f-c8aa-4ab6-9765-c0bc1e719238`, тестовая — не чистил по no-destructive-ops policy QA). Проблема ЧИСТО в размещении frontend-компонента. ## Root cause Issue #2377 (сам сформулирован на основе grep `mailto:` по кодовой базе, который нашёл только `HeroTransparency.tsx` — единственный литеральный mailto-стаб) не проверил, что этот компонент physически недостижим в живом роутинге. Regression не является — mailto-стаб был ТАК ЖЕ мёртв, просто вопрос лид-флоу для реальных юзеров остаётся нерешённым. ## DoD Перенести форму лида (логика уже готова — `useCreateLeadMutation` в `trade-in-api.ts`, backend полностью рабочий) в v2-дерево компонентов, в подходящее место (вероятно рядом с `ResultPanel.tsx`/`Footer.tsx` v2 или отдельная секция в `ObjectSummary.tsx`) — с использованием v2 `tokens.ts`/дизайн-системы, НЕ старых CSS-классов `.hero-lead*` из `trade-in.css` (те — legacy-стиль, не v2 HUD-эстетика). ## Референсы - `tradein-mvp/frontend/src/components/trade-in/HeroTransparency.tsx` — готовая логика формы (можно переиспользовать hook/валидацию, не JSX/CSS) - `tradein-mvp/frontend/src/lib/trade-in-api.ts` — `useCreateLeadMutation` (готов, переиспользуем как есть) - `tradein-mvp/frontend/src/components/trade-in/v2/ResultPanel.tsx` / `Footer.tsx` — вероятные места монтирования - `tradein-mvp/frontend/next.config.ts` — redirect rule подтверждающий что `/v2` единственный живой путь Refs #2377, #1971
Author
Owner

Done in PR #2398 (squash-merged, задеплоено — build-frontend пересобран, deploy success).

Что сделано:

  • Новый v2-native LeadForm.tsx (components/trade-in/v2/) — портирована валидация/state-machine из HeroTransparency.tsx (не JSX/CSS), стилизован через tokens.ts.
  • Переиспользует существующий useCreateLeadMutation() из trade-in-api.ts as-is — backend-контракт не менялся.
  • Смонтирован в app/v2/page.tsx условно на hasEstimate=true, снаружи scaled-артборда, внутри общего центрирующего flex — не задел мутацию #2275/#2081 (bare Fragment → flex div wrapper).
  • Ревью fixups: aria-disabled на submit-кнопке (screen-reader parity), убран неиспользуемый default export.

QA (playwright, живой прод /trade-in/v2):

  • Golden path: адрес → оценка → форма лида реально видна ниже результата (не в DOM-мёртвой зоне) → заполнил телефон+согласие → submit → POST /api/v1/trade-in/lead 200 → UI показал inline success-state ("Заявка принята...").
  • DB подтверждена: trade_in_leads строка id=296faea0-f58e-4ebc-a5eb-9f806faa7736, source='result' (верный дефолт), consent=true.
  • Полный network-trace потока (16 запросов) — все 200, 0 console errors/warnings.
  • GlitchTip — 0 новых ошибок, связанных с lead-flow.

Цепочка #2377#2395#2398 подтверждена end-to-end на живом проде.

Done in PR #2398 (squash-merged, задеплоено — `build-frontend` пересобран, deploy success). **Что сделано:** - Новый v2-native `LeadForm.tsx` (`components/trade-in/v2/`) — портирована валидация/state-machine из `HeroTransparency.tsx` (не JSX/CSS), стилизован через `tokens.ts`. - Переиспользует существующий `useCreateLeadMutation()` из `trade-in-api.ts` as-is — backend-контракт не менялся. - Смонтирован в `app/v2/page.tsx` условно на `hasEstimate=true`, снаружи scaled-артборда, внутри общего центрирующего flex — не задел мутацию #2275/#2081 (bare Fragment → flex div wrapper). - Ревью fixups: `aria-disabled` на submit-кнопке (screen-reader parity), убран неиспользуемый default export. **QA (playwright, живой прод `/trade-in/v2`):** - Golden path: адрес → оценка → форма лида реально видна ниже результата (не в DOM-мёртвой зоне) → заполнил телефон+согласие → submit → `POST /api/v1/trade-in/lead` 200 → UI показал inline success-state ("Заявка принята..."). - DB подтверждена: `trade_in_leads` строка `id=296faea0-f58e-4ebc-a5eb-9f806faa7736`, `source='result'` (верный дефолт), `consent=true`. - Полный network-trace потока (16 запросов) — все 200, 0 console errors/warnings. - GlitchTip — 0 новых ошибок, связанных с lead-flow. Цепочка #2377 → #2395 → #2398 подтверждена end-to-end на живом проде.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
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#2395
No description provided.