import { useState } from "react"; import dynamic from "next/dynamic"; import Link from "next/link"; import { useRouter } from "next/router"; import { createField } from "@documenso/features/editor"; import { createOrUpdateField, deleteField } from "@documenso/lib/api"; import { NEXT_PUBLIC_WEBAPP_URL } from "@documenso/lib/constants"; import FieldTypeSelector from "./field-type-selector"; import RecipientSelector from "./recipient-selector"; import { InformationCircleIcon } from "@heroicons/react/24/outline"; const stc = require("string-to-color"); const PDFViewer = dynamic(() => import("./pdf-viewer"), { ssr: false, }); export default function PDFEditor(props: any) { const router = useRouter(); const [fields, setFields] = useState(props.document.Field); const [selectedRecipient, setSelectedRecipient]: any = useState(); const [selectedFieldType, setSelectedFieldType] = useState(); const noRecipients = props?.document.Recipient.length === 0 || props?.document.Recipient.every((e: any) => !e.email); 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 necessary, position 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(); }} onMouseDown={(e: any, page: number) => { if (e.button === 0) addField(e, page); }}>
); function addField(e: any, page: number) { if (!selectedRecipient) return; if (!selectedFieldType) return; if (noRecipients) return; const signatureField = createField(e, page, selectedRecipient, selectedFieldType); createOrUpdateField(props?.document, signatureField).then((res) => { setFields((prevState) => [...prevState, res]); }); } }