"use client"; import { useState, type ReactElement, type SyntheticEvent } from "react"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import type { InviteUserDto, WorkspaceMemberRole } from "@/lib/api/admin"; /* --------------------------------------------------------------------------- Types --------------------------------------------------------------------------- */ interface WorkspaceOption { id: string; name: string; } interface InviteUserDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onSubmit: (data: InviteUserDto) => Promise; isSubmitting: boolean; workspaces: WorkspaceOption[]; } /* --------------------------------------------------------------------------- Validation --------------------------------------------------------------------------- */ const EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; function validateEmail(value: string): string | null { const trimmed = value.trim(); if (!trimmed) return "Email is required."; if (!EMAIL_REGEX.test(trimmed)) return "Please enter a valid email address."; return null; } /* --------------------------------------------------------------------------- Component --------------------------------------------------------------------------- */ export function InviteUserDialog({ open, onOpenChange, onSubmit, isSubmitting, workspaces, }: InviteUserDialogProps): ReactElement | null { const [email, setEmail] = useState(""); const [name, setName] = useState(""); const [workspaceId, setWorkspaceId] = useState(""); const [role, setRole] = useState("MEMBER"); const [formError, setFormError] = useState(null); function resetForm(): void { setEmail(""); setName(""); setWorkspaceId(""); setRole("MEMBER"); setFormError(null); } async function handleSubmit(e: SyntheticEvent): Promise { e.preventDefault(); setFormError(null); const emailError = validateEmail(email); if (emailError) { setFormError(emailError); return; } try { const dto: InviteUserDto = { email: email.trim(), role, }; const trimmedName = name.trim(); if (trimmedName) dto.name = trimmedName; if (workspaceId) dto.workspaceId = workspaceId; await onSubmit(dto); resetForm(); } catch (err: unknown) { setFormError(err instanceof Error ? err.message : "Failed to send invitation."); } } if (!open) return null; return (
{/* Backdrop */}
{ if (!isSubmitting) { resetForm(); onOpenChange(false); } }} /> {/* Dialog */}

Invite User

Send an invitation to join the platform.

{ void handleSubmit(e); }} > {/* Email */}
) => { setEmail(e.target.value); }} placeholder="user@example.com" maxLength={254} autoFocus />
{/* Name */}
) => { setName(e.target.value); }} placeholder="Full name (optional)" maxLength={255} />
{/* Workspace */} {workspaces.length > 0 && (
)} {/* Role */}
{/* Form error */} {formError !== null && (

{formError}

)} {/* Buttons */}
); }