import { Button } from "@app/components/ui/button"; import { Credenza, CredenzaBody, CredenzaClose, CredenzaContent, CredenzaDescription, CredenzaFooter, CredenzaHeader, CredenzaTitle } from "@app/components/Credenza"; import { useState, useEffect } from "react"; import { createApiClient } from "@app/lib/api"; import { useEnvContext } from "@app/hooks/useEnvContext"; import { useOrgContext } from "@app/hooks/useOrgContext"; import { toast } from "@app/hooks/useToast"; import CopyTextBox from "@app/components/CopyTextBox"; import { Checkbox } from "@app/components/ui/checkbox"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@app/components/ui/select"; import { Label } from "@app/components/ui/label"; import { useTranslations } from "next-intl"; type RegenerateInvitationFormProps = { open: boolean; setOpen: (open: boolean) => void; invitation: { id: string; email: string; roleId: number; role: string; } | null; onRegenerate: (updatedInvitation: { id: string; email: string; expiresAt: string; role: string; roleId: number; }) => void; }; export default function RegenerateInvitationForm({ open, setOpen, invitation, onRegenerate }: RegenerateInvitationFormProps) { const [loading, setLoading] = useState(false); const [inviteLink, setInviteLink] = useState(null); const [sendEmail, setSendEmail] = useState(true); const [validHours, setValidHours] = useState(72); const api = createApiClient(useEnvContext()); const { org } = useOrgContext(); const t = useTranslations(); const validForOptions = [ { hours: 24, name: t("day", { count: 1 }) }, { hours: 48, name: t("day", { count: 2 }) }, { hours: 72, name: t("day", { count: 3 }) }, { hours: 96, name: t("day", { count: 4 }) }, { hours: 120, name: t("day", { count: 5 }) }, { hours: 144, name: t("day", { count: 6 }) }, { hours: 168, name: t("day", { count: 7 }) } ]; useEffect(() => { if (open) { setSendEmail(true); setValidHours(72); } }, [open]); async function handleRegenerate() { if (!invitation) return; if (!org?.org.orgId) { toast({ variant: "destructive", title: t("orgMissing"), description: t("orgMissingMessage"), duration: 5000 }); return; } setLoading(true); try { const res = await api.post(`/org/${org.org.orgId}/create-invite`, { email: invitation.email, roleId: invitation.roleId, validHours, sendEmail, regenerate: true }); if (res.status === 200) { const link = res.data.data.inviteLink; setInviteLink(link); if (sendEmail) { toast({ variant: "default", title: t("inviteRegenerated"), description: t("inviteSent", { email: invitation.email }), duration: 5000 }); } else { toast({ variant: "default", title: t("inviteRegenerated"), description: t("inviteGenerate", { email: invitation.email }), duration: 5000 }); } onRegenerate({ id: invitation.id, email: invitation.email, expiresAt: res.data.data.expiresAt, role: invitation.role, roleId: invitation.roleId }); } } catch (error: any) { if (error.response?.status === 409) { toast({ variant: "destructive", title: t("inviteDuplicateError"), description: t("inviteDuplicateErrorDescription"), duration: 5000 }); } else if (error.response?.status === 429) { toast({ variant: "destructive", title: t("inviteRateLimitError"), description: t("inviteRateLimitErrorDescription"), duration: 5000 }); } else { toast({ variant: "destructive", title: t("inviteRegenerateError"), description: t("inviteRegenerateErrorDescription"), duration: 5000 }); } } finally { setLoading(false); } } return ( { setOpen(isOpen); if (!isOpen) { setInviteLink(null); } }} > {t("inviteRegenerate")} {t("inviteRegenerateDescription")} {!inviteLink ? (

{t("inviteQuestionRegenerate", { email: invitation?.email || "" })}

setSendEmail(e as boolean) } />
) : (

{t("inviteRegenerateMessage")}

)}
{!inviteLink ? ( <> ) : ( )}
); }