import { ExternalLink, Heart, X, Bed, Maximize2, PoundSterling, Building, Clock, MapPin, Footprints, Bike, Train } from 'lucide-react'; import { Button } from './ui/button'; import { PhotoCarousel } from './PhotoCarousel'; import type { ListingDetailData, DecisionType, POIDistanceInfo } from '@/types'; function formatDate(value: string): string { const date = new Date(value); if (isNaN(date.getTime())) return value; return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric' }); } interface ListingDetailProps { detail: ListingDetailData; onDecide: (decision: DecisionType) => void; onClearDecision: () => void; } function formatDuration(seconds: number): string { const minutes = Math.round(seconds / 60); if (minutes < 60) return `${minutes}m`; const hours = Math.floor(minutes / 60); const mins = minutes % 60; return mins > 0 ? `${hours}h${mins}m` : `${hours}h`; } function TravelModeIcon({ mode }: { mode: string }) { switch (mode) { case 'WALK': return ; case 'BICYCLE': return ; case 'TRANSIT': return ; default: return null; } } export function ListingDetail({ detail, onDecide, onClearDecision }: ListingDetailProps) { const allPhotos = [ ...detail.photos, ...detail.floorplans.map(fp => ({ url: fp.url, caption: fp.caption || 'Floorplan', type: 'FLOORPLAN' as string | null })), ]; return (
{/* Photo carousel */}
{/* Price + address */}
£{detail.price.toLocaleString()} {detail.listing_type !== 'BUY' && ( /mo )}
{detail.display_address && (
{detail.display_address}
)}
{/* Like/Dislike buttons */}
{/* Key stats */}
{detail.number_of_bedrooms} beds
{detail.square_meters ?? '\u2014'}
{detail.square_meters ? `£${Math.round(detail.price / detail.square_meters)}` : '\u2014'}/m²
{/* Key features */} {detail.key_features.length > 0 && (

Key Features

    {detail.key_features.map((f, i) => (
  • {f}
  • ))}
)} {/* Description */} {detail.description && (

Description

{detail.description}

)} {/* Property details grid */}

Details

{detail.property_sub_type && (
{detail.property_sub_type}
)} {detail.furnish_type && (
Furnishing: {detail.furnish_type}
)} {detail.council_tax_band && (
Council Tax: Band {detail.council_tax_band}
)} {detail.available_from && (
Available {formatDate(detail.available_from)}
)} {detail.service_charge != null && (
Service charge: £{detail.service_charge.toLocaleString()}
)} {detail.lease_left != null && (
Lease: {detail.lease_left} years
)}
{/* Floorplans */} {detail.floorplans.length > 0 && (

Floorplans

{detail.floorplans.map((fp, i) => ( {fp.caption ))}
)} {/* Price history */} {detail.price_history.length > 1 && (

Price History

{detail.price_history.map((entry) => (
{entry.last_seen.split('T')[0]} £{entry.price.toLocaleString()}
))}
)} {/* POI distances */} {detail.poi_distances.length > 0 && (

Travel Times

{detail.poi_distances.map((d: POIDistanceInfo) => (
{d.poi_name}: {formatDuration(d.duration_seconds)}
))}
)} {/* Agency */} {detail.agency && (
{detail.agency}
)} {/* External link */}
); }