import { useCallback, useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { Loader2, Plus, Presentation, RefreshCw } from "lucide-react"; import { Button } from "@/components/button"; import { Input } from "@/components/input"; import { Badge } from "@/components/badge"; import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, } from "@/components/dialog"; import { createCollabRoom, listCollabRooms, type CollabRoom, } from "@/api/collab-api"; import { getErrorMessage } from "@/lib/error-message"; export function CollabPanel({ onOpenRoom, }: { onOpenRoom: (room: CollabRoom) => void; }) { const { t } = useTranslation(); const [rooms, setRooms] = useState([]); const [loading, setLoading] = useState(true); const [createOpen, setCreateOpen] = useState(false); const [name, setName] = useState(""); const [persistent, setPersistent] = useState(false); const [creating, setCreating] = useState(false); const refresh = useCallback(async () => { try { const result = await listCollabRooms(); setRooms(result.rooms); } catch { /* the list stays as-is */ } finally { setLoading(false); } }, []); useEffect(() => { void refresh(); const timer = window.setInterval(() => void refresh(), 30000); return () => window.clearInterval(timer); }, [refresh]); async function handleCreate() { if (!name.trim()) return; setCreating(true); try { const { room } = await createCollabRoom(name.trim(), persistent); toast.success(t("collab.created")); setCreateOpen(false); setName(""); setPersistent(false); await refresh(); onOpenRoom(room); } catch (error) { toast.error(getErrorMessage(error)); } finally { setCreating(false); } } return (
{loading ? (
) : rooms.length === 0 ? (

{t("collab.noRooms")}

) : (
{rooms.map((room) => ( ))}
)} {t("collab.createRoom")}
setName(e.target.value)} onKeyDown={(e) => { if (e.key === "Enter") void handleCreate(); }} />
); }