"use client"; import { useState } from "react"; import { SystemRole } from "@nexus/shared"; import { trpc } from "~/lib/trpc/client.js"; import { AnimatedModal } from "~/components/ui/AnimatedModal.js"; interface InviteUserModalProps { open: boolean; onClose: () => void; } const ROLE_OPTIONS: { value: SystemRole; label: string }[] = [ { value: SystemRole.USER, label: "User" }, { value: SystemRole.VIEWER, label: "Viewer" }, { value: SystemRole.CONTROLLER, label: "Controller" }, { value: SystemRole.MANAGER, label: "Manager" }, { value: SystemRole.ADMIN, label: "Admin" }, ]; export function InviteUserModal({ open, onClose }: InviteUserModalProps) { const [email, setEmail] = useState(""); const [role, setRole] = useState(SystemRole.USER); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const utils = trpc.useUtils(); const inviteMutation = trpc.invite.createInvite.useMutation({ onSuccess: async () => { await utils.invite.listInvites.invalidate(); setSuccess(true); setEmail(""); setRole(SystemRole.USER); setTimeout(() => { setSuccess(false); onClose(); }, 1500); }, onError: (err) => setError(err.message), }); function handleClose() { setEmail(""); setRole(SystemRole.USER); setError(null); setSuccess(false); onClose(); } async function handleSubmit(e: React.FormEvent) { e.preventDefault(); setError(null); if (!email) { setError("Email is required."); return; } await inviteMutation.mutateAsync({ email, role }); } return (

Invite User

{success ? (
Invitation sent successfully.
) : (
{error && (
{error}
)}
setEmail(e.target.value)} placeholder="user@example.com" required className="w-full rounded-lg border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-900 px-3 py-2 text-sm text-gray-900 dark:text-gray-100 focus:outline-none focus:ring-2 focus:ring-brand-400" />

An invite link valid for 72 hours will be sent to this email address.

)}
); }