"use client"; import { CalendarOff } from "lucide-react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState, useTransition } from "react"; import { Button } from "@/components/ui/button"; import { BottomSheet } from "@/components/ui/bottom-sheet"; import { Input } from "@/components/ui/input"; import type { BlockTimeConflict } from "../actions/block-time"; import { blockTimeAction } from "../actions/block-time"; function toMinutes(hhmm: string): number | null { const match = /^(\d{2}):(\d{2})$/.exec(hhmm); if (!match) return null; return Number(match[1]) * 60 + Number(match[2]); } export function BlockTimeButton({ date }: { date: string }) { const [open, setOpen] = useState(false); const [startTime, setStartTime] = useState("12:00"); const [endTime, setEndTime] = useState("13:00"); const [reason, setReason] = useState(""); const [error, setError] = useState(null); const [conflicts, setConflicts] = useState(null); const [isPending, startTransition] = useTransition(); const router = useRouter(); const handleClose = () => { setOpen(false); setError(null); setConflicts(null); setReason(""); }; const submit = (acknowledgeConflicts: boolean) => { const startMinutes = toMinutes(startTime); const endMinutes = toMinutes(endTime); if (startMinutes === null || endMinutes === null || startMinutes >= endMinutes) { setError("Start time must be before end time."); return; } setError(null); startTransition(async () => { const result = await blockTimeAction({ date, startMinutes, endMinutes, reason, acknowledgeConflicts, }); if (!result.success) { setError(result.error ?? "Something went wrong."); setConflicts(result.conflicts ?? null); return; } setOpen(false); setConflicts(null); router.refresh(); }); }; return ( <>

Reserve part of{" "} {new Date(`${date}T00:00:00`).toLocaleDateString("en-GB", { weekday: "long", day: "numeric", month: "short", })}{" "} for something other than appointments — a meeting, admin, a personal break.

{conflicts && conflicts.length > 0 ? (

This overlaps {conflicts.length} existing appointment {conflicts.length > 1 ? "s" : ""}:

    {conflicts.map((c) => (
  • {c.customerName}

    {c.serviceNames}

  • ))}
) : ( <>
setStartTime(e.target.value)} /> setEndTime(e.target.value)} />
setReason(e.target.value)} /> {error && (

{error}

)} )}
); }