feat(tradein/v2): replace mailto lead CTA with real form (#2377) #2393

Merged
lekss361 merged 1 commit from fix/tradein-2377-lead-form into main 2026-07-04 08:03:01 +00:00
Owner

Summary

  • Реальная форма (телефон + чекбокс согласия ФЗ-152) в HeroTransparency.tsx вместо mailto-стаба → POST /api/v1/trade-in/lead (контракт уже смержен и задеплоен, PR #2390) через useCreateLeadMutation (TanStack Query).
  • Убран CONTACT_EMAIL/leadEnabled env-гейтинг — форма всегда доступна.
  • States: idle → submitting → success → error, client-side regex зеркалит backend (^[+]?[\d\s().-]{5,32}$ символ-в-символ).

Review fixup (critical)

Submit-кнопка была disabled при невалидном телефоне/незаполненном чекбоксе — это подавляет нативное submit-событие полностью (и click, и Enter-имплицитный submit), из-за чего client-side validation hint был unreachable dead code: юзер видел только затемнённую кнопку без объяснения. Теперь кнопка disabled ТОЛЬКО во время pending; невалидные попытки проходят через существующий guard в handleLeadSubmit, который корректно показывает hint через leadTouched. aria-disabled сообщает визуальное состояние не блокируя событие.

Также добавлена защита рендера ошибки от non-string mutation errors (FastAPI 422 кладёт список в detail, без guard'а это стрингифицировалось бы в "[object Object]").

Test plan

  • tsc --noEmit чисто (до и после rebase)
  • next build — успех
  • Типы TradeInLeadInput/TradeInLeadResponse вручную сверены построчно с backend Pydantic-схемой — совпадают
  • code-review: ⚠️MINOR (1 критический — disabled блокировал submit-event, пофикшен; 2 minor — non-string error guard пофикшен, CSS-fallback — оставлен, паттерн уже есть в файле в нескольких местах, замечание ревьюера было неточным)
  • Живой submit→POST round-trip не проверен (нет playwright/backend в воркер-сессии) — рекомендую qa-tester smoke после мержа+деплоя

Refs #2377, parent #1971

## Summary - Реальная форма (телефон + чекбокс согласия ФЗ-152) в `HeroTransparency.tsx` вместо mailto-стаба → `POST /api/v1/trade-in/lead` (контракт уже смержен и задеплоен, PR #2390) через `useCreateLeadMutation` (TanStack Query). - Убран `CONTACT_EMAIL`/`leadEnabled` env-гейтинг — форма всегда доступна. - States: idle → submitting → success → error, client-side regex зеркалит backend (`^[+]?[\d\s().-]{5,32}$` символ-в-символ). ## Review fixup (critical) Submit-кнопка была `disabled` при невалидном телефоне/незаполненном чекбоксе — это подавляет нативное submit-событие полностью (и click, и Enter-имплицитный submit), из-за чего client-side validation hint был unreachable dead code: юзер видел только затемнённую кнопку без объяснения. Теперь кнопка disabled ТОЛЬКО во время pending; невалидные попытки проходят через существующий guard в `handleLeadSubmit`, который корректно показывает hint через `leadTouched`. `aria-disabled` сообщает визуальное состояние не блокируя событие. Также добавлена защита рендера ошибки от non-string mutation errors (FastAPI 422 кладёт список в `detail`, без guard'а это стрингифицировалось бы в `"[object Object]"`). ## Test plan - [x] `tsc --noEmit` чисто (до и после rebase) - [x] `next build` — успех - [x] Типы `TradeInLeadInput`/`TradeInLeadResponse` вручную сверены построчно с backend Pydantic-схемой — совпадают - [x] code-review: ⚠️MINOR (1 критический — disabled блокировал submit-event, пофикшен; 2 minor — non-string error guard пофикшен, CSS-fallback — оставлен, паттерн уже есть в файле в нескольких местах, замечание ревьюера было неточным) - [ ] Живой submit→POST round-trip не проверен (нет playwright/backend в воркер-сессии) — рекомендую qa-tester smoke после мержа+деплоя Refs #2377, parent #1971
lekss361 added 1 commit 2026-07-04 07:39:28 +00:00
feat(tradein/v2): replace mailto lead CTA with real form (#2377)
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m6s
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI / openapi-codegen-check (pull_request) Has been skipped
5adf94357e
Real POST /api/v1/trade-in/lead form (phone + FZ-152 consent) in
HeroTransparency.tsx, replacing the mailto stub. Removed the
CONTACT_EMAIL/leadEnabled env-gate — form always renders.

Review fixup: the submit button was disabled whenever phone/consent
were invalid, which suppresses the native submit event entirely (both
click and Enter-key implicit submission) — the client-side validation
hint text was unreachable dead code, and users saw only a dimmed
button with no explanation. Submit is now only disabled while the
mutation is pending; invalid attempts fall through to the existing
handleLeadSubmit guard clause, which surfaces the phone hint via
leadTouched. aria-disabled communicates the visual state without
blocking the event.

Also guarded the error-message render against non-string mutation
errors (FastAPI 422 responses put a list in `detail`, which would
otherwise stringify to "[object Object]").
lekss361 merged commit a7e1391814 into main 2026-07-04 08:03:01 +00:00
lekss361 deleted branch fix/tradein-2377-lead-form 2026-07-04 08:03:01 +00:00
Sign in to join this conversation.
No reviewers
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#2393
No description provided.