import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { roomAPI } from '../utils/api'; import Navbar from './Navbar'; // --- Icons --- const CopyIcon = ({ className }) => ( ); const LinkIcon = ({ className }) => ( ); const LockIcon = ({ className }) => ( ); const MicIcon = ({ className }) => ( ); const TrashIcon = ({ className }) => ( ); const TrendingUpIcon = ({ className }) => ( ); // --- Components --- const Toggle = ({ enabled, onChange }) => ( ); const Dashboard = () => { const [rooms, setRooms] = useState([]); const [loading, setLoading] = useState(false); const [generatedCode, setGeneratedCode] = useState(''); const [joinCode, setJoinCode] = useState(''); // New state for joining const [isPasswordProtected, setIsPasswordProtected] = useState(false); const [waitingRoom, setWaitingRoom] = useState(false); const { user } = useAuth(); const navigate = useNavigate(); useEffect(() => { fetchRooms(); generateNewCode(); }, []); const generateNewCode = () => { const code = `J-${Math.floor(100 + Math.random() * 900)}K-${Math.floor(10 + Math.random() * 90)}D`; setGeneratedCode(code); }; const fetchRooms = async () => { try { const response = await roomAPI.getUserRooms(); setRooms(response.data.rooms); } catch (error) { console.error('Error fetching rooms:', error); } }; const handleCreateRoom = async () => { setLoading(true); const roomName = `Room ${generatedCode}`; try { const response = await roomAPI.createRoom({ name: roomName, settings: { passwordProtected: isPasswordProtected, muteOnEntry: waitingRoom } }); navigate(`/room/${response.data.room.roomId}`); } catch (error) { console.error('Error creating room:', error); alert('Failed to create room'); } finally { setLoading(false); } }; const handleJoinRoom = () => { if (!joinCode.trim()) return; // Check if it's a full URL or just a code let roomId = joinCode; try { if (joinCode.includes('http')) { const url = new URL(joinCode); // Assuming path is /room/:id, grab the last segment const pathParts = url.pathname.split('/'); if (pathParts.length > 0) { roomId = pathParts[pathParts.length - 1]; } } } catch (e) { // Not a valid URL, treat as code console.log("Input is not a URL, using as code"); } // Handle "room/XYZ" case if pasted without protocol if (roomId.includes('/room/')) { roomId = roomId.split('/room/')[1]; } navigate(`/room/${roomId}`); }; const copyToClipboard = (text) => { navigator.clipboard.writeText(text); alert("Copied to clipboard!"); }; const handleDeleteRoom = async (e, roomId) => { e.stopPropagation(); if(window.confirm("End this session?")) { try { await roomAPI.endRoom(roomId); fetchRooms(); alert("Room ended successfully"); } catch (error) { console.error("Error ending room:", error); } } }; return (
{/* --- LEFT COLUMN --- */}
{/* Active Rooms & Create Button */}

Active Rooms

{rooms.length > 0 ? ( rooms.map((room) => (
RM

{room.name}

)) ) : (

No active rooms

)}
{/* Share or Join Code Section */}

Share Your Code

{generatedCode}
{/* Join Existing Room Input */}
setJoinCode(e.target.value)} placeholder="Enter room code or paste link here" className="w-full bg-[#1a1a1a] border border-[#333] rounded-xl px-4 py-3 text-white focus:outline-none focus:border-white/20 transition-all placeholder:text-gray-600" />
{/* --- RIGHT COLUMN --- */}
{/* Room Configuration */}

Room Configuration

Require Password
Waiting Room
{/* Meeting Analytics */}

Statistics

Your meeting activity

Active Rooms {rooms.length}
Total Created {rooms.length}
{rooms.length > 0 && (
Status Active
)}
); }; export default Dashboard;