import { useRouter } from "next/navigation"; import { zodResolver } from "@hookform/resolvers/zod"; import { t } from "@lingui/core/macro"; import { useEffect } from "react"; import { useForm } from "react-hook-form"; import { HiXMark } from "react-icons/hi2"; import { z } from "zod"; import Button from "~/components/Button"; import Input from "~/components/Input"; import { useModal } from "~/providers/modal"; import { usePopup } from "~/providers/popup"; import { api } from "~/utils/api"; const schema = z.object({ name: z .string() .min(1, { message: t`Template name is required` }) .max(100, { message: t`Template name cannot exceed 100 characters` }), workspacePublicId: z.string(), sourceBoardPublicId: z.string(), }); interface NewBoardInputWithTemplate { name: string; workspacePublicId: string; sourceBoardPublicId: string; } export function NewTemplateForm({ sourceBoardPublicId, workspacePublicId, sourceBoardName, }: { sourceBoardPublicId: string; workspacePublicId: string; sourceBoardName: string; }) { const router = useRouter(); const { closeModal } = useModal(); const { showPopup } = usePopup(); const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(schema), defaultValues: { name: sourceBoardName, workspacePublicId, sourceBoardPublicId, }, }); const createBoard = api.board.create.useMutation({ onSuccess: (newTemplate) => { if (!newTemplate) { showPopup({ header: t`Unable to create template`, message: t`Please try again later, or contact customer support.`, icon: "error", }); } else { router.push(`/templates/${newTemplate.publicId}`); showPopup({ header: t`Template created`, message: t`Template created successfully`, icon: "success", }); } closeModal(); }, onError: () => { showPopup({ header: t`Unable to create template`, message: t`Please try again later, or contact customer support.`, icon: "error", }); }, }); const onSubmit = (data: NewBoardInputWithTemplate) => { createBoard.mutate({ name: data.name, workspacePublicId: data.workspacePublicId, sourceBoardPublicId: data.sourceBoardPublicId, lists: [], labels: [], type: "template", }); }; useEffect(() => { const titleElement: HTMLElement | null = document.querySelector("#name"); if (titleElement) titleElement.focus(); }, []); return (

{t`New template`}

{ if (e.key === "Enter") { e.preventDefault(); await handleSubmit(onSubmit)(); } }} />
); }