"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"; import { formatDateTime, formatCountdown, formatStartedAgo, } from "../lib/timeUtils"; import MinimalHeader from "../components/MinimalHeader"; type Meeting = components["schemas"]["Meeting"]; type CalendarEventResponse = components["schemas"]["CalendarEventResponse"]; interface MeetingSelectionProps { roomName: string; isOwner: boolean; isSharedRoom: boolean; onMeetingSelect: (meeting: Meeting) => void; onCreateUnscheduled: () => void; } 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 = async (event: CalendarEventResponse) => { // Create an unscheduled meeting for this calendar event onCreateUnscheduled(); }; 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`; const handleLeaveMeeting = () => { router.push("/"); }; return ( {/* 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) => { const now = new Date(); const startTime = new Date(event.start_time); const endTime = new Date(event.end_time); const isOngoing = startTime <= now && now <= endTime; const minutesUntilStart = Math.floor( (startTime.getTime() - now.getTime()) / (1000 * 60), ); const canJoinEarly = minutesUntilStart <= 5; // Allow joining 5 minutes before return ( {event.title || "Scheduled Meeting"} {isOngoing ? formatStartedAgo(event.start_time) : 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. )} ); }