"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 (
Join a conversation or see who's currently in a conference.
When a conference starts, it will appear here.