import React, { useEffect, useState } from "react"; import RenderAllPdfPage from "./component/renderAllPdfPage"; import "../css/./signature.css"; import "../css/AddUser.css"; import Title from "./component/Title"; import ModalUi from "../premitives/ModalUi"; import RenderDebugPdf from "./component/RenderDebugPdf"; import { pdfjs } from "react-pdf"; import Alert from "../premitives/Alert"; import HandleError from "./component/HandleError"; import { useWindowSize } from "../hook/useWindowSize"; function processDimensions(x, y, width, height) { if (width < 0) { x -= Math.abs(width); width = Math.abs(width); } if (height < 0) { y -= Math.abs(height); height = Math.abs(height); } return { x: Math.floor(x), y: Math.floor(y), width: Math.floor(width), height: Math.floor(height) }; } const DebugUi = () => { const { width } = useWindowSize(); const [pdf, setPdf] = useState(""); const [isModal, setIsModal] = useState(true); const [allPages, setAllPages] = useState(null); const [pageNumber, setPageNumber] = useState(1); const [pdfLoadFail, setPdfLoadFail] = useState({ status: false, type: "load" }); const [pdfDetails, setPdfDetails] = useState({ name: "", pdftype: "", totalPages: "", currentPage: 1, x: 0, y: 0, base64: "" }); const [hoverCoordinates, setHoverCoordinates] = useState({ x: 0, y: 0 }); const [pdfDimension, setPdfDimension] = useState({ width: 0, height: 0 }); const [annotations, setAnnotations] = useState([]); const [newAnnotation, setNewAnnotation] = useState([]); const [copied, setCopied] = useState(false); useEffect(() => { if (pdf && pdf.name) { const fetchPdfMetadata = async () => { try { const pdfDataURL = URL.createObjectURL(pdf); // Convert File to data URL console.log("pdfDataURL ", pdfDataURL); const pdfInfo = await pdfjs.getDocument({ url: pdfDataURL }).promise; const pdfType = await inferPdfType(pdfInfo); setPdfDetails((prevDetails) => ({ ...prevDetails, pdftype: pdfType })); } catch (error) { console.error("Error fetching PDF metadata:", error); } }; fetchPdfMetadata(); } }, [pdf]); const inferPdfType = async (pdf) => { try { const firstPage = await pdf.getPage(1); const scale = 1; const { width, height } = firstPage.getViewport({ scale }); setPdfDimension({ width: width, height: height }); // Assuming a standard DPI of 72, you can adjust this value if needed const dpi = 72; const widthInInches = width / dpi; const heightInInches = height / dpi; const isA1 = widthInInches > 23.39 && heightInInches > 16.54; const isA2 = widthInInches > 16.54 && heightInInches > 11.69; const isA3 = widthInInches > 11.69 && heightInInches > 8.27; const isA4 = widthInInches > 8.27 && heightInInches > 5.83; const isLegal = widthInInches > 8.5 && heightInInches > 14; const isLetter = widthInInches > 8.5 && heightInInches > 11; const isLedger = widthInInches > 11 && heightInInches > 17; if (isA1) return "A1"; if (isA2) return "A2"; if (isA3) return "A3"; if (isA4) return "A4"; if (isLegal) return "Legal"; if (isLetter) return "Letter"; if (isLedger) return "Ledger"; return "Unknown"; } catch (error) { console.error("Error getting page dimensions:", error); return "Unknown"; } }; const handleSubmit = (e) => { e.preventDefault(); setIsModal(false); setPdfDetails((prevData) => ({ ...prevData, name: pdf?.name })); }; //function for get pdf page details const pageDetails = async ({ numPages }) => { const load = { status: true }; setPdfDetails((prevDetails) => ({ ...prevDetails, totalPages: numPages })); setPdfLoadFail(load); }; const handleMouseMoveDiv = (event) => { setHoverCoordinates({ x: event.nativeEvent.offsetX, y: event.nativeEvent.offsetY }); }; const handleMouseDown = (event) => { if (newAnnotation.length === 0) { const { x, y } = event.target.getStage().getPointerPosition(); setNewAnnotation([ { x, y, width: 0, height: 0, key: "0", page: pageNumber } ]); } }; const handleMouseUp = (event) => { if (newAnnotation.length === 1) { const sx = newAnnotation[0].x; const sy = newAnnotation[0].y; const { x, y } = event.target.getStage().getPointerPosition(); const result = processDimensions(sx, sy, x - sx, y - sy); const annotationToAdd = { ...result, key: annotations.length + 1, page: pageNumber }; annotations.push(annotationToAdd); setNewAnnotation([]); setAnnotations(annotations); setPdfDetails((prevDetails) => ({ ...prevDetails, x: result.x, y: result.y })); } }; const handleMouseMove = (event) => { if (newAnnotation.length === 1) { const sx = newAnnotation[0].x; const sy = newAnnotation[0].y; const { x, y } = event.target.getStage().getPointerPosition(); setNewAnnotation([ { x: sx, y: sy, width: x - sx, height: y - sy, page: pageNumber, key: "0" } ]); } }; const annotationsToDraw = [...annotations, ...newAnnotation]; const handlePageLoadSuccess = (page) => { setPdfDetails((prevDetails) => ({ ...prevDetails, currentPage: page.pageNumber })); }; const copytoclipboard = (text) => { navigator.clipboard.writeText(text); setCopied(true); setTimeout(() => { setCopied(false); }, 1500); // Reset copied state after 1.5 seconds }; const handleFileChange = (files) => { const file = files[0]; setPdf(file); if (file && file.type === "application/pdf") { const reader = new FileReader(); reader.onloadend = () => { const base64String = reader.result.split(",")[1]; setPdfDetails((prevdata) => ({ ...prevdata, base64: base64String })); }; reader.readAsDataURL(file); } }; const handleDelete = (key) => { const updateAnnotations = annotations.filter((x) => x.key !== key); setAnnotations(updateAnnotations); }; return (
{copied && Copied} {width < 800 ? ( <HandleError handleError={"Debug PDF only availble for PC"} /> ) : ( <> {!isModal && ( <div className="signatureContainer"> {/* this component used to render all pdf pages in left side */} <RenderAllPdfPage signPdfUrl={pdf} allPages={allPages} setAllPages={setAllPages} setPageNumber={setPageNumber} pageNumber={pageNumber} /> {/* pdf render view */} <div> <div data-tut="reactourThird"> <RenderDebugPdf pdfUrl={pdf} pageDetails={pageDetails} pageNumber={pageNumber} setPdfLoadFail={setPdfLoadFail} pdfLoadFail={pdfLoadFail} handlePageLoadSuccess={handlePageLoadSuccess} handleMouseMove={handleMouseMove} handleMouseUp={handleMouseUp} handleMouseDown={handleMouseDown} hoverCoordinates={hoverCoordinates} annotations={annotationsToDraw} pdfDimension={pdfDimension} handleMouseMoveDiv={handleMouseMoveDiv} /> </div> </div> <div style={{ backgroundColor: "white", width: 220 }}> <div style={{ fontSize: 18, fontWeight: 500, padding: "10px 12px", borderBottom: "1px solid grey" }} > PDF details </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> Name: {pdfDetails?.name} </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> Pdf type: {pdfDetails?.pdftype} </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> Total Pages: {pdfDetails?.totalPages} </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> Current Page: {pdfDetails?.currentPage} </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> Base64 : {pdfDetails?.base64.slice(0, 10)}... <span style={{ borderRadius: 4, padding: "3px 5px", border: "1px solid gray", fontSize: 12, margin: 2, cursor: "pointer" }} onClick={() => copytoclipboard(pdfDetails?.base64)} > <i className="fa-solid fa-copy"></i> </span> </div> <div style={{ fontSize: 18, fontWeight: 500, padding: "10px 12px", borderBottom: "1px solid grey" }} > Last click </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> x co-ordinate: {pdfDetails?.x} </div> <div style={{ fontSize: 14, padding: "5px 12px" }}> y co-ordinate: {pdfDetails?.y} </div> <div style={{ fontSize: 18, fontWeight: 500, padding: "10px 12px", borderBottom: "1px solid grey", borderTop: "1px solid grey" }} > Annotation </div> <ul style={{ listStyle: "none", padding: 10, height: 500, overflowY: "auto", scrollbarWidth: 5 }} > {annotations.map((coord, index) => ( <li key={index}> <span style={{ fontSize: 13, fontWeight: 500 }}>{`Box ${ index + 1 }:`}</span> <code style={{ fontSize: 12, color: "black", cursor: "pointer" }} > {` ["page":${coord?.page}, "x": ${coord.x}, "y": ${coord.y}, "w": ${coord.width}, "h": ${coord.height}]`} </code> <div> <span style={{ borderRadius: 4, padding: "3px 5px", border: "1px solid gray", fontSize: 12, margin: 2, cursor: "pointer" }} onClick={() => copytoclipboard( `"page":${coord?.page}, "x": ${coord.x}, "y": ${coord.y}, "w": ${coord.width}, "h": ${coord.height}` ) } > <i className="fa-solid fa-copy"></i> </span> <span style={{ borderRadius: 4, padding: "3px 5px", border: "1px solid gray", fontSize: 12, margin: 2, cursor: "pointer" }} onClick={() => handleDelete(coord.key)} > <i className="fa-solid fa-trash-can"></i> </span> </div> </li> ))} </ul> </div> </div> )} <ModalUi title={"Select PDF"} isOpen={isModal}> <form onSubmit={handleSubmit} style={{ margin: "10px" }}> <input type="file" onChange={(e) => handleFileChange(e.target.files)} style={{ width: "100%", border: "1px solid grey", borderRadius: "4px", padding: "5px", fontSize: 12 }} accept=".pdf" required /> <div style={{ borderTop: "1px solid grey", margin: "10px 0" }} ></div> <button style={{ background: "#32a3ac", borderRadius: "2px", boxShadow: "0 2px 4px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.18)", border: "none", textTransform: "uppercase", fontSize: "13px", fontWeight: "600", padding: "0.375rem 0.75rem", textAlign: "center", color: "#ffffff", outline: "none" }} type="submit" > Submit </button> </form> </ModalUi> </> )} </div> ); }; export default DebugUi;