import { useEffect, useState } from 'react' import { acceptInvite, declineInvite, listMyInvites } from '../api/invites' import { ApiError } from '../api/client' import type { MyInvite } from '../types' import './Modal.css' interface InvitesModalProps { onClose: () => void onAccepted: (roomId: string) => void onInvitesChanged: (count: number) => void } export function InvitesModal({ onClose, onAccepted, onInvitesChanged }: InvitesModalProps) { const [invites, setInvites] = useState([]) const [loading, setLoading] = useState(true) const [busyId, setBusyId] = useState(null) const [error, setError] = useState(null) async function refresh() { const list = await listMyInvites() setInvites(list) onInvitesChanged(list.length) } useEffect(() => { refresh() .catch((err) => setError(err instanceof ApiError ? err.message : String(err))) .finally(() => setLoading(false)) // eslint-disable-next-line react-hooks/exhaustive-deps }, []) async function handleAccept(invite: MyInvite) { setBusyId(invite.id) setError(null) try { await acceptInvite(invite.id) await refresh() onAccepted(invite.room_id) } catch (err) { setError(err instanceof ApiError ? err.message : String(err)) } finally { setBusyId(null) } } async function handleDecline(invite: MyInvite) { setBusyId(invite.id) setError(null) try { await declineInvite(invite.id) await refresh() } catch (err) { setError(err instanceof ApiError ? err.message : String(err)) } finally { setBusyId(null) } } return (
e.stopPropagation()}>

Your invites

{error &&

{error}

} {loading ? (

Loading...

) : invites.length === 0 ? (

No pending invites.

) : ( invites.map((invite) => (
{invite.room_name}
Invited by {invite.invited_by_username}
)) )}
) }