import { useEffect, useState } from "react"; import { Link, useSearchParams } from "react-router-dom"; import { Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { apiGet } from "@/lib/api"; import type { Booking } from "@/lib/types"; import { formatDate, formatMoney } from "@/lib/format"; import { roomDisplayName } from "@/lib/room-utils"; export function BookingsPage() { const [searchParams] = useSearchParams(); const ref = searchParams.get("referral") ?? ""; const [list, setList] = useState([]); const [status, setStatus] = useState("all"); const [q, setQ] = useState(""); useEffect(() => { const params = new URLSearchParams(); if (status !== "all") params.set("status", status); if (q) params.set("q", q); if (ref) params.set("referralCode", ref); const t = setTimeout(() => { apiGet<{ data: Booking[] }>(`/bookings?${params}`) .then((r) => setList(r.data)) .catch(console.error); }, 200); return () => clearTimeout(t); }, [status, q, ref]); return (
Home Bookings

Bookings

Search, filter, export

{["Total", "Confirmed", "Held", "Pending"].map((label, i) => ( {label}

{i === 0 ? list.length : list.filter((b) => label === "Confirmed" ? b.status === "confirmed" : label === "Held" ? b.status === "held" : b.status === "payment_pending" ).length}

))}
setQ(e.target.value)} className="max-w-md" />
Guest Room Dates Status Total {list.map((b) => (

{b.guest.firstName} {b.guest.lastName}

{b.guest.email}

{roomDisplayName(b.roomId)} {formatDate(b.checkIn)} → {formatDate(b.checkOut)} {b.status} {formatMoney(b.pricing.total)}
))}
{list.map((b) => (

{b.guest.firstName} {b.guest.lastName}

{formatDate(b.checkIn)} · {b.status}

{formatMoney(b.pricing.total)}

))}
); }