"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { toast } from "sonner"; import { Copy, Trash2, Mail, Clock, Hash } from "lucide-react"; interface Invite { id: string; token: string; email: string | null; maxUses: number | null; uses: number; expiresAt: string | null; createdAt: string; } interface InviteListProps { spaceSlug: string; } export function InviteList({ spaceSlug }: InviteListProps) { const [invites, setInvites] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { fetch(`/api/spaces/${spaceSlug}/invites`) .then((res) => res.json()) .then((data) => { if (Array.isArray(data)) setInvites(data); }) .catch(() => toast.error("Failed to load invites")) .finally(() => setLoading(false)); }, [spaceSlug]); async function revokeInvite(id: string) { const res = await fetch(`/api/spaces/${spaceSlug}/invites/${id}`, { method: "DELETE" }); if (res.ok) { setInvites((prev) => prev.filter((i) => i.id !== id)); toast.success("Invite revoked"); } else { toast.error("Failed to revoke invite"); } } function copyLink(token: string) { const rootDomain = process.env.NEXT_PUBLIC_ROOT_DOMAIN || "rvote.online"; const protocol = window.location.protocol; const url = `${protocol}//${spaceSlug}.${rootDomain}/join?token=${token}`; navigator.clipboard.writeText(url); toast.success("Copied to clipboard"); } function isExpired(invite: Invite) { return invite.expiresAt ? new Date(invite.expiresAt) < new Date() : false; } function isMaxedOut(invite: Invite) { return invite.maxUses !== null ? invite.uses >= invite.maxUses : false; } if (loading) { return
Loading invites...
; } if (invites.length === 0) { return (

No active invites. Use the button above to create one.

); } return (
{invites.map((invite) => { const expired = isExpired(invite); const maxed = isMaxedOut(invite); const inactive = expired || maxed; return (
{invite.token.slice(0, 8)}... {invite.email && ( {invite.email} )} {invite.uses}{invite.maxUses !== null ? `/${invite.maxUses}` : ""} uses {invite.expiresAt && ( {expired ? "Expired" : `Expires ${new Date(invite.expiresAt).toLocaleDateString()}`} )} {expired && Expired} {maxed && Max uses reached}
{!inactive && ( )}
); })}
); }