import { Fragment } from "react"; import { HiChevronUpDown, HiXMark } from "react-icons/hi2"; import { useForm, Controller } from "react-hook-form"; import { Listbox, Transition } from "@headlessui/react"; import { api } from "~/utils/api"; import { useModal } from "~/providers/modal"; import Button from "~/components/Button"; import Input from "~/components/Input"; import Toggle from "~/components/Toggle"; type LabelFormInput = { name: string; colour: Colour; isCreateAnotherEnabled?: boolean; }; type Colour = { name: string; code: string; }; const colours = [ { name: "Teal", code: "#0d9488" }, { name: "Green", code: "#65a30d" }, { name: "Blue", code: "#0284c7" }, { name: "Purple", code: "#4f46e5" }, { name: "Yellow", code: "#ca8a04" }, { name: "Orange", code: "#ea580c" }, { name: "Red", code: "#dc2626" }, { name: "Pink", code: "#db2777" }, ]; export function LabelForm({ cardPublicId, isEdit, }: { cardPublicId: string; isEdit?: boolean; }) { const utils = api.useUtils(); const { closeModal, entityId, openModal } = useModal(); const label = api.label.byPublicId.useQuery( { labelPublicId: entityId, }, { enabled: isEdit && !!entityId, }, ); const { control, register, reset, handleSubmit, setValue, watch } = useForm({ values: { name: isEdit && label?.data?.name ? label?.data?.name : "", colour: (isEdit && label?.data?.colourCode ? colours.find((c) => c.code === label?.data?.colourCode) : colours[0]) as Colour, isCreateAnotherEnabled: false, }, }); const refetchCard = () => utils.card.byId.refetch({ cardPublicId }); const isCreateAnotherEnabled = watch("isCreateAnotherEnabled"); const createLabel = api.label.create.useMutation({ onSuccess: async () => { const currentColourIndex = colours.findIndex( (c) => c.code === watch("colour").code, ); try { await refetchCard(); if (!isCreateAnotherEnabled) closeModal(); reset({ name: "", colour: colours[(currentColourIndex + 1) % colours.length], isCreateAnotherEnabled, }); } catch (e) { console.log(e); } }, }); const updateLabel = api.label.update.useMutation({ onSuccess: async () => { await refetchCard(); closeModal(); reset({ name: "", colour: colours[0], }); }, }); const onSubmit = (values: LabelFormInput) => { if (!values.colour?.code) return; if (isEdit) { updateLabel.mutate({ labelPublicId: label.data?.publicId ?? "", name: values.name, colourCode: values.colour.code, }); } else { createLabel.mutate({ name: values.name, cardPublicId, colourCode: values.colour.code, }); } }; return (

{isEdit ? "Edit label" : "New label"}

( {({ open }) => ( <>
{field.value?.name} {colours.map((colour, index) => ( {() => ( <>
)}
))}
)}
)} />
{!isEdit && ( setValue("isCreateAnotherEnabled", !isCreateAnotherEnabled) } /> )}
{isEdit && ( )}
); }