import { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { api } from '../lib/api.ts'; interface InviteInfo { server_name: string; inviter: string; expires_at: string | null; } export function JoinServer() { const { code } = useParams<{ code: string }>(); const navigate = useNavigate(); const [info, setInfo] = useState(null); const [loading, setLoading] = useState(true); const [joining, setJoining] = useState(false); const [error, setError] = useState(null); useEffect(() => { if (!code) return; const fetchInfo = async () => { try { const data = await api.get(`/invites/${code}`); setInfo(data); } catch (err) { setError(err instanceof Error ? err.message : 'Invalid invite'); } finally { setLoading(false); } }; fetchInfo(); }, [code]); const joinServer = async () => { if (!code) return; setJoining(true); setError(null); try { const result = await api.post<{ server_id: string }>(`/invites/${code}/join`); navigate(`/channels/${result.server_id}`); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to join'); } finally { setJoining(false); } }; if (loading) { return (
Loading invite...
); } if (error) { return (
INVALID INVITE
{error}
); } return (
YOU'VE BEEN INVITED
{info?.server_name}
{info?.inviter && (
by {info.inviter}
)}
{info?.expires_at && (
Expires: {new Date(info.expires_at).toLocaleString()}
)} {error && (
{error}
)}
); }