@signiphi/pdf-signer 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALLING_LOCALLY.md +184 -0
- package/LICENSE +2 -0
- package/README.md +1093 -0
- package/assets/viewer.html +314 -0
- package/dist/__tests__/helpers/fixtures.d.ts +43 -0
- package/dist/__tests__/helpers/fixtures.d.ts.map +1 -0
- package/dist/__tests__/helpers/mocks.d.ts +333 -0
- package/dist/__tests__/helpers/mocks.d.ts.map +1 -0
- package/dist/__tests__/setup.d.ts +6 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/components/AttachmentUpload.d.ts +17 -0
- package/dist/components/AttachmentUpload.d.ts.map +1 -0
- package/dist/components/EditableFieldsPanel.d.ts +30 -0
- package/dist/components/EditableFieldsPanel.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +67 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/FormFieldsView.d.ts +42 -0
- package/dist/components/FormFieldsView.d.ts.map +1 -0
- package/dist/components/PdfViewerStyled.d.ts +16 -0
- package/dist/components/PdfViewerStyled.d.ts.map +1 -0
- package/dist/components/PoweredBySigniphi.d.ts +11 -0
- package/dist/components/PoweredBySigniphi.d.ts.map +1 -0
- package/dist/components/SignatureCanvas.d.ts +12 -0
- package/dist/components/SignatureCanvas.d.ts.map +1 -0
- package/dist/components/SignatureInitialsBox.d.ts +23 -0
- package/dist/components/SignatureInitialsBox.d.ts.map +1 -0
- package/dist/components/SignatureModal.d.ts +22 -0
- package/dist/components/SignatureModal.d.ts.map +1 -0
- package/dist/components/SigningInstructions.d.ts +12 -0
- package/dist/components/SigningInstructions.d.ts.map +1 -0
- package/dist/components/SubmissionForm.d.ts +52 -0
- package/dist/components/SubmissionForm.d.ts.map +1 -0
- package/dist/components/ViewToggleToolbar.d.ts +30 -0
- package/dist/components/ViewToggleToolbar.d.ts.map +1 -0
- package/dist/components/form-fields/CheckboxRenderer.d.ts +10 -0
- package/dist/components/form-fields/CheckboxRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/DateFieldRenderer.d.ts +14 -0
- package/dist/components/form-fields/DateFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/DropdownRenderer.d.ts +14 -0
- package/dist/components/form-fields/DropdownRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/FormFieldRenderer.d.ts +20 -0
- package/dist/components/form-fields/FormFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/InitialsFieldRenderer.d.ts +14 -0
- package/dist/components/form-fields/InitialsFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/RadioGroupRenderer.d.ts +10 -0
- package/dist/components/form-fields/RadioGroupRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/SignatureFieldRenderer.d.ts +16 -0
- package/dist/components/form-fields/SignatureFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/TextFieldRenderer.d.ts +14 -0
- package/dist/components/form-fields/TextFieldRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/TextLabelRenderer.d.ts +14 -0
- package/dist/components/form-fields/TextLabelRenderer.d.ts.map +1 -0
- package/dist/components/form-fields/index.d.ts +14 -0
- package/dist/components/form-fields/index.d.ts.map +1 -0
- package/dist/components/index.d.ts +14 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +6297 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +6248 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/core/PdfViewerCore.d.ts +19 -0
- package/dist/core/PdfViewerCore.d.ts.map +1 -0
- package/dist/core/SignatureCaptureCore.d.ts +37 -0
- package/dist/core/SignatureCaptureCore.d.ts.map +1 -0
- package/dist/core/index.d.ts +3 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +907 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +884 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +2167 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/index.mjs +2139 -0
- package/dist/hooks/index.mjs.map +1 -0
- package/dist/hooks/useAttachments.d.ts +25 -0
- package/dist/hooks/useAttachments.d.ts.map +1 -0
- package/dist/hooks/useFieldFiltering.d.ts +29 -0
- package/dist/hooks/useFieldFiltering.d.ts.map +1 -0
- package/dist/hooks/useFormFields.d.ts +23 -0
- package/dist/hooks/useFormFields.d.ts.map +1 -0
- package/dist/hooks/useMultiSignerContext.d.ts +25 -0
- package/dist/hooks/useMultiSignerContext.d.ts.map +1 -0
- package/dist/hooks/usePdfViewer.d.ts +52 -0
- package/dist/hooks/usePdfViewer.d.ts.map +1 -0
- package/dist/hooks/useSignatureCapture.d.ts +17 -0
- package/dist/hooks/useSignatureCapture.d.ts.map +1 -0
- package/dist/hooks/useSignatures.d.ts +25 -0
- package/dist/hooks/useSignatures.d.ts.map +1 -0
- package/dist/index.css +4929 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7220 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7093 -0
- package/dist/index.mjs.map +1 -0
- package/dist/integrations/index.d.ts +6 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +242 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/index.mjs +218 -0
- package/dist/integrations/index.mjs.map +1 -0
- package/dist/integrations/next-config.d.ts +46 -0
- package/dist/integrations/next-config.d.ts.map +1 -0
- package/dist/integrations/vite-plugin.d.ts +48 -0
- package/dist/integrations/vite-plugin.d.ts.map +1 -0
- package/dist/lib/index.d.ts +3 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/ui/alert.d.ts +9 -0
- package/dist/lib/ui/alert.d.ts.map +1 -0
- package/dist/lib/ui/button.d.ts +12 -0
- package/dist/lib/ui/button.d.ts.map +1 -0
- package/dist/lib/ui/calendar.d.ts +10 -0
- package/dist/lib/ui/calendar.d.ts.map +1 -0
- package/dist/lib/ui/card.d.ts +9 -0
- package/dist/lib/ui/card.d.ts.map +1 -0
- package/dist/lib/ui/checkbox.d.ts +5 -0
- package/dist/lib/ui/checkbox.d.ts.map +1 -0
- package/dist/lib/ui/dialog.d.ts +20 -0
- package/dist/lib/ui/dialog.d.ts.map +1 -0
- package/dist/lib/ui/index.d.ts +12 -0
- package/dist/lib/ui/index.d.ts.map +1 -0
- package/dist/lib/ui/input.d.ts +6 -0
- package/dist/lib/ui/input.d.ts.map +1 -0
- package/dist/lib/ui/label.d.ts +6 -0
- package/dist/lib/ui/label.d.ts.map +1 -0
- package/dist/lib/ui/popover.d.ts +7 -0
- package/dist/lib/ui/popover.d.ts.map +1 -0
- package/dist/lib/ui/radio-group.d.ts +6 -0
- package/dist/lib/ui/radio-group.d.ts.map +1 -0
- package/dist/lib/ui/select.d.ts +14 -0
- package/dist/lib/ui/select.d.ts.map +1 -0
- package/dist/lib/utils.d.ts +7 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/styles/index.css +5004 -0
- package/dist/types/index.d.ts +265 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/index.mjs +23 -0
- package/dist/types/index.mjs.map +1 -0
- package/dist/utils/attachment-validators.d.ts +118 -0
- package/dist/utils/attachment-validators.d.ts.map +1 -0
- package/dist/utils/audit-trail.d.ts +27 -0
- package/dist/utils/audit-trail.d.ts.map +1 -0
- package/dist/utils/date-validation.d.ts +30 -0
- package/dist/utils/date-validation.d.ts.map +1 -0
- package/dist/utils/errors.d.ts +106 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/field-extraction.d.ts +27 -0
- package/dist/utils/field-extraction.d.ts.map +1 -0
- package/dist/utils/field-visibility.d.ts +104 -0
- package/dist/utils/field-visibility.d.ts.map +1 -0
- package/dist/utils/index.d.ts +17 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +2501 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +2404 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/pdf-field-type-helpers.d.ts +78 -0
- package/dist/utils/pdf-field-type-helpers.d.ts.map +1 -0
- package/dist/utils/pdf-helpers.d.ts +38 -0
- package/dist/utils/pdf-helpers.d.ts.map +1 -0
- package/dist/utils/pdf-lib-loader.d.ts +45 -0
- package/dist/utils/pdf-lib-loader.d.ts.map +1 -0
- package/dist/utils/pdf-manipulation.d.ts +93 -0
- package/dist/utils/pdf-manipulation.d.ts.map +1 -0
- package/dist/utils/pdf-validators.d.ts +149 -0
- package/dist/utils/pdf-validators.d.ts.map +1 -0
- package/dist/utils/pdf-viewer-filter.d.ts +35 -0
- package/dist/utils/pdf-viewer-filter.d.ts.map +1 -0
- package/dist/utils/pdf-widget-helpers.d.ts +98 -0
- package/dist/utils/pdf-widget-helpers.d.ts.map +1 -0
- package/dist/utils/pdfjs-config.d.ts +56 -0
- package/dist/utils/pdfjs-config.d.ts.map +1 -0
- package/dist/utils/pdfjs-version-check.d.ts +28 -0
- package/dist/utils/pdfjs-version-check.d.ts.map +1 -0
- package/dist/utils/performance-monitor.d.ts +172 -0
- package/dist/utils/performance-monitor.d.ts.map +1 -0
- package/dist/utils/tracking.d.ts +89 -0
- package/dist/utils/tracking.d.ts.map +1 -0
- package/package.json +180 -0
- package/scripts/analyze-bundle.js +271 -0
- package/scripts/copy-utils.js +227 -0
- package/scripts/copy-utils.test.js +164 -0
- package/scripts/postinstall.js +109 -0
- package/scripts/setup.js +108 -0
- package/src/styles/index.css +139 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/pdfjs-config.ts","../../src/utils/pdfjs-version-check.ts","../../src/utils/logger.ts","../../src/core/PdfViewerCore.tsx","../../src/core/SignatureCaptureCore.tsx"],"names":["pdfjsLib2","forwardRef","useRef","useState","useEffect","useCallback","useImperativeHandle","jsx","Fragment"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * PDF.js Configuration Provider\r\n * Manages global configuration for PDF.js worker and viewer paths\r\n * \r\n * COMPATIBILITY NOTE: This module is designed to work with both Vite and Next.js/webpack.\r\n * The worker source URL is computed lazily to avoid issues with webpack's handling of import.meta.\r\n */\r\n\r\nimport type { PdfJsConfig } from '../types';\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\n/**\r\n * CDN paths for PDF.js (exported for manual fallback configuration)\r\n * Note: CDN URLs may cause CORS issues in some environments\r\n * \r\n * @example\r\n * // Manually configure CDN (not recommended)\r\n * setPdfJsConfig({ \r\n * viewerBasePath: CDN_VIEWER,\r\n * workerSrc: CDN_WORKER \r\n * });\r\n */\r\nexport const CDN_WORKER = 'https://cdn.jsdelivr.net/npm/pdfjs-dist@5.3.93/build/pdf.worker.mjs';\r\nexport const CDN_VIEWER = 'https://mozilla.github.io/pdf.js';\r\n\r\n/**\r\n * Internal flag to track if worker source has been computed\r\n */\r\nlet _workerSrcComputed = false;\r\nlet _cachedWorkerSrc: string | null = null;\r\n\r\n/**\r\n * Get the worker source URL (computed lazily to avoid webpack import.meta issues)\r\n * - In browser environments, the bundler resolves the URL from node_modules\r\n * - The worker is loaded from the user's bundle (no CORS issues)\r\n * \r\n * This function uses lazy evaluation to avoid triggering webpack's\r\n * \"Critical dependency: Accessing import.meta directly is unsupported\" warning\r\n * at module load time.\r\n */\r\nfunction getDefaultWorkerSrc(): string {\r\n // Return cached value if already computed\r\n if (_workerSrcComputed && _cachedWorkerSrc !== null) {\r\n return _cachedWorkerSrc;\r\n }\r\n\r\n // Default fallback\r\n let workerSrc = '/pdfjs/build/pdf.worker.mjs';\r\n\r\n // Only attempt import.meta resolution in browser environment\r\n if (typeof window !== 'undefined' && typeof URL !== 'undefined') {\r\n try {\r\n // Check if import.meta is available (ESM environment like Vite)\r\n // Use indirect access to avoid webpack static analysis issues\r\n const meta = (function() {\r\n try {\r\n // This pattern avoids webpack's direct import.meta detection\r\n return new Function('return import.meta')();\r\n } catch {\r\n return null;\r\n }\r\n })();\r\n\r\n if (meta && meta.url) {\r\n workerSrc = new URL('pdfjs-dist/build/pdf.worker.mjs', meta.url).href;\r\n }\r\n } catch {\r\n // Fallback for environments that don't support import.meta.url (Next.js/webpack)\r\n // Use the public path fallback\r\n }\r\n }\r\n\r\n // Cache the result\r\n _workerSrcComputed = true;\r\n _cachedWorkerSrc = workerSrc;\r\n\r\n return workerSrc;\r\n}\r\n\r\n/**\r\n * Default configuration for PDF.js\r\n * \r\n * By default, the package uses:\r\n * - Worker: Loaded from node_modules (bundled by your build tool)\r\n * - Viewer: Served from /pdfjs/ (automatically copied by postinstall)\r\n * \r\n * The postinstall script automatically copies viewer files to your public/pdfjs/ directory.\r\n * If setup fails, run: npx signiphi-setup\r\n * \r\n * NOTE: workerSrc is initialized to null and computed lazily on first access\r\n * to ensure compatibility with Next.js/webpack environments.\r\n */\r\nlet globalConfig: Required<PdfJsConfig> = {\r\n viewerBasePath: '/pdfjs',\r\n workerSrc: '', // Lazy-initialized below\r\n};\r\n\r\n// Flag to track if globalConfig.workerSrc has been initialized\r\nlet _configInitialized = false;\r\n\r\n/**\r\n * Ensure config is initialized (called lazily)\r\n */\r\nfunction ensureConfigInitialized(): void {\r\n if (!_configInitialized) {\r\n globalConfig.workerSrc = getDefaultWorkerSrc();\r\n _configInitialized = true;\r\n \r\n // Initialize PDF.js worker in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Set PDF.js configuration\r\n * @param config - Partial configuration to merge with defaults\r\n * \r\n * @example\r\n * // Use self-hosted PDF.js files\r\n * setPdfJsConfig({ viewerBasePath: '/pdfjs' });\r\n * \r\n * @example\r\n * // Use custom CDN\r\n * setPdfJsConfig({ \r\n * viewerBasePath: 'https://my-cdn.com/pdfjs',\r\n * workerSrc: 'https://my-cdn.com/pdfjs/build/pdf.worker.mjs'\r\n * });\r\n */\r\nexport function setPdfJsConfig(config: Partial<PdfJsConfig>): void {\r\n // Ensure default config is computed first\r\n ensureConfigInitialized();\r\n \r\n if (config.viewerBasePath !== undefined) {\r\n globalConfig.viewerBasePath = config.viewerBasePath;\r\n }\r\n \r\n if (config.workerSrc !== undefined) {\r\n globalConfig.workerSrc = config.workerSrc;\r\n } else if (config.viewerBasePath !== undefined) {\r\n // Auto-update workerSrc based on viewerBasePath\r\n globalConfig.workerSrc = `${config.viewerBasePath}/build/pdf.worker.mjs`;\r\n }\r\n\r\n // Update PDF.js worker if in browser environment\r\n if (typeof window !== 'undefined') {\r\n pdfjsLib.GlobalWorkerOptions.workerSrc = globalConfig.workerSrc;\r\n }\r\n}\r\n\r\n/**\r\n * Get current PDF.js configuration\r\n * @returns Current configuration\r\n */\r\nexport function getPdfJsConfig(): Required<PdfJsConfig> {\r\n // Ensure config is initialized before returning\r\n ensureConfigInitialized();\r\n return { ...globalConfig };\r\n}\r\n\r\n/**\r\n * Reset configuration to defaults (local files)\r\n */\r\nexport function resetPdfJsConfig(): void {\r\n // Clear cached worker src to force recomputation\r\n _workerSrcComputed = false;\r\n _cachedWorkerSrc = null;\r\n _configInitialized = false;\r\n \r\n // Re-initialize with fresh defaults\r\n ensureConfigInitialized();\r\n}\r\n\r\n/**\r\n * Initialize PDF.js configuration\r\n * This is called automatically when the first PDF operation is attempted,\r\n * but can also be called manually to pre-initialize the configuration.\r\n * \r\n * Unlike previous versions, this does NOT run at module load time to\r\n * ensure compatibility with Next.js/webpack environments.\r\n */\r\nexport function initializePdfJs(): void {\r\n ensureConfigInitialized();\r\n}\r\n\r\n","/**\r\n * PDF.js Version Check Utility\r\n * Detects version mismatches between viewer and worker\r\n */\r\n\r\nimport * as pdfjsLib from 'pdfjs-dist';\r\n\r\nexport interface PdfJsVersionCheckResult {\r\n viewerExists: boolean;\r\n versionMatch: boolean;\r\n viewerVersion?: string;\r\n workerVersion: string;\r\n errorMessage?: string;\r\n}\r\n\r\n/**\r\n * Check if PDF.js viewer files exist and versions match\r\n * @param viewerBasePath - Base path for the viewer (e.g., '/pdfjs')\r\n * @returns Version check result\r\n */\r\nexport async function checkPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const workerVersion = pdfjsLib.version;\r\n \r\n try {\r\n // Check if .version file exists\r\n const versionUrl = `${viewerBasePath}/.version`;\r\n const response = await fetch(versionUrl);\r\n \r\n if (!response.ok) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'PDF.js viewer files not found. Run: npx signiphi-setup',\r\n };\r\n }\r\n \r\n const viewerVersion = (await response.text()).trim();\r\n const versionMatch = viewerVersion === workerVersion;\r\n \r\n if (!versionMatch) {\r\n return {\r\n viewerExists: true,\r\n versionMatch: false,\r\n viewerVersion,\r\n workerVersion,\r\n errorMessage: `Version mismatch: viewer=${viewerVersion}, worker=${workerVersion}. Run: npx signiphi-setup`,\r\n };\r\n }\r\n \r\n return {\r\n viewerExists: true,\r\n versionMatch: true,\r\n viewerVersion,\r\n workerVersion,\r\n };\r\n } catch (error) {\r\n return {\r\n viewerExists: false,\r\n versionMatch: false,\r\n workerVersion,\r\n errorMessage: 'Unable to check PDF.js version. Viewer files may not be installed.',\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Log version check warnings to console\r\n * @param result - Version check result\r\n */\r\nexport function logVersionCheckWarning(result: PdfJsVersionCheckResult): void {\r\n if (!result.viewerExists) {\r\n console.warn(\r\n '⚠️ PDF.js viewer files not found.\\n' +\r\n 'The PDF viewer requires viewer files to be installed.\\n' +\r\n 'Run: npx signiphi-setup\\n' +\r\n 'Or reinstall the package: npm install @signiphi/pdf-signer'\r\n );\r\n } else if (!result.versionMatch) {\r\n console.warn(\r\n `⚠️ PDF.js version mismatch detected:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n 'Run: npx signiphi-setup to sync versions'\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Check version and log warnings automatically\r\n * @param viewerBasePath - Base path for the viewer\r\n */\r\nexport async function checkAndLogPdfJsVersion(\r\n viewerBasePath: string = '/pdfjs'\r\n): Promise<PdfJsVersionCheckResult> {\r\n const result = await checkPdfJsVersion(viewerBasePath);\r\n \r\n if (!result.viewerExists || !result.versionMatch) {\r\n logVersionCheckWarning(result);\r\n }\r\n \r\n return result;\r\n}\r\n\r\n","/**\r\n * Logger Utility\r\n * Centralized logging system with environment-based log level control\r\n */\r\n\r\ntype LogLevel = 'debug' | 'info' | 'warn' | 'error';\r\n\r\ninterface Logger {\r\n debug(message: string, ...args: unknown[]): void;\r\n info(message: string, ...args: unknown[]): void;\r\n warn(message: string, ...args: unknown[]): void;\r\n error(message: string, ...args: unknown[]): void;\r\n}\r\n\r\n/**\r\n * Determines if the current environment is production\r\n */\r\nfunction isProduction(): boolean {\r\n return typeof process !== 'undefined' && process.env.NODE_ENV === 'production';\r\n}\r\n\r\n/**\r\n * Creates a formatted log prefix\r\n */\r\nfunction createPrefix(level: LogLevel): string {\r\n return `[@signiphi/pdf-signer] [${level.toUpperCase()}]`;\r\n}\r\n\r\n/**\r\n * Creates the logger instance with environment-based behavior\r\n */\r\nfunction createLogger(): Logger {\r\n const isProd = isProduction();\r\n\r\n return {\r\n debug(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('debug'), message, ...args);\r\n }\r\n },\r\n\r\n info(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.log(createPrefix('info'), message, ...args);\r\n }\r\n },\r\n\r\n warn(message: string, ...args: unknown[]): void {\r\n if (!isProd) {\r\n console.warn(createPrefix('warn'), message, ...args);\r\n }\r\n },\r\n\r\n error(message: string, ...args: unknown[]): void {\r\n // Errors are shown in both development and production\r\n console.error(createPrefix('error'), message, ...args);\r\n },\r\n };\r\n}\r\n\r\n/**\r\n * Singleton logger instance\r\n */\r\nexport const logger = createLogger();\r\n\r\n\r\n\r\n","import { useRef, useCallback, forwardRef, useImperativeHandle, useState, useEffect } from 'react';\r\nimport type { PdfViewerRef, PDFViewerApplication } from '../types';\r\nimport { getPdfJsConfig, initializePdfJs } from '../utils/pdfjs-config';\r\nimport { checkPdfJsVersion } from '../utils/pdfjs-version-check';\r\nimport { logger } from '../utils';\r\n\r\n/**\r\n * Props for the headless PDF viewer core component\r\n */\r\nexport interface PdfViewerCoreProps {\r\n onLoad?: () => void;\r\n onError?: (error: string) => void;\r\n pdfjsBasePath?: string; // Override default PDF.js path (defaults to CDN)\r\n children: (props: {\r\n iframeRef: React.RefObject<HTMLIFrameElement>;\r\n handleIframeLoad: () => void;\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless PDF viewer core component\r\n * Provides PDF loading and form field extraction logic without any UI\r\n */\r\nexport const PdfViewerCore = forwardRef<PdfViewerRef, PdfViewerCoreProps>(\r\n ({ onLoad, onError, pdfjsBasePath, children }, ref) => {\r\n const iframeRef = useRef<HTMLIFrameElement>(null);\r\n const loadedPdfUrl = useRef<string | null>(null);\r\n const initializationPromise = useRef<Promise<void> | null>(null);\r\n const isLoadingRef = useRef<boolean>(false);\r\n const [versionChecked, setVersionChecked] = useState(false);\r\n const [setupError, setSetupError] = useState<string | null>(null);\r\n\r\n const getPDFViewerApplication = useCallback((): PDFViewerApplication | null => {\r\n try {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return null;\r\n }\r\n\r\n const PDFViewerApplication = (\r\n iframe.contentWindow as Window & { PDFViewerApplication: PDFViewerApplication }\r\n ).PDFViewerApplication;\r\n if (!PDFViewerApplication) {\r\n return null;\r\n }\r\n\r\n return PDFViewerApplication;\r\n } catch (error) {\r\n logger.error('Error accessing PDFViewerApplication:', error);\r\n return null;\r\n }\r\n }, []);\r\n\r\n const waitForInitialization = useCallback(async () => {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (!PDFViewerApplication) {\r\n throw new Error('PDFViewerApplication not available');\r\n }\r\n\r\n // Wait for the viewer to be initialized\r\n if (PDFViewerApplication.initializedPromise) {\r\n await PDFViewerApplication.initializedPromise;\r\n }\r\n\r\n // Wait for the document to be loaded\r\n if (PDFViewerApplication.pdfLoadingTask) {\r\n await PDFViewerApplication.pdfLoadingTask.promise;\r\n }\r\n\r\n return PDFViewerApplication;\r\n }, [getPDFViewerApplication]);\r\n\r\n const loadPdf = useCallback(\r\n async (pdfUrl: string) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe) {\r\n logger.error('PDF viewer iframe not available');\r\n return;\r\n }\r\n\r\n // Prevent loading the same PDF multiple times or loading while already loading\r\n if (isLoadingRef.current || loadedPdfUrl.current === pdfUrl) {\r\n return;\r\n }\r\n\r\n isLoadingRef.current = true;\r\n loadedPdfUrl.current = pdfUrl;\r\n\r\n try {\r\n // Initialize PDF.js configuration (lazy, only runs once)\r\n // This ensures the worker is configured before any PDF operations\r\n initializePdfJs();\r\n \r\n // Fetch the PDF data first to avoid CORS issues\r\n const response = await fetch(pdfUrl);\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch PDF: ${response.status}`);\r\n }\r\n\r\n const pdfBytes = await response.arrayBuffer();\r\n\r\n // Create a blob URL for the PDF data\r\n const blob = new Blob([pdfBytes], { type: 'application/pdf' });\r\n const blobUrl = URL.createObjectURL(blob);\r\n\r\n // Get PDF.js base path (use prop override or global config)\r\n const config = getPdfJsConfig();\r\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\r\n\r\n // Load the PDF.js viewer with the blob URL\r\n const viewerUrl = `${basePath}/web/viewer.html?file=${encodeURIComponent(blobUrl)}`;\r\n iframe.src = viewerUrl;\r\n\r\n // Create a new initialization promise\r\n initializationPromise.current = new Promise((resolve, reject) => {\r\n const checkInitialization = () => {\r\n try {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (PDFViewerApplication && PDFViewerApplication.initializedPromise) {\r\n PDFViewerApplication.initializedPromise.then(() => {\r\n resolve();\r\n }).catch(reject);\r\n } else {\r\n // Retry after a short delay\r\n setTimeout(checkInitialization, 100);\r\n }\r\n } catch (error) {\r\n reject(error);\r\n }\r\n };\r\n\r\n // Start checking after iframe loads\r\n setTimeout(checkInitialization, 500);\r\n });\r\n } catch (error) {\r\n logger.error('Error fetching PDF:', error);\r\n isLoadingRef.current = false;\r\n onError?.(error instanceof Error ? error.message : 'Unknown error');\r\n }\r\n },\r\n [getPDFViewerApplication, onError, pdfjsBasePath]\r\n );\r\n\r\n const getFormFieldValues = useCallback(async (): Promise<Record<string, string>> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return {};\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n const values: Record<string, string> = {};\r\n\r\n // Use the PDF.js API to extract form field values\r\n if (pdfDocument.annotationStorage) {\r\n const annotationStorage = pdfDocument.annotationStorage;\r\n\r\n // Get field objects to understand form structure\r\n let fieldObjects: Record<string, unknown[]> = {};\r\n try {\r\n if (pdfDocument.getFieldObjects) {\r\n const result = await pdfDocument.getFieldObjects();\r\n fieldObjects = result || {};\r\n }\r\n } catch (error) {\r\n logger.warn('Error getting field objects:', error);\r\n }\r\n\r\n // Create mapping from field IDs to names and store field info with widgets\r\n type PDFField = {\r\n id?: string;\r\n type?: string;\r\n value?: unknown;\r\n exportValue?: string;\r\n buttonValue?: string;\r\n defaultValue?: unknown;\r\n name?: string;\r\n };\r\n \r\n type RadioButtonData = {\r\n id: string;\r\n data: unknown;\r\n widget?: PDFField;\r\n };\r\n\r\n const idToNameMap: Record<string, string> = {};\r\n const fieldInfo: Record<string, { type: string; widgets: PDFField[] }> = {};\r\n \r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n const fieldArray = fields as PDFField[];\r\n \r\n // Store field type and ALL widgets (critical for radio buttons)\r\n fieldInfo[name] = {\r\n type: fieldArray[0]?.type || '',\r\n widgets: fieldArray\r\n };\r\n \r\n // Create ID to name mapping\r\n for (const field of fieldArray) {\r\n if (field.id) {\r\n idToNameMap[field.id] = name;\r\n }\r\n }\r\n }\r\n\r\n // Get annotation storage data\r\n let storedData: Record<string, unknown> = {};\r\n if (annotationStorage.serializable && annotationStorage.serializable.map) {\r\n const storageMap = annotationStorage.serializable.map;\r\n for (const [key, value] of storageMap.entries()) {\r\n storedData[key] = value;\r\n }\r\n } else if (typeof annotationStorage.getAll === 'function') {\r\n storedData = annotationStorage.getAll();\r\n }\r\n\r\n // Group radio button widgets by field name (Dockmaster approach)\r\n const radioGroups: Record<string, RadioButtonData[]> = {};\r\n \r\n // First pass: identify and group radio buttons from annotationStorage\r\n for (const [id, data] of Object.entries(storedData)) {\r\n const fieldName = idToNameMap[id];\r\n if (!fieldName) continue;\r\n \r\n const fieldType = fieldInfo[fieldName]?.type;\r\n \r\n // Check if this is a radio button field\r\n const isRadioButton = fieldType && (\r\n fieldType.toLowerCase().includes('radio') ||\r\n fieldType.toLowerCase().includes('radiobutton') ||\r\n fieldType === 'radiobutton'\r\n );\r\n \r\n // Fallback detection: if multiple widgets share the same field name, it's likely a radio group\r\n const widgetCount = fieldInfo[fieldName]?.widgets?.length || 0;\r\n const isLikelyRadioGroup = widgetCount > 1 && fieldName.toLowerCase().includes('radio');\r\n \r\n if (fieldName && (isRadioButton || isLikelyRadioGroup)) {\r\n if (!radioGroups[fieldName]) {\r\n radioGroups[fieldName] = [];\r\n }\r\n \r\n // Find the corresponding widget from fieldInfo\r\n const widget = fieldInfo[fieldName]?.widgets?.find((w: PDFField) => w.id === id);\r\n \r\n radioGroups[fieldName].push({ id, data, widget });\r\n }\r\n }\r\n\r\n // Process radio groups to find selected options\r\n for (const [fieldName, radioButtons] of Object.entries(radioGroups)) {\r\n \r\n // Find the selected radio button (the one with value: true)\r\n const selectedRadio = radioButtons.find(rb => \r\n rb.data && typeof rb.data === 'object' && \r\n (rb.data as { value?: boolean }).value === true\r\n );\r\n \r\n if (selectedRadio) {\r\n // Sort radio buttons by their ID to get consistent ordering\r\n const sortedRadioButtons = [...radioButtons].sort((a, b) => {\r\n const aNum = parseInt(a.id.replace(/\\D/g, ''), 10) || 0;\r\n const bNum = parseInt(b.id.replace(/\\D/g, ''), 10) || 0;\r\n return aNum - bNum;\r\n });\r\n \r\n // Find the position of the selected widget\r\n const selectedIndex = sortedRadioButtons.findIndex(rb => rb.id === selectedRadio.id);\r\n \r\n // Store the widget position for later mapping to actual option values\r\n if (selectedIndex >= 0) {\r\n const exportValue = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\r\n values[fieldName] = exportValue;\r\n } else {\r\n values[fieldName] = 'true';\r\n }\r\n }\r\n }\r\n\r\n // Extract values for non-radio fields from stored data\r\n for (const [id, data] of Object.entries(storedData)) {\r\n const fieldName = idToNameMap[id];\r\n \r\n // Skip if already processed as radio button\r\n if (fieldName && values[fieldName]) {\r\n continue;\r\n }\r\n \r\n if (fieldName) {\r\n let extractedValue: string | undefined;\r\n\r\n if (data && typeof data === 'object') {\r\n const dataObj = data as Record<string, unknown>;\r\n if ('value' in dataObj) {\r\n extractedValue = String(dataObj.value);\r\n } else if ('formValue' in dataObj) {\r\n extractedValue = String(dataObj.formValue);\r\n } else if ('textContent' in dataObj) {\r\n extractedValue = String(dataObj.textContent);\r\n }\r\n } else if (data !== undefined && data !== null) {\r\n extractedValue = String(data);\r\n }\r\n\r\n if (extractedValue !== undefined && extractedValue !== '') {\r\n values[fieldName] = extractedValue;\r\n }\r\n }\r\n }\r\n\r\n // Get default values for fields not in storage\r\n for (const [name, fields] of Object.entries(fieldObjects)) {\r\n if (!values[name]) {\r\n const fieldArray = fields as PDFField[];\r\n const field = fieldArray[0];\r\n \r\n if (field && field.value !== undefined && field.value !== null) {\r\n const fieldValue = String(field.value);\r\n const fieldType = fieldInfo[name]?.type;\r\n \r\n // For radio buttons, convert to index pattern using fieldInfo widgets\r\n const isRadioButton = fieldType && (\r\n fieldType.toLowerCase().includes('radio') ||\r\n fieldType === 'radiobutton'\r\n );\r\n \r\n if (isRadioButton && fieldValue !== 'true' && fieldValue !== 'false') {\r\n // Use widgets from fieldInfo (not field.items which may be missing after filtering)\r\n const widgets = fieldInfo[name]?.widgets || [];\r\n \r\n if (widgets.length > 0) {\r\n // Sort widgets by ID to get consistent ordering\r\n const sortedWidgets = [...widgets].sort((a, b) => {\r\n const aNum = parseInt((a.id || '').replace(/\\D/g, ''), 10) || 0;\r\n const bNum = parseInt((b.id || '').replace(/\\D/g, ''), 10) || 0;\r\n return aNum - bNum;\r\n });\r\n \r\n // Find which widget matches the default value\r\n const selectedIndex = sortedWidgets.findIndex(widget => \r\n widget.exportValue === fieldValue || widget.buttonValue === fieldValue\r\n );\r\n \r\n if (selectedIndex >= 0) {\r\n values[name] = `__RADIO_OPTION_INDEX_${selectedIndex}__`;\r\n } else {\r\n }\r\n }\r\n } else {\r\n // Non-radio fields: use the value as-is\r\n values[name] = fieldValue;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return values;\r\n } catch (error) {\r\n logger.error('Error extracting form field values:', error);\r\n return {};\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const setFormFieldValues = useCallback(async (values: Record<string, string>): Promise<void> => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n logger.warn('Cannot set field values: iframe not available');\r\n return;\r\n }\r\n\r\n try {\r\n // Wait for PDF.js to be ready\r\n await waitForInitialization();\r\n\r\n // Small delay to ensure fields are rendered in the DOM\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n\r\n const iframeDoc = iframe.contentWindow.document;\r\n \r\n // Set values for each field by accessing DOM directly\r\n for (const [fieldName, value] of Object.entries(values)) {\r\n try {\r\n // Try to decode the field name (PDF.js might use decoded names in DOM)\r\n // Extract the base name before __LABEL__, __SIGNER__, or __PLACEHOLDER__\r\n let decodedFieldName = fieldName;\r\n if (fieldName.includes('__LABEL__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__LABEL__'));\r\n } else if (fieldName.includes('__SIGNER__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__SIGNER__'));\r\n } else if (fieldName.includes('__PLACEHOLDER__')) {\r\n decodedFieldName = fieldName.substring(0, fieldName.indexOf('__PLACEHOLDER__'));\r\n }\r\n \r\n // Try multiple selectors to find the field\r\n // PDF.js might use either the encoded or decoded name\r\n let elements = iframeDoc.querySelectorAll(\r\n `[data-element-id=\"${fieldName}\"], [name=\"${fieldName}\"], [data-element-id=\"${decodedFieldName}\"], [name=\"${decodedFieldName}\"]`\r\n );\r\n \r\n if (elements.length === 0) {\r\n logger.warn(`Field element not found for: ${fieldName}`);\r\n continue;\r\n }\r\n \r\n // Handle radio buttons (multiple elements with same name)\r\n const firstElement = elements[0] as any;\r\n const isRadioGroup = elements.length > 1 && \r\n (firstElement.tagName || '').toLowerCase() === 'input' && \r\n (firstElement.type || '') === 'radio';\r\n \r\n if (isRadioGroup) {\r\n // Radio button group\r\n if (value.includes('__RADIO_OPTION_INDEX_')) {\r\n const match = value.match(/__RADIO_OPTION_INDEX_(\\d+)__/);\r\n if (match && match[1]) {\r\n const selectedIndex = parseInt(match[1], 10);\r\n if (selectedIndex < elements.length) {\r\n const radioElement = elements[selectedIndex] as any;\r\n radioElement.checked = true;\r\n // Dispatch events to notify PDF.js\r\n radioElement.dispatchEvent(new Event('change', { bubbles: true }));\r\n radioElement.dispatchEvent(new Event('input', { bubbles: true }));\r\n radioElement.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else {\r\n logger.warn(`Radio button index ${selectedIndex} out of range for ${fieldName}`);\r\n }\r\n }\r\n }\r\n } else {\r\n // Single element (text, checkbox, dropdown, date, etc.)\r\n const element = elements[0] as any; // Use any to access properties from iframe context\r\n const tagName = (element.tagName || '').toLowerCase();\r\n \r\n // Check tagName instead of instanceof (iframe has different constructor context)\r\n if (tagName === 'input') {\r\n const inputType = element.type || 'text';\r\n if (inputType === 'checkbox') {\r\n const boolValue = value === 'true' || value === 'Yes' || value === 'On';\r\n element.checked = boolValue;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else if (inputType === 'radio') {\r\n // Single radio button\r\n element.checked = value === 'true' || value === element.value;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('click', { bubbles: true }));\r\n } else {\r\n // Text, date, etc.\r\n element.value = value;\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n }\r\n } else if (tagName === 'select') {\r\n // Dropdown\r\n element.value = value;\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n } else if (tagName === 'textarea') {\r\n // Textarea\r\n element.value = value;\r\n element.dispatchEvent(new Event('input', { bubbles: true }));\r\n element.dispatchEvent(new Event('change', { bubbles: true }));\r\n } else {\r\n logger.warn(`Unknown element type for field ${fieldName}: ${tagName}`);\r\n }\r\n }\r\n } catch (fieldError) {\r\n logger.error(`Error setting value for field ${fieldName}:`, fieldError);\r\n }\r\n }\r\n\r\n } catch (error) {\r\n logger.error('Error setting form field values:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getAllFieldNames = useCallback(async (): Promise<string[]> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return [];\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n\r\n let fieldObjects: Record<string, unknown[]> = {};\r\n try {\r\n if (pdfDocument.getFieldObjects) {\r\n const result = await pdfDocument.getFieldObjects();\r\n fieldObjects = result || {};\r\n }\r\n } catch (error) {\r\n return [];\r\n }\r\n\r\n return Object.keys(fieldObjects);\r\n } catch (error) {\r\n logger.error('Error getting all field names:', error);\r\n return [];\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const saveDocument = useCallback(async (): Promise<Uint8Array | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n\r\n if (!PDFViewerApplication.pdfDocument) {\r\n return null;\r\n }\r\n\r\n const pdfDocument = PDFViewerApplication.pdfDocument;\r\n\r\n if (typeof pdfDocument.saveDocument === 'function') {\r\n const savedBytes = await pdfDocument.saveDocument();\r\n return new Uint8Array(savedBytes);\r\n } else if (pdfDocument.getData) {\r\n const originalData = await pdfDocument.getData();\r\n return new Uint8Array(originalData);\r\n }\r\n\r\n return null;\r\n } catch (error) {\r\n logger.error('Error saving PDF document:', error);\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const injectPlaceholders = useCallback((fields: Array<{ id: string; name: string; placeholder?: string }>) => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n // Wait for PDF.js to render the form fields\r\n setTimeout(() => {\r\n try {\r\n const iframeDoc = iframe.contentWindow!.document;\r\n \r\n // Create a map of field names to placeholders for O(1) lookup\r\n const placeholderMap = new Map<string, string>();\r\n fields.forEach(field => {\r\n if (field.placeholder) {\r\n placeholderMap.set(field.name, field.placeholder);\r\n placeholderMap.set(field.id, field.placeholder);\r\n }\r\n });\r\n\r\n // Query all input fields in the iframe\r\n const inputs = iframeDoc.querySelectorAll('input[data-element-id], input[name]');\r\n \r\n \r\n inputs.forEach((input) => {\r\n const htmlInput = input as HTMLInputElement;\r\n const fieldId = htmlInput.getAttribute('data-element-id') || htmlInput.name;\r\n \r\n if (fieldId) {\r\n const placeholder = placeholderMap.get(fieldId);\r\n if (placeholder) {\r\n htmlInput.placeholder = placeholder;\r\n }\r\n }\r\n });\r\n } catch (error) {\r\n logger.error('Error injecting placeholders:', error);\r\n }\r\n }, 1000); // Wait 1 second for PDF.js to render\r\n }, []);\r\n\r\n const zoomIn = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.increaseScale === 'function') {\r\n PDFViewerApplication.pdfViewer.increaseScale();\r\n }\r\n } catch (error) {\r\n logger.error('Error zooming in:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const zoomOut = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.decreaseScale === 'function') {\r\n PDFViewerApplication.pdfViewer.decreaseScale();\r\n }\r\n } catch (error) {\r\n logger.error('Error zooming out:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const nextPage = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.nextPage === 'function') {\r\n PDFViewerApplication.pdfViewer.nextPage();\r\n }\r\n } catch (error) {\r\n logger.error('Error going to next page:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const previousPage = useCallback(async () => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.previousPage === 'function') {\r\n PDFViewerApplication.pdfViewer.previousPage();\r\n }\r\n } catch (error) {\r\n logger.error('Error going to previous page:', error);\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getCurrentPage = useCallback(async (): Promise<number | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.currentPageNumber === 'number') {\r\n return PDFViewerApplication.pdfViewer.currentPageNumber;\r\n }\r\n return null;\r\n } catch (error) {\r\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\r\n // Only log if it's an unexpected error\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\r\n logger.error('Error getting current page:', error);\r\n }\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n const getTotalPages = useCallback(async (): Promise<number | null> => {\r\n try {\r\n const PDFViewerApplication = await waitForInitialization();\r\n if (PDFViewerApplication.pdfViewer && typeof PDFViewerApplication.pdfViewer.pagesCount === 'number') {\r\n return PDFViewerApplication.pdfViewer.pagesCount;\r\n }\r\n return null;\r\n } catch (error) {\r\n // Silently return null if PDF viewer isn't ready yet (expected during initialization)\r\n // Only log if it's an unexpected error\r\n const errorMsg = error instanceof Error ? error.message : String(error);\r\n if (!errorMsg.includes('not available') && !errorMsg.includes('not yet initialized')) {\r\n logger.error('Error getting total pages:', error);\r\n }\r\n return null;\r\n }\r\n }, [waitForInitialization]);\r\n\r\n // Check PDF.js version on mount\r\n useEffect(() => {\r\n if (!versionChecked) {\r\n const config = getPdfJsConfig();\r\n const basePath = pdfjsBasePath ?? config.viewerBasePath;\r\n \r\n checkPdfJsVersion(basePath).then((result) => {\r\n setVersionChecked(true);\r\n \r\n if (!result.viewerExists) {\r\n const errorMsg = `⚠️ PDF.js files not found\\n\\nThe PDF viewer requires PDF.js files to be installed.\\nThis should happen automatically, but you can run:\\n\\n npx signiphi-setup\\n\\nOr reinstall the package:\\n\\n npm install @signiphi/pdf-signer`;\r\n setSetupError(errorMsg);\r\n logger.error(errorMsg);\r\n } else if (!result.versionMatch) {\r\n logger.warn(\r\n `⚠️ PDF.js version mismatch:\\n` +\r\n ` Viewer: ${result.viewerVersion}\\n` +\r\n ` Worker: ${result.workerVersion}\\n` +\r\n `Run: npx signiphi-setup to sync versions`\r\n );\r\n }\r\n }).catch((error) => {\r\n logger.error('Failed to check PDF.js version:', error);\r\n setVersionChecked(true);\r\n });\r\n }\r\n }, [pdfjsBasePath, versionChecked]);\r\n\r\n const handleIframeLoad = useCallback(() => {\r\n const iframe = iframeRef.current;\r\n if (!iframe || !iframe.contentWindow) {\r\n return;\r\n }\r\n\r\n try {\r\n // Check if iframe failed to load (404 error for viewer.html)\r\n if (iframe.contentDocument) {\r\n const title = iframe.contentDocument.title;\r\n const body = iframe.contentDocument.body;\r\n \r\n // Detect common error patterns (404, file not found)\r\n if (\r\n title?.includes('404') || \r\n title?.includes('Not Found') ||\r\n body?.textContent?.includes('404') ||\r\n body?.textContent?.includes('Cannot GET')\r\n ) {\r\n const errorMsg = setupError || `⚠️ PDF.js viewer not found\\n\\nThe viewer.html file could not be loaded from the configured path.\\nRun: npx signiphi-setup\\n\\nOr check your configuration.`;\r\n logger.error(errorMsg);\r\n isLoadingRef.current = false;\r\n onError?.(errorMsg);\r\n return;\r\n }\r\n }\r\n\r\n setTimeout(async () => {\r\n try {\r\n if (initializationPromise.current) {\r\n await initializationPromise.current;\r\n isLoadingRef.current = false;\r\n onLoad?.();\r\n } else {\r\n const PDFViewerApplication = getPDFViewerApplication();\r\n if (PDFViewerApplication) {\r\n isLoadingRef.current = false;\r\n onLoad?.();\r\n } else {\r\n throw new Error('PDFViewerApplication not found after iframe load');\r\n }\r\n }\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Unknown error loading PDF viewer';\r\n logger.error('Error in PDF.js initialization:', error);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, 1000);\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Unknown error in iframe load handler';\r\n logger.error('Error in iframe load handler:', error);\r\n isLoadingRef.current = false;\r\n onError?.(errorMessage);\r\n }\r\n }, [getPDFViewerApplication, onLoad, onError, setupError]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n loadPdf,\r\n getFormFieldValues,\r\n setFormFieldValues,\r\n getAllFieldNames,\r\n saveDocument,\r\n getPDFViewerApplication,\r\n injectPlaceholders,\r\n zoomIn,\r\n zoomOut,\r\n nextPage,\r\n previousPage,\r\n getCurrentPage,\r\n getTotalPages,\r\n }),\r\n [loadPdf, getFormFieldValues, setFormFieldValues, getAllFieldNames, saveDocument, getPDFViewerApplication, injectPlaceholders, zoomIn, zoomOut, nextPage, previousPage, getCurrentPage, getTotalPages]\r\n );\r\n\r\n return <>{children({ iframeRef, handleIframeLoad })}</>;\r\n }\r\n);\r\n\r\nPdfViewerCore.displayName = 'PdfViewerCore';\r\n\r\n","import {\r\n useRef,\r\n useState,\r\n useEffect,\r\n useCallback,\r\n forwardRef,\r\n useImperativeHandle,\r\n} from 'react';\r\nimport type { SignatureCanvasRef } from '../types';\r\n\r\n/**\r\n * Props for the headless signature capture core component\r\n */\r\nexport interface SignatureCaptureCoreProps {\r\n width?: number;\r\n height?: number;\r\n onSignature?: (dataUrl: string) => void;\r\n children: (props: {\r\n canvasRef: React.RefObject<HTMLCanvasElement>;\r\n containerRef: React.RefObject<HTMLDivElement>;\r\n isEmpty: boolean;\r\n canvasSize: { width: number; height: number };\r\n handlers: {\r\n onMouseDown: (e: React.MouseEvent) => void;\r\n onMouseMove: (e: React.MouseEvent) => void;\r\n onMouseUp: () => void;\r\n onMouseLeave: () => void;\r\n onTouchStart: (e: React.TouchEvent) => void;\r\n onTouchMove: (e: React.TouchEvent) => void;\r\n onTouchEnd: () => void;\r\n };\r\n actions: {\r\n clear: () => void;\r\n save: () => void;\r\n };\r\n }) => React.ReactNode;\r\n}\r\n\r\n/**\r\n * Headless signature capture core component\r\n * Provides canvas drawing logic without any UI\r\n */\r\nexport const SignatureCaptureCore = forwardRef<SignatureCanvasRef, SignatureCaptureCoreProps>(\r\n ({ width = 400, height = 200, onSignature, children }, ref) => {\r\n const canvasRef = useRef<HTMLCanvasElement>(null);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const [isDrawing, setIsDrawing] = useState(false);\r\n const [isEmpty, setIsEmpty] = useState(true);\r\n const [lastPoint, setLastPoint] = useState<{ x: number; y: number } | null>(null);\r\n const [canvasSize, setCanvasSize] = useState({ width, height });\r\n\r\n // Handle responsive canvas sizing\r\n useEffect(() => {\r\n const updateCanvasSize = () => {\r\n if (containerRef.current) {\r\n const containerWidth = containerRef.current.offsetWidth;\r\n const maxWidth = Math.max(containerWidth - 16, width);\r\n const aspectRatio = width / height;\r\n const newHeight = maxWidth / aspectRatio;\r\n\r\n setCanvasSize({\r\n width: maxWidth,\r\n height: newHeight,\r\n });\r\n }\r\n };\r\n\r\n setTimeout(updateCanvasSize, 100);\r\n window.addEventListener('resize', updateCanvasSize);\r\n return () => window.removeEventListener('resize', updateCanvasSize);\r\n }, [width, height]);\r\n\r\n const getCanvasContext = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) return null;\r\n\r\n return { canvas, ctx };\r\n }, []);\r\n\r\n const setupCanvas = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { canvas, ctx } = result;\r\n\r\n // Set canvas size\r\n canvas.width = canvasSize.width;\r\n canvas.height = canvasSize.height;\r\n\r\n // Configure drawing context\r\n ctx.strokeStyle = '#000000';\r\n ctx.lineWidth = window.innerWidth < 768 ? 3 : 2;\r\n ctx.lineCap = 'round';\r\n ctx.lineJoin = 'round';\r\n ctx.imageSmoothingEnabled = true;\r\n\r\n // Clear canvas with white background\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, canvasSize.width, canvasSize.height);\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const clear = useCallback(() => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n ctx.fillStyle = '#ffffff';\r\n ctx.fillRect(0, 0, canvasSize.width, canvasSize.height);\r\n queueMicrotask(() => setIsEmpty(true));\r\n }, [canvasSize, getCanvasContext]);\r\n\r\n const getSignatureDataUrl = useCallback(() => {\r\n const canvas = canvasRef.current;\r\n if (!canvas || isEmpty) return null;\r\n\r\n return canvas.toDataURL('image/png');\r\n }, [isEmpty]);\r\n\r\n const getRelativePosition = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n const canvas = canvasRef.current;\r\n if (!canvas) return null;\r\n\r\n const rect = canvas.getBoundingClientRect();\r\n const scaleX = canvas.width / rect.width;\r\n const scaleY = canvas.height / rect.height;\r\n\r\n let clientX: number, clientY: number;\r\n\r\n if ('touches' in e) {\r\n const touch = e.touches[0] || e.changedTouches[0];\r\n if (!touch) return null;\r\n clientX = touch.clientX;\r\n clientY = touch.clientY;\r\n } else {\r\n clientX = e.clientX;\r\n clientY = e.clientY;\r\n }\r\n\r\n return {\r\n x: (clientX - rect.left) * scaleX,\r\n y: (clientY - rect.top) * scaleY,\r\n };\r\n },\r\n []\r\n );\r\n\r\n const drawLine = useCallback(\r\n (from: { x: number; y: number }, to: { x: number; y: number }) => {\r\n const result = getCanvasContext();\r\n if (!result) return;\r\n\r\n const { ctx } = result;\r\n\r\n ctx.beginPath();\r\n ctx.moveTo(from.x, from.y);\r\n ctx.lineTo(to.x, to.y);\r\n ctx.stroke();\r\n\r\n queueMicrotask(() => setIsEmpty(false));\r\n },\r\n [getCanvasContext]\r\n );\r\n\r\n const startDrawing = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n setIsDrawing(true);\r\n setLastPoint(point);\r\n },\r\n [getRelativePosition]\r\n );\r\n\r\n const draw = useCallback(\r\n (e: React.MouseEvent | React.TouchEvent) => {\r\n if (!isDrawing || !lastPoint) return;\r\n\r\n e.preventDefault();\r\n const point = getRelativePosition(e);\r\n if (!point) return;\r\n\r\n drawLine(lastPoint, point);\r\n setLastPoint(point);\r\n },\r\n [isDrawing, lastPoint, getRelativePosition, drawLine]\r\n );\r\n\r\n const stopDrawing = useCallback(() => {\r\n setIsDrawing(false);\r\n setLastPoint(null);\r\n }, []);\r\n\r\n const handleSave = useCallback(() => {\r\n if (isEmpty) return;\r\n\r\n const dataUrl = getSignatureDataUrl();\r\n if (dataUrl && onSignature) {\r\n onSignature(dataUrl);\r\n }\r\n }, [isEmpty, getSignatureDataUrl, onSignature]);\r\n\r\n // Initialize canvas\r\n useEffect(() => {\r\n setupCanvas();\r\n }, [setupCanvas]);\r\n\r\n // Mouse event handlers\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleMouseMove = useCallback(\r\n (e: React.MouseEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleMouseUp = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n const handleMouseLeave = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Touch event handlers\r\n const handleTouchStart = useCallback(\r\n (e: React.TouchEvent) => {\r\n startDrawing(e);\r\n },\r\n [startDrawing]\r\n );\r\n\r\n const handleTouchMove = useCallback(\r\n (e: React.TouchEvent) => {\r\n draw(e);\r\n },\r\n [draw]\r\n );\r\n\r\n const handleTouchEnd = useCallback(() => {\r\n stopDrawing();\r\n }, [stopDrawing]);\r\n\r\n // Expose methods via ref\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n clear,\r\n getSignatureDataUrl,\r\n isEmpty: () => isEmpty,\r\n }),\r\n [clear, getSignatureDataUrl, isEmpty]\r\n );\r\n\r\n return (\r\n <>\r\n {children({\r\n canvasRef,\r\n containerRef,\r\n isEmpty,\r\n canvasSize,\r\n handlers: {\r\n onMouseDown: handleMouseDown,\r\n onMouseMove: handleMouseMove,\r\n onMouseUp: handleMouseUp,\r\n onMouseLeave: handleMouseLeave,\r\n onTouchStart: handleTouchStart,\r\n onTouchMove: handleTouchMove,\r\n onTouchEnd: handleTouchEnd,\r\n },\r\n actions: {\r\n clear,\r\n save: handleSave,\r\n },\r\n })}\r\n </>\r\n );\r\n }\r\n);\r\n\r\nSignatureCaptureCore.displayName = 'SignatureCaptureCore';\r\n\r\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './usePdfViewer';
|
|
2
|
+
export * from './useFormFields';
|
|
3
|
+
export * from './useSignatureCapture';
|
|
4
|
+
export * from './useSignatures';
|
|
5
|
+
export * from './useFieldFiltering';
|
|
6
|
+
export * from './useAttachments';
|
|
7
|
+
export * from './useMultiSignerContext';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
|