"use client"; import { Box, VStack, HStack, Text, Button, Spinner, Badge, Icon, } from "@chakra-ui/react"; import React from "react"; import { FaUsers, FaClock, FaCalendarAlt, FaPlus } from "react-icons/fa"; import type { components } from "../reflector-api"; import { useRoomActiveMeetings, useRoomUpcomingMeetings, useRoomJoinMeeting, } from "../lib/apiHooks"; import { useRouter } from "next/navigation"; type Meeting = components["schemas"]["Meeting"]; type CalendarEventResponse = components["schemas"]["CalendarEventResponse"]; interface MeetingSelectionProps { roomName: string; isOwner: boolean; onMeetingSelect: (meeting: Meeting) => void; onCreateUnscheduled: () => void; } const formatDateTime = (date: string | Date) => { const d = new Date(date); return d.toLocaleString("en-US", { month: "short", day: "numeric", hour: "2-digit", minute: "2-digit", }); }; const formatCountdown = (startTime: string | Date) => { const now = new Date(); const start = new Date(startTime); const diff = start.getTime() - now.getTime(); if (diff <= 0) return "Starting now"; const minutes = Math.floor(diff / 60000); const hours = Math.floor(minutes / 60); if (hours > 0) { return `Starts in ${hours}h ${minutes % 60}m`; } return `Starts in ${minutes} minutes`; }; export default function MeetingSelection({ roomName, isOwner, onMeetingSelect, onCreateUnscheduled, }: MeetingSelectionProps) { const router = useRouter(); // Use React Query hooks for data fetching const activeMeetingsQuery = useRoomActiveMeetings(roomName); const upcomingMeetingsQuery = useRoomUpcomingMeetings(roomName); const joinMeetingMutation = useRoomJoinMeeting(); const activeMeetings = activeMeetingsQuery.data || []; const upcomingEvents = upcomingMeetingsQuery.data || []; const loading = activeMeetingsQuery.isLoading || upcomingMeetingsQuery.isLoading; const error = activeMeetingsQuery.error || upcomingMeetingsQuery.error; const handleJoinMeeting = async (meetingId: string) => { try { const meeting = await joinMeetingMutation.mutateAsync({ params: { path: { room_name: roomName, meeting_id: meetingId, }, }, }); onMeetingSelect(meeting); } catch (err) { console.error("Failed to join meeting:", err); // Handle error appropriately since we don't have setError anymore } }; const handleJoinUpcoming = (event: CalendarEventResponse) => { // Navigate to waiting page with event info router.push(`/room/${roomName}/wait?eventId=${event.id}`); }; if (loading) { return ( Loading meetings... ); } if (error) { return ( Error {"Failed to load meetings"} ); } return ( Select a Meeting {/* Active Meetings */} {activeMeetings.length > 0 && ( <> Active Meetings {activeMeetings.map((meeting) => ( {(meeting.calendar_metadata as any)?.title || "Meeting"} {isOwner && (meeting.calendar_metadata as any)?.description && ( {(meeting.calendar_metadata as any).description} )} {meeting.num_clients} participants Started {formatDateTime(meeting.start_date)} {isOwner && (meeting.calendar_metadata as any)?.attendees && ( {(meeting.calendar_metadata as any).attendees .slice(0, 3) .map((attendee: any, idx: number) => ( {attendee.name || attendee.email} ))} {(meeting.calendar_metadata as any).attendees .length > 3 && ( + {(meeting.calendar_metadata as any).attendees .length - 3}{" "} more )} )} ))} )} {/* Upcoming Meetings */} {upcomingEvents.length > 0 && ( <> Upcoming Meetings {upcomingEvents.map((event) => ( {event.title || "Scheduled Meeting"} {formatCountdown(event.start_time)} {isOwner && event.description && ( {event.description} )} {formatDateTime(event.start_time)} -{" "} {formatDateTime(event.end_time)} {isOwner && event.attendees && ( {event.attendees .slice(0, 3) .map((attendee: any, idx: number) => ( {attendee.name || attendee.email} ))} {event.attendees.length > 3 && ( +{event.attendees.length - 3} more )} )} ))} )} {/* Create Unscheduled Meeting */} Start an Unscheduled Meeting Create a new meeting room that's not on the calendar ); }