import { useState, useEffect } from 'react'; import { Plus, Video, Loader2, LayoutGrid, List } from 'lucide-react'; import api from '../services/api'; import { useLanguage } from '../contexts/LanguageContext'; import RoomCard from '../components/RoomCard'; import FederatedRoomCard from '../components/FederatedRoomCard'; import Modal from '../components/Modal'; import toast from 'react-hot-toast'; export default function Dashboard() { const { t } = useLanguage(); const [rooms, setRooms] = useState([]); const [federatedRooms, setFederatedRooms] = useState([]); const [loading, setLoading] = useState(true); const [showCreate, setShowCreate] = useState(false); const [viewMode, setViewMode] = useState('grid'); const [creating, setCreating] = useState(false); const [newRoom, setNewRoom] = useState({ name: '', welcome_message: '', max_participants: 0, access_code: '', mute_on_join: true, record_meeting: true, }); const fetchRooms = async () => { try { const res = await api.get('/rooms'); setRooms(res.data.rooms); } catch (err) { toast.error(t('dashboard.loadFailed')); } finally { setLoading(false); } }; const fetchFederatedRooms = async () => { try { const res = await api.get('/federation/federated-rooms'); setFederatedRooms(res.data.rooms || []); } catch { // Federation may not be enabled } }; useEffect(() => { fetchRooms(); fetchFederatedRooms(); }, []); const handleCreate = async (e) => { e.preventDefault(); setCreating(true); try { await api.post('/rooms', newRoom); toast.success(t('dashboard.roomCreated')); setShowCreate(false); setNewRoom({ name: '', welcome_message: t('dashboard.welcomeMessageDefault'), max_participants: 0, access_code: '', mute_on_join: true, record_meeting: true, }); fetchRooms(); } catch (err) { toast.error(err.response?.data?.error || t('dashboard.roomCreateFailed')); } finally { setCreating(false); } }; const handleDelete = async (room) => { if (!confirm(t('dashboard.roomDeleteConfirm', { name: room.name }))) return; try { await api.delete(`/rooms/${room.uid}`); toast.success(t('dashboard.roomDeleted')); fetchRooms(); } catch (err) { toast.error(t('dashboard.roomDeleteFailed')); } }; if (loading) { return (
{t('dashboard.roomCount', { count: rooms.length })}
{t('dashboard.noRoomsSubtitle')}
{t('dashboard.federatedRoomsSubtitle')}