import { useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { ScanSearch, Clock, Loader2, CheckCircle2, XCircle, ArrowRight, } from 'lucide-react'; import { scanApi } from '../api'; import type { Scan } from '../api'; import StatCard from '../components/StatCard'; import StatusChip from '../components/StatusChip'; import type { ScanStatus } from '../components/StatusChip'; import EmptyState from '../components/EmptyState'; import { SkeletonStatCard, SkeletonListItem } from '../components/SkeletonCard'; interface Stats { total: number; pending: number; running: number; completed: number; failed: number; } function formatRelativeDate(dateString: string): string { const date = new Date(dateString); const now = new Date(); const diffMs = now.getTime() - date.getTime(); const diffMins = Math.floor(diffMs / 60_000); const diffDays = Math.floor(diffMs / 86_400_000); if (diffMins < 1) return 'Just now'; if (diffMins < 60) return `${diffMins}m ago`; if (diffDays === 0) return 'Today'; if (diffDays === 1) return 'Yesterday'; if (diffDays < 7) return `${diffDays} days ago`; return date.toLocaleDateString('en-GB', { day: 'numeric', month: 'short', year: 'numeric', }); } export default function Dashboard() { const navigate = useNavigate(); const [scans, setScans] = useState([]); const [loading, setLoading] = useState(true); const [stats, setStats] = useState({ total: 0, pending: 0, running: 0, completed: 0, failed: 0, }); useEffect(() => { loadScans(); }, []); const loadScans = async () => { try { setLoading(true); const response = await scanApi.list(1, 10); const scanList = response.data.data; setScans(scanList); setStats({ total: response.data.pagination.total, pending: scanList.filter(s => s.status === 'pending').length, running: scanList.filter(s => s.status === 'running').length, completed: scanList.filter(s => s.status === 'completed').length, failed: scanList.filter(s => s.status === 'failed').length, }); } catch (error) { console.error('Failed to load scans:', error); } finally { setLoading(false); } }; return (
{/* ── Stats grid ───────────────────────────────────────────── */}
{loading ? ( Array.from({ length: 5 }).map((_, i) => ) ) : ( <> )}
{/* ── Recent scans ─────────────────────────────────────────── */}

Recent Scans

+ New scan
{loading ? (
{Array.from({ length: 5 }).map((_, i) => )}
) : scans.length === 0 ? (
navigate('/scans') }} />
) : (
{scans.map((scan) => (
{/* Row 1: route + status */}
{scan.origin} → {scan.country}
{/* Row 2: dates + config */}

{scan.start_date} – {scan.end_date} {' · '}{scan.adults} adult{scan.adults !== 1 ? 's' : ''} {' · '}{scan.seat_class}

{/* Row 3: results (only when present) */} {scan.total_routes > 0 && (

{scan.total_routes} routes · {scan.total_flights} flights found

)}
{/* Right: date + arrow */}
{formatRelativeDate(scan.created_at)}
))}
)}
); }