"use client"; import { useEffect, useState } from "react"; import { fetchClient } from "@/lib/api-client"; interface Invitation { _id: string; code: string; isUsed: boolean; createdAt: string; expiresAt: string; usedAt?: string | null; } export default function InvitationsListCard() { const [invites, setInvites] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); async function deleteInvite(id: string) { try { await fetchClient(`/admin/invitations/${id}`, { method: 'DELETE' }); setInvites(prev => prev.filter(i => i._id !== id)); } catch (e: any) { setError(e?.message || 'Failed to delete invitation'); } } useEffect(() => { let mounted = true; (async () => { try { const data = await fetchClient("/admin/invitations"); if (mounted) setInvites(data); } catch (e: any) { if (mounted) setError(e?.message || "Failed to load invitations"); } finally { if (mounted) setLoading(false); } })(); return () => { mounted = false; }; }, []); return (

Invitations

Active and recent invitations

{loading ? (

Loading...

) : error ? (

{error}

) : invites.length === 0 ? (

No invitations found

) : (
{invites.map((inv) => { const expired = new Date(inv.expiresAt).getTime() < Date.now(); return (
Code: {inv.code}
Created: {new Date(inv.createdAt).toLocaleString()} ยท Expires: {new Date(inv.expiresAt).toLocaleString()}
{inv.isUsed ? 'Used' : expired ? 'Expired' : 'Active'} {!inv.isUsed && ( )}
); })}
)}
); }