feat(tradein/ui): вход в поддержку с сайта — плавающая кнопка + живая «Помощь» #2527
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2527
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/tradein-support-button"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Зачем
Support-мост (#2526) уже работает на проде, но попасть в бота с сайта было неоткуда — клиент о нём просто не узнавал.
Заодно закрывает перекос пошире:
LeadFormмонтируется только приhasEstimate(v2/page.tsx:1064), то есть до расчёта оценки у клиента не было ни одного способа связаться. Единственная другая ссылка на связь во всём UI —NoAccessScreen.tsx:84, и та лишь на экране «доступ закончился».Что сделано
Два входа, оба ведут в
@MERAsupport_bot:SupportButton(новый) — плавающая кнопка в правом нижнем углу, на всех экранах/v2TopNav— была задизейблена с «скоро появится», теперь живая ссылкаПрофиль/Настройки в том же меню остаются задизейбленными — страниц под них нет.
Решения
Это внешняя ссылка, а не чат-виджет. Бот живёт в Telegram, поэтому ни API, ни состояния, ни сокетов не нужно.
URL — module-константа, не
NEXT_PUBLIC_*. Env инлайнятся на build-time, так что переменная не дала бы гибкости рантайма — только лишний build-arg в трёх местах. Источник правды один:SUPPORT_BOT_URLвSupportButton.tsx,TopNavимпортирует его (строка с URL физически существует в коде один раз).Монтаж в
v2/layout, не в глобальныйapp/layout. Последний накрывает ещё админку/scrapers/**и/sale-share— другой продукт без бренда МЕРА, им кнопка не нужна.createPortalвdocument.body./v2рисует HUD внутри артборда 1536×1024 сtransform: scale()(v2/page.tsx:860-871), аposition: fixedвнутри трансформированного предка позиционируется относительно него, а не вьюпорта — без портала кнопку унесло бы вместе с HUD. Паттерн 1:1 сMapPicker.tsx:104-108.z-index: 25— осознанно НИЖЕ всех оверлеев v2 (SectionOverlay 29/30, LocationDrawer 40/41, TopNav 50, UserMenu 200): при открытой модалке кнопка должна уходить под неё, а не воровать клики и таб-порядок.Стиль только через
tokens.ts— файл прямо запрещает хардкодить hex (там выверенные по WCAG контрасты). Готового<Button>в проекте нет, следуем инлайн-паттернуLeadForm.A11y
aria-label="Написать в поддержку МЕРА в Telegram", тач-таргет 44px,focus-visiblering, инлайновый SVG сaria-hidden,rel="noopener noreferrer".Проверка
tsc --noEmit— чистоlint— чисто (3 warning'а pre-existing, не в этих файлах)npm run build— успешно,/v249.4 kB, все 15 страниц prerender⚠️ Визуальная проверка — на проде после деплоя. Локально
RouteGuardбез бекенда возвращаетnull(RouteGuard.tsx:46—if (isLoading) return null), рендер не доходит до кнопки; эмулировать авторизацию ради скриншота дороже, чем посмотреть на живом стенде с настоящей сессией.