import type { Metadata } from "next"; import Link from "next/link"; import { redirect } from "next/navigation"; import { auth } from "@/auth"; import { TopNav } from "@/components/navigation/top-nav"; import { Card } from "@/components/ui/card"; import { readDraft } from "@/lib/booking-draft/cookie"; import { getPrimaryBusiness } from "@/lib/business/get-primary-business"; import { prisma } from "@/lib/db/prisma"; import { getLoyaltySummary } from "@/services/loyalty/loyalty.service"; import { ConfirmBookingButton } from "@/features/booking/components/confirm-booking-button"; export const metadata: Metadata = { title: "Review Booking" }; export const dynamic = "force-dynamic"; export default async function BookReviewPage() { const business = await getPrimaryBusiness(); const draft = await readDraft(business.id); if (draft.serviceIds.length === 0) redirect("/book"); if (!draft.startAt) redirect("/book/barber-time"); const session = await auth(); if (!session?.user && !draft.guest) redirect("/book/details"); if (!draft.policyAcknowledged) redirect("/book/details"); const [services, staff, customerProfile] = await Promise.all([ prisma.service.findMany({ where: { id: { in: draft.serviceIds } } }), draft.staffId ? prisma.staffProfile.findUnique({ where: { id: draft.staffId }, include: { user: { select: { name: true } } }, }) : null, session?.user?.id ? prisma.customerProfile.findUnique({ where: { userId: session.user.id } }) : null, ]); const totalDuration = services.reduce((sum, s) => sum + s.durationMinutes, 0); const totalPrice = services.reduce((sum, s) => sum + Number(s.price), 0); const startAt = new Date(draft.startAt); const endAt = new Date(startAt.getTime() + totalDuration * 60_000); const loyalty = customerProfile ? await getLoyaltySummary(prisma, { customerId: customerProfile.id, businessId: business.id }) : null; const customerName = draft.guest ? `${draft.guest.firstName} ${draft.guest.lastName}` : `${customerProfile?.firstName ?? session?.user?.name ?? ""} ${customerProfile?.lastName ?? ""}`.trim(); const customerEmail = draft.guest?.email ?? customerProfile?.email ?? session?.user?.email ?? ""; const customerPhone = draft.guest?.phone ?? customerProfile?.phone ?? ""; return (
Business {business.name}
Services
    {services.map((s) => (
  • {s.name}
  • ))}
Edit
Barber

{staff?.user.name ?? "Any available barber"}

Edit
Date & Time

{startAt.toLocaleDateString("en-GB", { weekday: "short", day: "numeric", month: "short", timeZone: business.timezone, })} {" · "} {startAt.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit", timeZone: business.timezone, })} {"–"} {endAt.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit", timeZone: business.timezone, })}

Edit
Duration

{totalDuration} min

Total

£{totalPrice.toFixed(2)}

Your Details Edit

{customerName}

{customerEmail} {customerPhone ? ` · ${customerPhone}` : ""}

{loyalty?.availableReward && (

You have a reward available

Mention it to your barber at check-in — {loyalty.availableReward.label}.

)} {draft.notes && (
Notes

{draft.notes}

)}
); }