"use client"; import { FormEvent, useMemo, useState } from "react"; import { Copy, Send } from "lucide-react"; import { useRouter } from "next/navigation"; import { Button } from "@/components/ui/button"; import { Dialog } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import type { ApiResult } from "@/modules/core/server/api"; import type { Organization, OrganizationInvitation, RoleDefinition } from "@/modules/core/types"; type OrganizationInviteDialogProps = { open: boolean; organization: Organization; roles: RoleDefinition[]; onClose: () => void; }; export function getInviteHref(token: string): string { return `/register?invite=${encodeURIComponent(token)}`; } export function OrganizationInviteDialog({ open, organization, roles, onClose, }: OrganizationInviteDialogProps): React.ReactElement { const router = useRouter(); const [message, setMessage] = useState(""); const [lastInviteHref, setLastInviteHref] = useState(""); const [isPending, setIsPending] = useState(false); const organizationRoles = useMemo( () => roles.filter((role) => role.scope === "organization" && role.organizationId === organization.id && role.isEnabled), [organization.id, roles], ); const defaultRoleId = organizationRoles.find((role) => role.key === "caregiver")?.id ?? organizationRoles[0]?.id ?? ""; function closeDialog(): void { if (isPending) { return; } setMessage(""); setLastInviteHref(""); onClose(); } async function handleInviteSubmit(event: FormEvent): Promise { event.preventDefault(); setMessage(""); setLastInviteHref(""); setIsPending(true); const formData = new FormData(event.currentTarget); const response = await fetch(`/api/organizations/${organization.id}/invitations`, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify({ email: String(formData.get("email") ?? ""), roleId: String(formData.get("roleId") ?? ""), }), }); const result = (await response.json()) as ApiResult<{ invitation: OrganizationInvitation }>; setIsPending(false); if (!result.success) { setMessage(result.reason); return; } const inviteHref = getInviteHref(result.invitation.token); setMessage(result.reason); setLastInviteHref(inviteHref); event.currentTarget.reset(); router.refresh(); } return (
{message ? (

{message}

) : null} {lastInviteHref ? (
{lastInviteHref}
) : null}
); }