import { Fragment, useEffect, useState } from "react"; import { classNames } from "@documenso/lib"; import { localStorage } from "@documenso/lib"; import { Button, IconButton } from "@documenso/ui"; import { Dialog, Transition } from "@headlessui/react"; import { LanguageIcon, PencilIcon, TrashIcon } from "@heroicons/react/24/outline"; import SignatureCanvas from "react-signature-canvas"; import { useDebouncedValue } from "../../hooks/use-debounced-value"; const tabs = [ { name: "Type", icon: LanguageIcon, current: true }, { name: "Draw", icon: PencilIcon, current: false }, ]; export default function SignatureDialog(props: any) { const [currentTab, setCurrentTab] = useState(tabs[0]); const [typedSignature, setTypedSignature] = useState(""); const [signatureEmpty, setSignatureEmpty] = useState(true); // This is a workaround to prevent the canvas from being rendered when the dialog is closed // we also need the debounce to avoid rendering while transitions are occurring. const showCanvas = useDebouncedValue(props.open, 1); let signCanvasRef: any | undefined; useEffect(() => { setTypedSignature(localStorage.getItem("typedSignature") || ""); }, []); return ( <> { props.setOpen(false); setCurrent(tabs[0]); }}>
{isCurrentTab("Type") ? (
{ setTypedSignature(e.target.value); }} className={classNames( typedSignature ? "font-qwigley text-4xl" : "", "focus:border-neon focus:ring-neon mt-14 block h-10 w-full text-center align-bottom text-2xl leading-none" )} placeholder="Kindly type your name" />
) : ( "" )} {isCurrentTab("Draw") ? (
{showCanvas && ( { signCanvasRef = ref; }} canvasProps={{ className: "sigCanvas border-b b-2 border-slate w-full h-full mb-3", }} clearOnResize={true} onEnd={() => { setSignatureEmpty(signCanvasRef?.isEmpty()); }} /> )}
{ signCanvasRef?.clear(); setSignatureEmpty(signCanvasRef?.isEmpty()); }} />
) : ( "" )}
); function isCurrentTab(tabName: string): boolean { return currentTab.name === tabName; } function setCurrent(t: any) { tabs.forEach((tab) => { tab.current = tab.name === t.name; }); setCurrentTab(t); } }