import React from "react"; import RSC from "react-scrollbars-custom"; import { Rnd } from "react-rnd"; import { themeColor } from "../../utils/ThemeColor/backColor"; import { Document, Page, pdfjs } from "react-pdf"; import BorderResize from "./borderResize"; import { addZIndex, handleImageResize, handleSignYourselfImageResize } from "../../utils/Utils"; import EmailToast from "./emailToast"; import PlaceholderBorder from "./placeholderBorder"; pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`; function RenderPdf({ pageNumber, pdfOriginalWidth, pdfNewWidth, drop, signerPos, successEmail, nodeRef, handleTabDrag, handleStop, isDragging, setIsSignPad, setIsStamp, handleDeleteSign, setSignKey, pdfDetails, xyPostion, pdfRef, pdfUrl, numPages, pageDetails, recipient, isAlreadySign, pdfRequest, setCurrentSigner, signerObjectId, signedSigners, setPdfLoadFail, placeholder, pdfLoadFail, setSignerPos, setXyPostion, index, containerWH, setIsResize, setZIndex, handleLinkUser, setUniqueId, signersdata, setIsPageCopy, setSignerObjId }) { const isMobile = window.innerWidth < 767; const newWidth = containerWH.width; const scale = isMobile ? pdfOriginalWidth / newWidth : 1; //check isGuestSigner is present in local if yes than handle login flow header in mobile view const isGuestSigner = localStorage.getItem("isGuestSigner"); // handle signature block width and height according to screen const posWidth = (pos, signYourself) => { const defaultWidth = 150; const posWidth = pos.Width ? pos.Width : defaultWidth; let width; if (signYourself) { width = posWidth; return width; } else { if (isMobile) { if (!pos.isMobile) { if (pos.IsResize) { width = posWidth ? posWidth : defaultWidth; return width; } else { width = (posWidth || defaultWidth) / scale; return width; } } else { width = posWidth; return width; } } else { if (pos.isMobile) { if (pos.IsResize) { width = posWidth ? posWidth : defaultWidth; return width; } else { width = (posWidth || defaultWidth) * pos.scale; return width; } } else { width = posWidth ? posWidth : defaultWidth; return width; } } } }; const posHeight = (pos, signYourself) => { let height; const posHeight = pos.Height; const defaultHeight = 60; if (signYourself) { height = posHeight ? posHeight : defaultHeight; return height; } else { if (isMobile) { if (!pos.isMobile) { if (pos.IsResize) { height = posHeight ? posHeight : defaultHeight; return height; } else { height = (posHeight || defaultHeight) / scale; return height; } } else { height = posHeight ? posHeight : defaultHeight; return height; } } else { if (pos.isMobile) { if (pos.IsResize) { height = posHeight ? posHeight : defaultHeight; return height; } else { height = (posHeight || defaultHeight) * pos.scale; return height; } } else { height = posHeight ? posHeight : defaultHeight; return height; } } } }; const xPos = (pos, signYourself) => { const resizePos = pos.xPosition; if (signYourself) { return resizePos; } else { //checking both condition mobile and desktop view if (isMobile) { //if pos.isMobile false -- placeholder saved from desktop view then handle position in mobile view divided by scale if (!pos.isMobile) { return resizePos / scale; } //pos.isMobile true -- placeholder save from mobile view(small device) handle position in mobile view(small screen) view divided by scale else { return resizePos * (pos.scale / scale); } } else { //else if pos.isMobile true -- placeholder saved from mobile or tablet view then handle position in desktop view divide by scale if (pos.isMobile) { return pos.scale && resizePos * pos.scale; } //else placeholder save from desktop(bigscreen) and show in desktop(bigscreen) else { return resizePos; } } } }; const yPos = (pos, signYourself) => { const resizePos = pos.yPosition; if (signYourself) { return resizePos; } else { //checking both condition mobile and desktop view if (isMobile) { //if pos.isMobile false -- placeholder saved from desktop view then handle position in mobile view divided by scale if (!pos.isMobile) { return resizePos / scale; } //pos.isMobile true -- placeholder save from mobile view(small device) handle position in mobile view(small screen) view divided by scale else { return resizePos * (pos.scale / scale); } } else { //else if pos.isMobile true -- placeholder saved from mobile or tablet view then handle position in desktop view divide by scale if (pos.isMobile) { return pos.scale && resizePos * pos.scale; } //else placeholder save from desktop(bigscreen) and show in desktop(bigscreen) else { return resizePos; } } } }; //function for render placeholder block over pdf document const checkSignedSignes = (data) => { const checkSign = signedSigners.filter( (sign) => sign.objectId === data.signerObjId ); if (data.signerObjId === signerObjectId) { setCurrentSigner(true); } return ( checkSign.length === 0 && data.placeHolder.map((placeData, key) => { return ( {placeData.pageNumber === pageNumber && placeData.pos.map((pos, index) => { return ( pos && ( { if (data.signerObjId === signerObjectId) { setIsSignPad(true); setSignKey(pos.key); setIsStamp(pos.isStamp); } }} onResize={(e, direction, ref, delta, position) => { e.stopPropagation(); handleImageResize( ref, pos.key, data.Id, position, signerPos, pageNumber, setSignerPos, pdfOriginalWidth, containerWH, true ); }} lockAspectRatio={ pos.Width ? pos.Width / pos.Height : 2.5 } default={{ x: xPos(pos), y: yPos(pos) }} >
{data.signerObjId === signerObjectId && ( )} {pos.SignUrl ? ( no img { setIsSignPad(true); setSignKey(pos.key); }} src={pos.SignUrl} style={{ width: "99%", height: "100%", objectFit: "contain" }} /> ) : ( pdfDetails[0].Signers.map((signerData, key) => { return ( signerData.objectId === data.signerObjId && (
{signerData.Name}
) ); }) )}
) ); })}
); }) ); }; const PlaceholderDesign = ({ pos, data }) => { return (
{ e.stopPropagation(); setIsPageCopy(true); setSignKey(pos.key); }} style={{ color: "#188ae2" }} > { e.stopPropagation(); if (data) { handleDeleteSign(pos.key, data.signerObjId); } else { handleDeleteSign(pos.key); setIsStamp(false); } }} style={{ color: "#188ae2" }} > {pos.SignUrl ? (
signimg
) : (
{pos.isStamp ? "stamp" : "signature"}
)}
); }; const handleUserName = (signerId, Role) => { if (signerId) { const checkSign = signersdata.find((sign) => sign.objectId === signerId); if (checkSign?.Name) { return ( <>
{checkSign?.Name}
{`(${Role})`}
); } else { return
{Role}
; } } else { return
{Role}
; } }; return ( <> {isMobile && scale ? (
{pdfLoadFail.status && (recipient ? !pdfUrl && !isAlreadySign.mssg && xyPostion.length > 0 && xyPostion.map((data, ind) => { return ( {data.pageNumber === pageNumber && data.pos.map((pos) => { return ( pos && ( { handleSignYourselfImageResize( ref, pos.key, xyPostion, index, setXyPostion ); }} size={{ width: posWidth(pos), height: posHeight(pos) }} lockAspectRatio={ pos.Width ? pos.Width / pos.Height : 2.5 } default={{ x: xPos(pos), y: yPos(pos) }} onClick={() => { setIsSignPad(true); setSignKey(pos.key); setIsStamp( pos?.isStamp ? pos.isStamp : false ); }} > {pos.SignUrl ? ( no img { setIsSignPad(true); setSignKey(pos.key); }} src={pos.SignUrl} style={{ width: "99%", height: "100%", objectFit: "contain" }} /> ) : (
{pos.isStamp ? (
stamp
) : (
signature
)} {handleUserName( data.signerObjId, data.Role )}
)}
) ); })}
); }) : pdfRequest ? signerPos.map((data, key) => { return ( {checkSignedSignes(data)} ); }) : placeholder // placeholder mobile ? signerPos.map((data, ind) => { return ( {data.placeHolder.map((placeData, index) => { return ( {placeData.pageNumber === pageNumber && placeData.pos.map((pos) => { return ( handleTabDrag(pos.key)} size={{ width: posWidth(pos), height: posHeight(pos) }} // size={{ // width: pos.Width ? pos.Width : 150, // height: pos.Height ? pos.Height : 60 // }} lockAspectRatio={ pos.Width ? pos.Width / pos.Height : 2.5 } onDragStop={ (event, dragElement) => handleStop( event, dragElement, data.Id, pos.key ) // data.signerObjId, } // default={{ // x: pos.xPosition, // y: pos.yPosition // }} default={{ x: xPos(pos), y: yPos(pos) }} onResizeStart={() => { setIsResize(true); }} onResizeStop={() => { setIsResize && setIsResize(false); }} onResize={( e, direction, ref, delta, position ) => { handleImageResize( ref, pos.key, data.Id, position, signerPos, pageNumber, setSignerPos, pdfOriginalWidth, containerWH, true ); }} >
{ const dataNewPlace = addZIndex( signerPos, pos.key, setZIndex ); setSignerPos((prevState) => { const newState = [...prevState]; newState.splice( 0, signerPos.length, ...dataNewPlace ); return newState; }); }} > { e.stopPropagation(); handleLinkUser(data.Id); setUniqueId(data.Id); }} onClick={(e) => { e.stopPropagation(); handleLinkUser(data.Id); setUniqueId(data.Id); }} style={{ color: "#188ae2" }} > { e.stopPropagation(); setIsPageCopy(true); setSignKey(pos.key); setSignerObjId(data.signerObjId); setUniqueId(data.Id); }} onClick={(e) => { e.stopPropagation(); setIsPageCopy(true); setSignKey(pos.key); setSignerObjId(data.signerObjId); setUniqueId(data.Id); }} style={{ color: "#188ae2" }} > { e.stopPropagation(); handleDeleteSign( pos.key, data.Id ); // data.signerObjId }} onClick={(e) => { e.stopPropagation(); handleDeleteSign( pos.key, data.Id ); // data.signerObjId }} style={{ color: "#188ae2" }} >
{pos.isStamp ? (
stamp
) : (
signature
)} {handleUserName( data.signerObjId, data.Role )}
); })}
); })}
); }) : xyPostion.map((data, ind) => { return ( {data.pageNumber === pageNumber && data.pos.map((pos) => { return ( pos && ( handleTabDrag(pos.key)} onDragStop={handleStop} onResize={( e, direction, ref, delta, position ) => { handleSignYourselfImageResize( ref, pos.key, xyPostion, index, setXyPostion ); }} >
{ if (!isDragging && isMobile) { setTimeout(() => { e.stopPropagation(); setIsSignPad(true); setSignKey(pos.key); setIsStamp(pos.isStamp); }, 500); } }} > { e.stopPropagation(); setIsPageCopy(true); setSignKey(pos.key); }} style={{ color: "#188ae2" }} > { e.stopPropagation(); if (data) { handleDeleteSign( pos.key, data.signerObjId ); } else { handleDeleteSign(pos.key); setIsStamp(false); } }} style={{ color: "#188ae2" }} > {pos.SignUrl ? (
signimg
) : (
{pos.isStamp ? "stamp" : "signature"}
)}
) ); })}
); }))} {/* this component for render pdf document is in middle of the component */}
{ if (recipient) { setPdfLoadFail(true); } }} onLoadSuccess={pageDetails} ref={pdfRef} file={ pdfUrl ? pdfUrl : pdfDetails[0] && pdfDetails[0].SignedUrl ? pdfDetails[0].SignedUrl : pdfDetails[0].URL } > {Array.from(new Array(numPages), (el, index) => ( { console.log("annotation error", error); }} /> ))}
) : ( pdfNewWidth ? pdfNewWidth : pdfOriginalWidth, height: window.innerHeight - 110 + "px" }} noScrollY={false} noScrollX={pdfNewWidth < pdfOriginalWidth ? false : true} >
{pdfLoadFail.status && (recipient ? !pdfUrl && !isAlreadySign.mssg && xyPostion.length > 0 && xyPostion.map((data, ind) => { return ( {data.pageNumber === pageNumber && data.pos.map((pos) => { return ( pos && ( { handleSignYourselfImageResize( ref, pos.key, xyPostion, index, setXyPostion ); }} key={pos.key} bounds="parent" style={{ cursor: "all-scroll", borderColor: themeColor(), borderStyle: "dashed", borderWidth: "0.1px", zIndex: "1", background: data.blockColor ? data.blockColor : "#daebe0" }} className="signYourselfBlock" size={{ width: posWidth(pos), height: posHeight(pos) }} lockAspectRatio={ pos.Width ? pos.Width / pos.Height : 2.5 } default={{ x: xPos(pos), y: yPos(pos) }} onClick={() => { setIsSignPad(true); setSignKey(pos.key); setIsStamp( pos?.isStamp ? pos.isStamp : false ); }} >
{pos.SignUrl ? ( no img { setIsSignPad(true); setSignKey(pos.key); }} src={pos.SignUrl} style={{ width: "99%", height: "100%", objectFit: "contain" }} /> ) : (
{pos.isStamp ? (
stamp
) : (
signature
)} {handleUserName( data.signerObjId, data.Role )}
)}
) ); })}
); }) : pdfRequest ? signerPos.map((data, key) => { return ( {checkSignedSignes(data)} ); }) : placeholder ? signerPos.map((data, ind) => { return ( {data.placeHolder.map((placeData, index) => { return ( {placeData.pageNumber === pageNumber && placeData.pos.map((pos) => { return ( { const dataNewPlace = addZIndex( signerPos, pos.key, setZIndex ); setSignerPos((prevState) => { const newState = [...prevState]; newState.splice( 0, signerPos.length, ...dataNewPlace ); return newState; }); }} key={pos.key} enableResizing={{ top: false, right: false, bottom: false, left: false, topRight: false, bottomRight: true, bottomLeft: false, topLeft: false }} bounds="parent" style={{ cursor: "all-scroll", background: data.blockColor, zIndex: pos.zIndex }} className="signYourselfBlock" onDrag={() => handleTabDrag(pos.key)} size={{ width: posWidth(pos), height: posHeight(pos) }} lockAspectRatio={ pos.Width ? pos.Width / pos.Height : 2.5 } onDragStop={ (event, dragElement) => handleStop( event, dragElement, data.Id, pos.key ) // data.signerObjId, } // default={{ // x: pos.xPosition, // y: pos.yPosition // }} default={{ x: xPos(pos), y: yPos(pos) }} onResizeStart={() => { setIsResize(true); }} onResizeStop={() => { setIsResize && setIsResize(false); }} onResize={( e, direction, ref, delta, position ) => { e.stopPropagation(); handleImageResize( ref, pos.key, data.Id, //data.signerObjId, position, signerPos, pageNumber, setSignerPos, pdfOriginalWidth, containerWH, false ); }} >
{ e.stopPropagation(); handleLinkUser(data.Id); setUniqueId(data.Id); }} style={{ color: "#188ae2" }} > { e.stopPropagation(); setIsPageCopy(true); setSignKey(pos.key); setUniqueId(data.Id); setSignerObjId( data.signerObjId ); }} style={{ color: "#188ae2" }} > { e.stopPropagation(); handleDeleteSign( pos.key, data.Id ); // data.signerObjId }} style={{ color: "#188ae2" }} >
{pos.isStamp ? (
stamp
) : (
signature
)} {handleUserName( data.signerObjId, data.Role )}
); })}
); })}
); }) : xyPostion.map((data, ind) => { return ( {data.pageNumber === pageNumber && data.pos.map((pos) => { return ( pos && ( handleTabDrag(pos.key)} size={{ width: pos.Width ? pos.Width : 150, height: pos.Height ? pos.Height : 60 }} onDragStop={handleStop} default={{ x: pos.xPosition, y: pos.yPosition }} onClick={() => { if (!isDragging) { setIsSignPad(true); setSignKey(pos.key); setIsStamp(pos.isStamp); } }} onResize={( e, direction, ref, delta, position ) => { e.stopPropagation(); handleSignYourselfImageResize( ref, pos.key, xyPostion, index, setXyPostion ); }} > ) ); })} ); }))} {/* this component for render pdf document is in middle of the component */} { if (recipient) { const load = { status: false, type: "failed" }; setPdfLoadFail(load); } }} onLoadSuccess={pageDetails} ref={pdfRef} file={ pdfUrl ? pdfUrl : pdfDetails[0] && pdfDetails[0].SignedUrl ? pdfDetails[0].SignedUrl : pdfDetails[0].URL } > {Array.from(new Array(numPages), (el, index) => ( { console.log("annotation error", error); }} /> ))}
)} ); } export default RenderPdf;