"use client"; import { AlertCircle, CheckCircle, Copy, Key, Loader2 } from "lucide-react"; import { useState } from "react"; import type { CreateUserInvitationBody, Server as ServerRecord, } from "@/lib/api"; import ServerAccessSelector from "@/app/users/components/ServerAccessSelector"; import { manageableRoles } from "@/app/users/components/user-role-config"; import { copyText, formatRelativeDate, } from "@/app/users/components/user-utils"; interface InviteUserModalProps { availableServers: ServerRecord[]; onClose: () => void; onSubmit: (payload: CreateUserInvitationBody) => Promise; onCopySuccess: () => void; submitting: boolean; error: string; result: { inviteUrl: string; email: string; expiresAt: string } | null; } export default function InviteUserModal({ availableServers, onClose, onSubmit, onCopySuccess, submitting, error, result, }: InviteUserModalProps) { const [form, setForm] = useState({ name: "", email: "", role: "DEVELOPER", allServersAccess: true, serverIds: [], expiresInDays: 7, }); const [copied, setCopied] = useState(false); const handleSubmit = async (event: React.FormEvent) => { event.preventDefault(); await onSubmit(form); }; const handleCopy = async () => { if (!result) return; await copyText(result.inviteUrl); setCopied(true); onCopySuccess(); window.setTimeout(() => setCopied(false), 2000); }; return (
event.stopPropagation()} >

Invite User

Generate an onboarding link so the user sets their own password.

{result ? (

Invitation link ready

Send this link to {result.email}. It expires{" "} {formatRelativeDate(result.expiresAt)}.

Invitation Link

{result.inviteUrl}

) : (
{error ? (
{error}
) : null}
setForm((current) => ({ ...current, name: event.target.value, })) } required />
setForm((current) => ({ ...current, email: event.target.value, })) } required />
setForm((current) => ({ ...current, allServersAccess: value, serverIds: value ? [] : current.serverIds, })) } onSelectionChange={(value) => setForm((current) => ({ ...current, serverIds: value })) } />
)}
); }