"use client"; import { useState } from "react"; import { Button } from "@unsend/ui/src/button"; import { PlusIcon } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger, } from "@unsend/ui/src/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@unsend/ui/src/select"; import { Input } from "@unsend/ui/src/input"; import { useForm } from "react-hook-form"; import { api } from "~/trpc/react"; import { toast } from "@unsend/ui/src/toaster"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@unsend/ui/src/form"; import { useTeam } from "~/providers/team-context"; import { isCloud, isSelfHosted } from "~/utils/common"; const inviteTeamMemberSchema = z.object({ email: z .string({ required_error: "Email is required" }) .email("Invalid email address"), role: z.enum(["ADMIN", "MEMBER"], { required_error: "Please select a role", }), }); type FormData = z.infer; export default function InviteTeamMember() { const { currentIsAdmin } = useTeam(); const { data: domains } = api.domain.domains.useQuery(); const [open, setOpen] = useState(false); const form = useForm({ resolver: zodResolver(inviteTeamMemberSchema), defaultValues: { email: "", role: "MEMBER", }, }); const utils = api.useUtils(); const createInvite = api.team.createTeamInvite.useMutation(); function onSubmit(values: FormData) { createInvite.mutate( { email: values.email, role: values.role, sendEmail: true, }, { onSuccess: () => { form.reset(); setOpen(false); void utils.team.getTeamInvites.invalidate(); toast.success("Invitation sent successfully"); }, onError: (error) => { console.error(error); toast.error(error.message || "Failed to send invitation"); }, } ); } async function onCopyLink() { createInvite.mutate( { email: form.getValues("email"), role: form.getValues("role"), sendEmail: false, }, { onSuccess: (invite) => { void utils.team.getTeamInvites.invalidate(); navigator.clipboard.writeText( `${location.origin}/join-team?inviteId=${invite.id}` ); form.reset(); setOpen(false); toast.success("Invitation link copied to clipboard"); }, onError: (error) => { console.error(error); toast.error(error.message || "Failed to copy invitation link"); }, } ); } if (!currentIsAdmin) { return null; } return ( Invite Team Member
( Email {formState.errors.email ? ( ) : ( Enter your colleague's email address )} )} /> ( Role )} /> {isSelfHosted() && domains?.length ? (
Will use{" "} hello@{domains[0]?.name} to send invitation
) : null}
{isSelfHosted() ? ( ) : null} {isCloud() || domains?.length ? ( ) : null}
); }