feat(tradein): StreetDealsCard с paired listings (PR L, #564 Phase 2) #599

Merged
Light1YT merged 1 commit from feat/tradein-street-deals-with-asks into main 2026-05-27 12:29:06 +00:00
Owner

Summary

Frontend extension к PR K (#597). StreetDealsCard теперь показывает для каждой ДКП-сделки исторический ASK (avito/cian/yandex/n1) с discount_pct и days_listing_to_deal.

Что нового

  • В каждой строке сделки — связанное объявление (если найдено в окне) со ссылкой на источник
  • В шапке секции: «N% сделок имеют исторический ASK · медианный торг ±X.X%»
  • Discount цвет: зелёный (торг) / красный (overshoot)
  • Mobile-friendly (column stacks)
  • XSS guard через safeUrl() для listing URLs

Files (+340 / -41)

  • types/trade-in.ts (+42) — SalesListingPair + SalesVsListingsResponse
  • lib/trade-in-api.ts (+29) — useSalesVsListings TanStack hook, staleTime 10m
  • components/trade-in/StreetDealsCard.tsx (+231/-41) — endpoint switch + listing column + aggregate client-side
  • components/trade-in/trade-in.css (+79) — token-based styles

Verified

  • tsc --noEmit clean
  • No new deps
  • Все цвета через var(--token) — no inline hex
  • Microcopy Russian, neutral tone

Open Q (followup)

  • useStreetDeals hook (старый) теперь dead code — cleanup PR может удалить
  • Period default 12→24 мес — следующий PM-review
  • discount_pct = 0 рендерится как 0.0% без цвета (neutral edge case)

Closes #564 Phase 2.

## Summary Frontend extension к PR K (#597). StreetDealsCard теперь показывает для каждой ДКП-сделки **исторический ASK** (avito/cian/yandex/n1) с discount_pct и days_listing_to_deal. ## Что нового - В каждой строке сделки — связанное объявление (если найдено в окне) со ссылкой на источник - В шапке секции: «N% сделок имеют исторический ASK · медианный торг ±X.X%» - Discount цвет: зелёный (торг) / красный (overshoot) - Mobile-friendly (column stacks) - XSS guard через `safeUrl()` для listing URLs ## Files (+340 / -41) - `types/trade-in.ts` (+42) — SalesListingPair + SalesVsListingsResponse - `lib/trade-in-api.ts` (+29) — useSalesVsListings TanStack hook, staleTime 10m - `components/trade-in/StreetDealsCard.tsx` (+231/-41) — endpoint switch + listing column + aggregate client-side - `components/trade-in/trade-in.css` (+79) — token-based styles ## Verified - tsc --noEmit clean - No new deps - Все цвета через `var(--token)` — no inline hex - Microcopy Russian, neutral tone ## Open Q (followup) - `useStreetDeals` hook (старый) теперь dead code — cleanup PR может удалить - Period default 12→24 мес — следующий PM-review - discount_pct = 0 рендерится как 0.0% без цвета (neutral edge case) Closes #564 Phase 2.
Light1YT added 1 commit 2026-05-27 12:29:05 +00:00
Switch StreetDealsCard от /street-deals к /sales-vs-listings. В каждой
строке ДКП-сделки теперь показан linked исторический ASK с источником
(Avito/Cian/Yandex/N1), ценой listing, сроком до сделки и discount_pct
в цвете (зелёный = торг, красный = overshoot). В шапке секции —
linkage_rate % сделок имеют match + медианный торг по pairs с listing.

Changes:
- types/trade-in.ts: SalesListingPair + SalesVsListingsResponse
- lib/trade-in-api.ts: useSalesVsListings hook (TanStack, staleTime 10m)
- components/StreetDealsCard.tsx: rewrite — switch endpoint, add listing
  column, compute aggregates client-side (count/median/range), extract
  <ListingBadge> subcomponent
- components/trade-in.css: token-based styles (.linkage-hint, .discount-pos/neg,
  .listing-cell, .listing-link, .listing-source-badge) + mobile breakpoint

Decisions:
- Endpoint replacement (не parallel fetch) — /sales-vs-listings суперсет
- Period default 24 мес (от endpoint default) — больше data для pairing
- Discount sign: var(--success) при <0 (торг), var(--danger) при >0
- safeUrl() guard для listing URLs (XSS) + target="_blank" rel="noopener"
- Mobile <720px — listing column stacks vertically
- linkage_rate=0 → listing column скрыт целиком (`hasAnyListing` flag)

Tests: tsc --noEmit clean. No new deps.

Out of scope: useStreetDeals hook deprecated, можно убрать в cleanup PR.

Closes #564 Phase 2.
Light1YT merged commit 63756c3c29 into main 2026-05-27 12:29:06 +00:00
Light1YT deleted branch feat/tradein-street-deals-with-asks 2026-05-27 12:29:07 +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#599
No description provided.