import React, { useState, useEffect } from 'react'; import { Modal } from '../ui/Modal'; import { useUIStore } from '../../stores/uiStore'; import { useServerStore } from '../../stores/serverStore'; import { useNavigate, useParams } from 'react-router-dom'; export function JoinServerModal() { const { inviteCode: urlInviteCode } = useParams<{ inviteCode?: string }>(); const [inviteCode, setInviteCode] = useState(''); const [error, setError] = useState(''); const [isLoading, setIsLoading] = useState(false); const activeModal = useUIStore((s) => s.activeModal); const closeModal = useUIStore((s) => s.closeModal); const joinByCode = useServerStore((s) => s.joinByCode); const navigate = useNavigate(); const isOpen = activeModal === 'joinServer'; useEffect(() => { if (isOpen && urlInviteCode) { setInviteCode(urlInviteCode); } }, [isOpen, urlInviteCode]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); const code = inviteCode.trim(); if (!code) { setError('Invite code is required'); return; } setIsLoading(true); try { const server = await joinByCode(code); closeModal(); setInviteCode(''); navigate(`/channels/${server.id}`); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to join server'); } finally { setIsLoading(false); } }; return (

Enter an invite code to join an existing server.

{error && (
{error}
)}
setInviteCode(e.target.value)} className="w-full px-3 py-2 bg-surface-input rounded text-txt-primary outline-none focus:ring-2 focus:ring-accent-primary" placeholder="e.g. abc123" autoFocus />
); }