import { NEXT_PUBLIC_WEBAPP_URL } from "@documenso/lib/constants"; import { useRouter } from "next/router"; import dynamic from "next/dynamic"; import { Fragment, useState } from "react"; import toast from "react-hot-toast"; import { FieldType } from "@prisma/client"; import { Listbox, RadioGroup, Transition } from "@headlessui/react"; import { CheckIcon, ChevronUpDownIcon } from "@heroicons/react/24/outline"; import { classNames } from "@documenso/lib"; import { createOrUpdateField, deleteField } from "@documenso/lib/api"; import { createField } from "@documenso/features/editor"; const stc = require("string-to-color"); const PDFViewer = dynamic(() => import("./pdf-viewer"), { ssr: false, }); export default function PDFEditor(props: any) { const router = useRouter(); const [selectedRecipient, setSelectedRecipient]: any = useState( props?.document?.Recipient[0] ); const noRecipients = props?.document?.Recipient?.length === 0; const [fields, setFields] = useState(props.document.Field); const [adding, setAdding] = useState(false); const fieldTypes = [ { name: "Signature" }, { name: "Text" }, { name: "Date" }, ]; const [selectedFieldType, setSelectedFieldType] = useState( fieldTypes[0].name ); function onPositionChangedHandler(position: any, id: any) { if (!position) return; const movedField = fields.find((e) => e.id == id); movedField.positionX = position.x.toFixed(0); movedField.positionY = position.y.toFixed(0); createOrUpdateField(props.document, movedField); // no instant redraw neccessary, postion information for saving or later rerender is enough // setFields(newFields); } function onDeleteHandler(id: any) { const field = fields.find((e) => e.id == id); const fieldIndex = fields.map((item) => item.id).indexOf(id); if (fieldIndex > -1) { const fieldWithoutRemoved = [...fields]; const removedField = fieldWithoutRemoved.splice(fieldIndex, 1); setFields(fieldWithoutRemoved); deleteField(field).catch((err) => { setFields(fieldWithoutRemoved.concat(removedField)); }); } } return ( <>
{ e.preventDefault(); e.stopPropagation(); addField(e, page); }} onMouseDown={(e: any, page: number) => { addField(e, page); }} >
); function addField( e: any, page: number, type: FieldType = FieldType.SIGNATURE ) { const signatureField = createField( e, page, selectedRecipient, FieldType.SIGNATURE ); createOrUpdateField(props?.document, signatureField).then((res) => { setFields(fields.concat(res)); }); } }