"use client"; import { Box, VStack, HStack, Text, Button, Spinner, Badge, Icon, Flex, } from "@chakra-ui/react"; import React from "react"; import { FaUsers, FaClock, FaCalendarAlt, FaPlus } from "react-icons/fa"; import { LuX } from "react-icons/lu"; import type { components } from "../reflector-api"; import { useRoomActiveMeetings, useRoomUpcomingMeetings, useRoomJoinMeeting, useMeetingDeactivate, useRoomGetByName, } from "../lib/apiHooks"; import { useRouter } from "next/navigation"; import Link from "next/link"; type Meeting = components["schemas"]["Meeting"]; type CalendarEventResponse = components["schemas"]["CalendarEventResponse"]; interface MeetingSelectionProps { roomName: string; isOwner: boolean; isSharedRoom: 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, isSharedRoom, onMeetingSelect, onCreateUnscheduled, }: MeetingSelectionProps) { const router = useRouter(); // Use React Query hooks for data fetching const roomQuery = useRoomGetByName(roomName); const activeMeetingsQuery = useRoomActiveMeetings(roomName); const upcomingMeetingsQuery = useRoomUpcomingMeetings(roomName); const joinMeetingMutation = useRoomJoinMeeting(); const deactivateMeetingMutation = useMeetingDeactivate(); const room = roomQuery.data; const activeMeetings = activeMeetingsQuery.data || []; const upcomingEvents = upcomingMeetingsQuery.data || []; const loading = roomQuery.isLoading || activeMeetingsQuery.isLoading || upcomingMeetingsQuery.isLoading; const error = roomQuery.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(`/${roomName}/wait/${event.id}`); }; const handleEndMeeting = async (meetingId: string) => { try { await deactivateMeetingMutation.mutateAsync({ params: { path: { meeting_id: meetingId, }, }, }); } catch (err) { console.error("Failed to end meeting:", err); } }; if (loading) { return ( Loading meetings... ); } if (error) { return ( Error {"Failed to load meetings"} ); } // Generate display name for room const displayName = room?.display_name || room?.name || roomName; const roomTitle = displayName.endsWith("'s") || displayName.endsWith("s") ? `${displayName} Room` : `${displayName}'s Room`; return ( {displayName}'s room {/* 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 )} )} {isOwner && ( )} ))} )} {/* 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 - Only for room owners or shared rooms */} {(isOwner || isSharedRoom) && ( Start a Quick Meeting Jump into a meeting room right away )} {/* Message for non-owners of private rooms */} {!isOwner && !isSharedRoom && ( Only the room owner can create unscheduled meetings in this private room. )} {/* Footer with back to reflector link */} ← Back to Reflector ); }