"use client"; import { useState, useEffect, useCallback } from 'react'; import { useApi } from '@/hooks/use-api'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Skeleton } from '@/components/ui/skeleton'; import { Button } from '@/components/ui/button'; import { RefreshCw, Users, Lock, Unlock, ArrowRight, ServerCrash, Radio } from 'lucide-react'; import Link from 'next/link'; import { formatDistanceToNow } from 'date-fns'; export default function ConferenceList() { const [conferences, setConferences] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const apiFetch = useApi(); const fetchConferences = useCallback(async () => { setLoading(true); setError(null); try { // Acting as an unauthenticated user, so no auth token is sent. // This assumes the endpoint is public. const res = await apiFetch(`${process.env.NEXT_PUBLIC_API_URL}/conferences`); if (!res.ok) { const errorData = await res.json(); if (res.status === 401) { throw new Error("Unauthorized: Please log in to view conferences."); } throw new Error(errorData.error || 'Failed to fetch conferences'); } const data = await res.json(); setConferences(Array.isArray(data) ? data : []); } catch (err) { if (err.message !== 'Unauthorized') { console.error("Failed to fetch conferences", err); } setError(err.message); } finally { setLoading(false); } }, [apiFetch]); useEffect(() => { fetchConferences(); const interval = setInterval(fetchConferences, 15000); // Refresh every 15 seconds return () => clearInterval(interval); }, [fetchConferences]); return (

Active Conferences

Join a conversation or see who's currently in a conference.

{error && (
{error}
)} {loading ? (
{[...Array(4)].map((_, i) => (
))}
) : conferences.length > 0 ? (
{conferences.map(room => ( {room.conferenceId} {room.parties} participant(s)
{room.parties}
{room.locked ? : } {room.locked ? 'Locked' : 'Open'}
))}
) : (

No Active Conferences

When a conference starts, it will appear here.

)}
); }