import { zodResolver } from "@hookform/resolvers/zod"; import { t } from "@lingui/core/macro"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { HiXMark } from "react-icons/hi2"; import { z } from "zod"; import type { InviteMemberInput } from "@kan/api/types"; import Button from "~/components/Button"; import Input from "~/components/Input"; import Toggle from "~/components/Toggle"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { useWorkspace } from "~/providers/workspace"; import { api } from "~/utils/api"; export function InviteMemberForm() { const utils = api.useUtils(); const [isCreateAnotherEnabled, setIsCreateAnotherEnabled] = useState(false); const { closeModal } = useModal(); const { workspace } = useWorkspace(); const { showPopup } = usePopup(); const InviteMemberSchema = z.object({ email: z.string().email({ message: t`Invalid email address` }), workspacePublicId: z.string(), }); const { register, handleSubmit, reset, formState: { errors }, } = useForm({ defaultValues: { email: "", workspacePublicId: workspace.publicId || "", }, resolver: zodResolver(InviteMemberSchema), }); const refetchBoards = () => utils.board.all.refetch(); const createBoard = api.member.invite.useMutation({ onSuccess: async () => { closeModal(); await utils.workspace.byId.refetch(); await refetchBoards(); }, onError: (error) => { reset(); if (!isCreateAnotherEnabled) closeModal(); if (error.data?.code === "CONFLICT") { showPopup({ header: t`Error inviting member`, message: t`User is already a member of this workspace`, icon: "error", }); } else { showPopup({ header: t`Error inviting member`, message: t`Please try again later, or contact customer support.`, icon: "error", }); } }, }); const onSubmit = (data: InviteMemberInput) => { createBoard.mutate(data); }; useEffect(() => { const emailElement: HTMLElement | null = document.querySelector("#email"); if (emailElement) emailElement.focus(); }, []); return (

{t`Add member`}

{ if (e.key === "Enter") { e.preventDefault(); await handleSubmit(onSubmit)(); } }} errorMessage={errors.email?.message} />
setIsCreateAnotherEnabled(!isCreateAnotherEnabled)} />
); }