trade-in/v2 [FE-1]: data shell + main dashboard wiring (page.tsx + mappers + ParamsPanel/ResultPanel/ObjectSummary/Hero/Footer) #2038

Closed
opened 2026-06-28 11:04:40 +00:00 by lekss361 · 0 comments
Owner

Под-issue #2036 (см. аудит). Foundation — блокирует FE-2..5.

Цель: app/v2/page.tsx становится владельцем данных, главный дашборд (3 колонки) рендерит РЕАЛЬНУЮ оценку.

Архитектура (стандарт для всех FE-под-issue)

  • Новый components/trade-in/v2/mappers.ts — ЧИСТЫЕ функции AggregatedEstimate (+sub-hooks) → fixture-shape (формат денег /1e6 ru, toLocaleString('ru'), enum→RU, гистограмма-бины, scatter px-геометрия, CSS%-маркеры range, SVG-полилинии). Пиксель-перфект компоненты НЕ трогаем по разметке.
  • Каждый компонент: сигнатура ({ data = fixtures.X, ...callbacks }) — fixture как default-fallback. page.tsx передаёт data={mapX(estimate, ...)}.

Scope

  • page.tsx: "use client"; читать ?id= (useSearchParams); есть id → useEstimate(id); нет → ParamsPanel как controlled-форма (TradeInEstimateInput). Submit → useEstimateMutationrouter.replace('/v2?id='+estimate_id). Спавнить id-keyed под-хуки (useEstimateHouses, useEstimateImvBenchmark) + address-keyed (useStreetDeals) для дашборда. Состояния: loading = grey fade-skeleton (без shimmer), empty = честный плейсхолдер (insufficient_data/0 analogs), error = inline retry. Частичный результат не блокирует страницу.
  • Мапперы + wiring: report (id=estimate_id.slice(0,8), validUntil=expires_at), object (снимок входа + target_address, enum→RU, city из адреса), resultCards[3] (asking/expected_sold/dkp_corridor; бары FE-бин по analogs[].price_per_m2; донат из asking_to_sold_ratio), resultMeta (sources_used.length/7 + confidence; CV FE-аппрокс std/mean по analogs — пометить approximate), ranges (ads из range_*; deals из useStreetDeals), scatterMini (price×days_on_market FE px), sources[7] (active из sources_used; count FE groupBy .source — approximate), summary (+useEstimateHouseAnalytics.kpi).

Acceptance

/trade-in/v2?id=<real> и форма→оценка показывают реальные числа в NAV/HERO/01/02/03 (3 карточки, ranges, scatter, источники, сводка). next build зелёный. CV/счётчики-источников помечены как approximate (TODO BE-1). LocationDrawer/РАДИУС/CRM — degrade/hide (BE-2/BE-3).

dependsOn: —

Под-issue #2036 (см. [аудит](https://git.gendsgn.ru/lekss361/gendesign/issues/2036#issuecomment-17791)). **Foundation — блокирует FE-2..5.** Цель: `app/v2/page.tsx` становится владельцем данных, главный дашборд (3 колонки) рендерит РЕАЛЬНУЮ оценку. ## Архитектура (стандарт для всех FE-под-issue) - Новый `components/trade-in/v2/mappers.ts` — ЧИСТЫЕ функции `AggregatedEstimate (+sub-hooks) → fixture-shape` (формат денег `/1e6` ru, `toLocaleString('ru')`, enum→RU, гистограмма-бины, scatter px-геометрия, CSS%-маркеры range, SVG-полилинии). Пиксель-перфект компоненты НЕ трогаем по разметке. - Каждый компонент: сигнатура `({ data = fixtures.X, ...callbacks })` — fixture как default-fallback. page.tsx передаёт `data={mapX(estimate, ...)}`. ## Scope - `page.tsx`: `"use client"`; читать `?id=` (`useSearchParams`); есть id → `useEstimate(id)`; нет → ParamsPanel как controlled-форма (`TradeInEstimateInput`). Submit → `useEstimateMutation` → `router.replace('/v2?id='+estimate_id)`. Спавнить id-keyed под-хуки (`useEstimateHouses`, `useEstimateImvBenchmark`) + address-keyed (`useStreetDeals`) для дашборда. Состояния: loading = grey fade-skeleton (без shimmer), empty = честный плейсхолдер (`insufficient_data`/0 analogs), error = inline retry. Частичный результат не блокирует страницу. - Мапперы + wiring: `report` (id=`estimate_id.slice(0,8)`, validUntil=`expires_at`), `object` (снимок входа + `target_address`, enum→RU, city из адреса), `resultCards[3]` (asking/`expected_sold`/`dkp_corridor`; бары FE-бин по `analogs[].price_per_m2`; донат из `asking_to_sold_ratio`), `resultMeta` (`sources_used.length`/7 + confidence; **CV FE-аппрокс** std/mean по analogs — пометить approximate), `ranges` (ads из range_*; deals из `useStreetDeals`), `scatterMini` (price×days_on_market FE px), `sources[7]` (active из `sources_used`; **count FE groupBy** `.source` — approximate), `summary` (+`useEstimateHouseAnalytics.kpi`). ## Acceptance `/trade-in/v2?id=<real>` и форма→оценка показывают реальные числа в NAV/HERO/01/02/03 (3 карточки, ranges, scatter, источники, сводка). `next build` зелёный. CV/счётчики-источников помечены как approximate (TODO BE-1). LocationDrawer/РАДИУС/CRM — degrade/hide (BE-2/BE-3). dependsOn: —
lekss361 added the
enhancement
scope/frontend
status/wip
tradein
labels 2026-06-28 11:06:00 +00:00
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#2038
No description provided.