frontend: заменить mailto-CTA на форму лида в HeroTransparency (parent #1971) #2377

Closed
opened 2026-07-04 06:32:47 +00:00 by lekss361 · 1 comment
Owner

Parent: #1971
Depends on: #2376 — блокируется API-контрактом POST /api/v1/trade-in/lead. НЕ начинать реализацию до мержа backend sub-issue (или как минимум согласованного response_model).

Контекст

Единственная точка mailto-стаба во всей кодовой базе — tradein-mvp/frontend/src/components/trade-in/HeroTransparency.tsx:162-198 (leadHref, leadEnabled, CONTACT_EMAIL). Компонент маунтится через HeroSummary.tsx на src/app/page.tsx (root SPA, result-state) и ui-preview/estimate.

Scope

  1. Заменить leadHref/mailto на inline-форму: phone (input, required) + чекбокс согласия на обработку ПД (ФЗ-152) — первый такой чекбокс в кодовой базе, готового компонента/страницы privacy-policy нет (см. Open Question ниже) — простой inline-текст без ссылки, если юзер не даст готовую формулировку/ссылку заранее.
  2. Submit → POST /api/v1/trade-in/lead через TanStack Query useMutation (НЕ useEffect — см. .claude/rules/frontend.md), body {phone, consent, estimate_id: estimate.estimate_id, source: "result"}.
  3. UI states: idle → submitting → success ("Заявка принята...") → error (retry). Submit заблокирован пока чекбокс не отмечен.
  4. Убрать CONTACT_EMAIL/NEXT_PUBLIC_TRADEIN_CONTACT_EMAIL-гейтинг (leadEnabled) — форма теперь доступна всегда (уточнить у юзера, если фиче-флаг для поэтапного rollout всё ещё нужен).
  5. После мержа backend — cd frontend && npm run codegen (обновление src/lib/api-types.ts под новый эндпоинт).

Acceptance

playwright: открыть result-state, заполнить форму, отправить → success-state; попытка отправить без чекбокса → заблокировано/client-side ошибка.

Не входит

Аналитика воронки, страница privacy-policy, CRM UI — future scope (см. комментарий на #1971).

Open questions (не блокируют старт backend #2376)

  • Нужна ли ссылка на страницу privacy-policy в чекбоксе согласия, или достаточно inline-текста ФЗ-152 без ссылки (страницы сейчас нет вообще)?
  • Сохранять ли NEXT_PUBLIC_TRADEIN_CONTACT_EMAIL-гейтинг (leadEnabled) как feature-flag для поэтапного rollout, или убрать совсем?

Референсы

  • tradein-mvp/frontend/src/components/trade-in/HeroTransparency.tsx (строки 59-63, 162-198)
Parent: #1971 Depends on: #2376 — блокируется API-контрактом `POST /api/v1/trade-in/lead`. НЕ начинать реализацию до мержа backend sub-issue (или как минимум согласованного response_model). ## Контекст Единственная точка mailto-стаба во всей кодовой базе — `tradein-mvp/frontend/src/components/trade-in/HeroTransparency.tsx:162-198` (`leadHref`, `leadEnabled`, `CONTACT_EMAIL`). Компонент маунтится через `HeroSummary.tsx` на `src/app/page.tsx` (root SPA, result-state) и `ui-preview/estimate`. ## Scope 1. Заменить `leadHref`/mailto на inline-форму: `phone` (input, required) + чекбокс согласия на обработку ПД (ФЗ-152) — первый такой чекбокс в кодовой базе, готового компонента/страницы privacy-policy нет (см. Open Question ниже) — простой inline-текст без ссылки, если юзер не даст готовую формулировку/ссылку заранее. 2. Submit → `POST /api/v1/trade-in/lead` через TanStack Query `useMutation` (НЕ useEffect — см. `.claude/rules/frontend.md`), body `{phone, consent, estimate_id: estimate.estimate_id, source: "result"}`. 3. UI states: idle → submitting → success ("Заявка принята...") → error (retry). Submit заблокирован пока чекбокс не отмечен. 4. Убрать `CONTACT_EMAIL`/`NEXT_PUBLIC_TRADEIN_CONTACT_EMAIL`-гейтинг (`leadEnabled`) — форма теперь доступна всегда (уточнить у юзера, если фиче-флаг для поэтапного rollout всё ещё нужен). 5. После мержа backend — `cd frontend && npm run codegen` (обновление `src/lib/api-types.ts` под новый эндпоинт). ## Acceptance playwright: открыть result-state, заполнить форму, отправить → success-state; попытка отправить без чекбокса → заблокировано/client-side ошибка. ## Не входит Аналитика воронки, страница privacy-policy, CRM UI — future scope (см. комментарий на #1971). ## Open questions (не блокируют старт backend #2376) - Нужна ли ссылка на страницу privacy-policy в чекбоксе согласия, или достаточно inline-текста ФЗ-152 без ссылки (страницы сейчас нет вообще)? - Сохранять ли `NEXT_PUBLIC_TRADEIN_CONTACT_EMAIL`-гейтинг (`leadEnabled`) как feature-flag для поэтапного rollout, или убрать совсем? ## Референсы - `tradein-mvp/frontend/src/components/trade-in/HeroTransparency.tsx` (строки 59-63, 162-198)
Author
Owner

Closing — исходный scope (заменить mailto-CTA на форму лида) выполнен в PR #2393, но QA после деплоя обнаружил, что HeroTransparency.tsx рендерится только в недостижимом legacy-дереве (/ 307→/v2, а /v2 использует полностью другое дерево компонентов). Это не регрессия этого PR — mailto-стаб был так же мёртв, просто вопрос "лид виден реальным юзерам" оставался открытым.

Отслежено отдельным issue #2395 ("Форма лида невидима на проде — смонтирована в мёртвом legacy-дереве"), которое портировало ту же логику (переиспользуя useCreateLeadMutation as-is) в живой v2-компонент LeadForm.tsx. #2395 смержен и QA-подтверждён на живом проде (PR #2398) — форма теперь реально видна и функциональна на /trade-in/v2.

Итог: #2377 + #2395 вместе полностью закрывают исходную задачу parent-issue #1971 (lead-flow dead end).

Closing — исходный scope (заменить mailto-CTA на форму лида) выполнен в PR #2393, но QA после деплоя обнаружил, что `HeroTransparency.tsx` рендерится только в недостижимом legacy-дереве (`/` 307→`/v2`, а `/v2` использует полностью другое дерево компонентов). Это не регрессия этого PR — mailto-стаб был так же мёртв, просто вопрос "лид виден реальным юзерам" оставался открытым. Отслежено отдельным issue #2395 ("Форма лида невидима на проде — смонтирована в мёртвом legacy-дереве"), которое портировало ту же логику (переиспользуя `useCreateLeadMutation` as-is) в живой v2-компонент `LeadForm.tsx`. #2395 смержен и QA-подтверждён на живом проде (PR #2398) — форма теперь реально видна и функциональна на `/trade-in/v2`. Итог: #2377 + #2395 вместе полностью закрывают исходную задачу parent-issue #1971 (lead-flow dead 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#2377
No description provided.