"use client"; import { useState, useEffect } from "react"; import { Calendar, Clock, User, Video, FileText, MoreVertical, } from "lucide-react"; import { useAppTheme } from "@/components/ThemeProvider"; interface User { ID: number; CreatedAt?: string; UpdatedAt?: string; DeletedAt?: string | null; first_name: string; last_name: string; email: string; phone: string; location: string; date_of_birth?: string; is_admin?: boolean; bookings?: null; } interface Booking { ID: number; CreatedAt: string; UpdatedAt: string; DeletedAt: string | null; user_id: number; user: User; scheduled_at: string; duration: number; status: string; jitsi_room_id: string; jitsi_room_url: string; payment_id: string; payment_status: string; amount: number; notes: string; } interface BookingsResponse { bookings: Booking[]; limit: number; offset: number; total: number; } export default function Booking() { const [bookings, setBookings] = useState([]); const [loading, setLoading] = useState(true); const [searchTerm, setSearchTerm] = useState(""); const { theme } = useAppTheme(); const isDark = theme === "dark"; useEffect(() => { // Simulate API call const fetchBookings = async () => { setLoading(true); await new Promise((resolve) => setTimeout(resolve, 500)); // Mock API response const mockData: BookingsResponse = { bookings: [ { ID: 1, CreatedAt: "2025-11-06T11:33:45.704633Z", UpdatedAt: "2025-11-06T11:33:45.707543Z", DeletedAt: null, user_id: 3, user: { ID: 3, CreatedAt: "2025-11-06T10:43:01.299311Z", UpdatedAt: "2025-11-06T10:43:48.427284Z", DeletedAt: null, first_name: "John", last_name: "Smith", email: "john.doe@example.com", phone: "+1234567891", location: "Los Angeles, CA", date_of_birth: "0001-01-01T00:00:00Z", is_admin: true, bookings: null, }, scheduled_at: "2025-11-07T10:00:00Z", duration: 60, status: "scheduled", jitsi_room_id: "booking-1-1762428825-22c92ced2870c17c", jitsi_room_url: "https://meet.jit.si/booking-1-1762428825-22c92ced2870c17c", payment_id: "", payment_status: "pending", amount: 52, notes: "Initial consultation session", }, ], limit: 50, offset: 0, total: 1, }; setBookings(mockData.bookings); setLoading(false); }; fetchBookings(); }, []); const formatDate = (dateString: string) => { const date = new Date(dateString); return date.toLocaleDateString("en-US", { month: "short", day: "numeric", year: "numeric", }); }; const formatTime = (dateString: string) => { const date = new Date(dateString); return date.toLocaleTimeString("en-US", { hour: "numeric", minute: "2-digit", hour12: true, }); }; const getStatusColor = (status: string) => { const normalized = status.toLowerCase(); if (isDark) { switch (normalized) { case "scheduled": return "bg-blue-500/20 text-blue-200"; case "completed": return "bg-green-500/20 text-green-200"; case "cancelled": return "bg-red-500/20 text-red-200"; case "pending": return "bg-yellow-500/20 text-yellow-200"; default: return "bg-gray-700 text-gray-200"; } } switch (normalized) { case "scheduled": return "bg-blue-100 text-blue-700"; case "completed": return "bg-green-100 text-green-700"; case "cancelled": return "bg-red-100 text-red-700"; case "pending": return "bg-yellow-100 text-yellow-700"; default: return "bg-gray-100 text-gray-700"; } }; const getPaymentStatusColor = (status: string) => { const normalized = status.toLowerCase(); if (isDark) { switch (normalized) { case "paid": return "bg-green-500/20 text-green-200"; case "pending": return "bg-yellow-500/20 text-yellow-200"; case "failed": return "bg-red-500/20 text-red-200"; default: return "bg-gray-700 text-gray-200"; } } switch (normalized) { case "paid": return "bg-green-100 text-green-700"; case "pending": return "bg-yellow-100 text-yellow-700"; case "failed": return "bg-red-100 text-red-700"; default: return "bg-gray-100 text-gray-700"; } }; const filteredBookings = bookings.filter( (booking) => booking.user.first_name .toLowerCase() .includes(searchTerm.toLowerCase()) || booking.user.last_name .toLowerCase() .includes(searchTerm.toLowerCase()) || booking.user.email.toLowerCase().includes(searchTerm.toLowerCase()) ); return (
{/* Main Content */}
{/* Page Header */}

Bookings

Manage and view all appointment bookings

{loading ? (
) : filteredBookings.length === 0 ? (

No bookings found

{searchTerm ? "Try adjusting your search terms" : "Create a new booking to get started"}

) : (
{filteredBookings.map((booking) => ( ))}
Patient Status Actions
{booking.user.first_name} {booking.user.last_name}
{formatDate(booking.scheduled_at)}
{formatDate(booking.scheduled_at)}
{formatTime(booking.scheduled_at)}
{booking.status} {booking.payment_status}
{booking.jitsi_room_url && ( )} {booking.notes && ( )}
)}
); }