"use client"; import { useState } from "react"; import { ActionButton } from "@/components/ui/action-button"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; import { TRPCClientError } from "@trpc/client"; import { useForm } from "react-hook-form"; import { z } from "zod"; const createInviteSchema = z.object({ email: z.string().email("Please enter a valid email address"), }); interface CreateInviteDialogProps { children: React.ReactNode; } export default function CreateInviteDialog({ children, }: CreateInviteDialogProps) { const [open, setOpen] = useState(false); const [errorMessage, setErrorMessage] = useState(""); const form = useForm>({ resolver: zodResolver(createInviteSchema), defaultValues: { email: "", }, }); const invalidateInvitesList = api.useUtils().invites.list.invalidate; const createInviteMutation = api.invites.create.useMutation({ onSuccess: () => { toast({ description: "Invite sent successfully", }); invalidateInvitesList(); setOpen(false); form.reset(); setErrorMessage(""); }, onError: (e) => { if (e instanceof TRPCClientError) { setErrorMessage(e.message); } else { setErrorMessage("Failed to send invite"); } }, }); return ( {children} Send User Invitation Send an invitation to a new user to join Karakeep. They'll receive an email with instructions to create their account and will be assigned the "user" role.
{ setErrorMessage(""); await createInviteMutation.mutateAsync(value); })} className="space-y-4" > {errorMessage && (

{errorMessage}

)} ( Email Address )} />
setOpen(false)} > Cancel Send Invitation
); }