UNPKG

pdf-e-signature

Version:

A React component that allows users to select positions for e-signatures on PDFs

129 lines (128 loc) 4.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _reactPdf = require("react-pdf"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const PDFViewer = _ref => { let { pdfUrl, currentPage, numPages, setNumPages, scale, signaturePositions, isSelectingPosition, onPageChange, onScaleChange, onPdfClick, containerRef, viewMode, handleMouseMove, cursorPosition, handleRemoveSign } = _ref; const onDocumentLoadSuccess = _ref2 => { let { numPages } = _ref2; setNumPages(numPages); onPageChange(1); }; if (viewMode === 'view') { return /*#__PURE__*/_react.default.createElement("div", { className: "border border-gray-300 rounded overflow-hidden" }, /*#__PURE__*/_react.default.createElement("iframe", { src: pdfUrl, width: "100%", height: "600px", title: "PDF Preview" })); } return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", { className: "flex justify-between mb-2" }, numPages && /*#__PURE__*/_react.default.createElement("div", { className: "flex space-x-2 items-center" }, /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage <= 1, className: "px-2 py-1 bg-gray-200 rounded disabled:bg-gray-100" }, "Previous"), /*#__PURE__*/_react.default.createElement("span", null, "Page ", currentPage, " of ", numPages), /*#__PURE__*/_react.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= numPages, className: "px-2 py-1 bg-gray-200 rounded disabled:bg-gray-100" }, "Next")), pdfUrl && /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("button", { onClick: () => onScaleChange(scale - 0.2), className: "px-2 py-1 bg-gray-200 rounded mr-1 disabled:bg-gray-100" }, "-"), /*#__PURE__*/_react.default.createElement("span", { className: "mx-1" }, Math.round(scale * 100), "%"), /*#__PURE__*/_react.default.createElement("button", { onClick: () => onScaleChange(scale + 0.2), className: "px-2 py-1 bg-gray-200 rounded ml-1 disabled:bg-gray-100" }, "+"))), /*#__PURE__*/_react.default.createElement("div", { ref: containerRef, className: "border border-gray-300 rounded overflow-auto relative", onClick: onPdfClick, style: { cursor: isSelectingPosition ? 'none' : 'default' }, onMouseMove: handleMouseMove }, /*#__PURE__*/_react.default.createElement(_reactPdf.Document, { file: pdfUrl, onLoadSuccess: onDocumentLoadSuccess }, /*#__PURE__*/_react.default.createElement(_reactPdf.Page, { pageNumber: currentPage, scale: scale, renderTextLayer: false, renderAnnotationLayer: false }), signaturePositions.map((pos, index) => pos.page === currentPage && /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", { key: index, style: { position: 'absolute', left: `${pos.normalizedX * 100}%`, top: `${pos.normalizedY * 100}%`, transform: 'translate(-50%, -50%)', width: `${150}px`, height: `${50}px`, border: '2px dashed #3B82F6', display: 'flex', justifyContent: 'center', alignItems: 'center', zIndex: 1000 } }, /*#__PURE__*/_react.default.createElement("span", { className: "text-sm text-blue-500" }, "Signature ", index + 1), /*#__PURE__*/_react.default.createElement("button", { className: "absolute -top-1 right-2 text-lg text-red-600 cursor-pointer", style: { top: -7, right: 5, color: 'red', fontSize: '22px' }, onClick: () => handleRemoveSign(index) }, "x")))), isSelectingPosition && /*#__PURE__*/_react.default.createElement("div", { className: "custom-cursor absolute pointer-events-none", style: { left: `${cursorPosition.x * 100}%`, top: `${cursorPosition.y * 100}%`, transform: 'translate(-50%, -50%)', width: '150px', height: '50px', border: '2px dashed #666', // borderRadius: '50%', display: 'flex', justifyContent: 'center', alignItems: 'center', backgroundColor: 'rgba(255, 255, 255, 0.3)' } }, /*#__PURE__*/_react.default.createElement("span", { style: { fontSize: '20px', lineHeight: 1 } }, "+"))))); }; var _default = exports.default = PDFViewer;