@cannyminds/dms-file-viewers 0.7.0 → 0.9.0

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.
Files changed (38) hide show
  1. package/dist/{chunk-HLDLNHNY.mjs → chunk-ORL5FTAW.mjs} +12 -2
  2. package/dist/chunk-ORL5FTAW.mjs.map +1 -0
  3. package/dist/{chunk-HQJPMN53.js → chunk-RSCUIGVW.js} +52 -42
  4. package/dist/{chunk-HQJPMN53.js.map → chunk-RSCUIGVW.js.map} +1 -1
  5. package/dist/{chunk-PFJKVNUA.mjs → chunk-ZUA4KYTB.mjs} +170 -117
  6. package/dist/chunk-ZUA4KYTB.mjs.map +1 -0
  7. package/dist/{chunk-CQ3HSM5S.js → chunk-ZWEQRVCH.js} +174 -121
  8. package/dist/chunk-ZWEQRVCH.js.map +1 -0
  9. package/dist/components/viewers/AudioViewer.d.mts +1 -1
  10. package/dist/components/viewers/AudioViewer.d.ts +1 -1
  11. package/dist/components/viewers/DefaultViewer.d.mts +1 -1
  12. package/dist/components/viewers/DefaultViewer.d.ts +1 -1
  13. package/dist/components/viewers/ImageViewer.d.mts +1 -1
  14. package/dist/components/viewers/ImageViewer.d.ts +1 -1
  15. package/dist/components/viewers/PDFViewer.d.mts +1 -1
  16. package/dist/components/viewers/PDFViewer.d.ts +1 -1
  17. package/dist/components/viewers/PDFViewer.js +2 -2
  18. package/dist/components/viewers/PDFViewer.mjs +1 -1
  19. package/dist/components/viewers/TIFFViewer.d.mts +1 -1
  20. package/dist/components/viewers/TIFFViewer.d.ts +1 -1
  21. package/dist/components/viewers/TIFFViewer.js +2 -2
  22. package/dist/components/viewers/TIFFViewer.mjs +1 -1
  23. package/dist/components/viewers/TextViewer.d.mts +1 -1
  24. package/dist/components/viewers/TextViewer.d.ts +1 -1
  25. package/dist/components/viewers/VideoViewer.d.mts +1 -1
  26. package/dist/components/viewers/VideoViewer.d.ts +1 -1
  27. package/dist/index.d.mts +2 -2
  28. package/dist/index.d.ts +2 -2
  29. package/dist/index.js +11 -9
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +10 -8
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/{types-BmZB9kkJ.d.mts → types-CQIoF7E1.d.mts} +3 -0
  34. package/dist/{types-BmZB9kkJ.d.ts → types-CQIoF7E1.d.ts} +3 -0
  35. package/package.json +2 -3
  36. package/dist/chunk-CQ3HSM5S.js.map +0 -1
  37. package/dist/chunk-HLDLNHNY.mjs.map +0 -1
  38. package/dist/chunk-PFJKVNUA.mjs.map +0 -1
@@ -1130,7 +1130,7 @@ var PDFViewerContent = forwardRef((props, ref) => {
1130
1130
  const canExecuteSearch = isPDFReady && isPagesInitialized && isViewerAvailable && isSearchAPIReady;
1131
1131
  if (!canExecuteSearch) return;
1132
1132
  hasExecutedInitialSearch.current = true;
1133
- const SEARCH_INITIALIZATION_DELAY = 10;
1133
+ const SEARCH_INITIALIZATION_DELAY = 100;
1134
1134
  setTimeout(() => {
1135
1135
  if (!pdfViewerRef.current?.search?.searchText) {
1136
1136
  console.warn("Search API became unavailable, skipping initial search");
@@ -1212,6 +1212,7 @@ var PDFViewerContent = forwardRef((props, ref) => {
1212
1212
  }
1213
1213
  } catch (error2) {
1214
1214
  }
1215
+ await new Promise((resolve) => setTimeout(resolve, 200));
1215
1216
  try {
1216
1217
  const selectors = [
1217
1218
  "[data-page-index]",
@@ -1230,6 +1231,15 @@ var PDFViewerContent = forwardRef((props, ref) => {
1230
1231
  }
1231
1232
  } catch (error2) {
1232
1233
  }
1234
+ try {
1235
+ const count = viewer.navigation?.getTotalPages?.();
1236
+ if (count && count > 0) {
1237
+ setTotalPages(count);
1238
+ return;
1239
+ }
1240
+ } catch (e) {
1241
+ }
1242
+ console.warn("Could not determine total pages, using fallback value of 1");
1233
1243
  setTotalPages(1);
1234
1244
  };
1235
1245
  initializePageCount();
@@ -1675,4 +1685,4 @@ PDFViewer.displayName = "PDFViewer";
1675
1685
  export {
1676
1686
  PDFViewer
1677
1687
  };
1678
- //# sourceMappingURL=chunk-HLDLNHNY.mjs.map
1688
+ //# sourceMappingURL=chunk-ORL5FTAW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/viewers/PDFViewer.tsx","../src/components/viewers/pdf/StablePDFViewer.tsx","../src/components/viewers/pdf/PDFToolbar.tsx","../src/components/viewers/pdf/PDFHeader.tsx","../src/components/viewers/pdf/SearchSidebar.tsx","../src/components/viewers/pdf/PasswordDialog.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useRef, useState, forwardRef, useImperativeHandle } from 'react';\r\nimport { FileViewerProps } from '../../types';\r\nimport { getFileExtension } from '../../utils/fileUtils';\r\nimport { mergeToolbarConfig } from '../../utils/toolbarUtils';\r\nimport {\r\n StablePDFViewer,\r\n PDFToolbar,\r\n PDFHeader,\r\n SearchSidebar,\r\n PasswordDialog,\r\n toolbarStyles,\r\n type CannyMindsPDFViewerRef\r\n} from './pdf';\r\n\r\ntype LoadingState = 'idle' | 'loading' | 'ready' | 'error';\r\n\r\n/**\r\n * IMPORTANT: The @cannyminds/pdf-viewer navigation API is not fully implemented.\r\n * Methods like getCurrentPage(), getTotalPages(), goToPage() return hardcoded values.\r\n * This component implements custom page tracking using DOM inspection and search detection.\r\n */\r\n\r\ninterface PDFViewerContentProps extends FileViewerProps {\r\n sourceDescription: string;\r\n}\r\n\r\nexport interface PDFViewerMethods {\r\n zoomIn: () => void;\r\n zoomOut: () => void;\r\n setZoom: (level: number) => void;\r\n resetZoom: () => void;\r\n getZoom: () => number;\r\n goToPage: (page: number) => void;\r\n getCurrentPage: () => number;\r\n getTotalPages: () => number;\r\n nextPage: () => void;\r\n previousPage: () => void;\r\n goToFirstPage: () => void;\r\n goToLastPage: () => void;\r\n searchText: (keyword: string) => Promise<any>;\r\n nextResult: () => number;\r\n previousResult: () => number;\r\n goToResult: (index: number) => number;\r\n stopSearch: () => void;\r\n getSearchState: () => any;\r\n getSelectedText: () => string;\r\n clearSelection: () => void;\r\n}\r\n\r\n\r\nconst PDFViewerContent = forwardRef<PDFViewerMethods, PDFViewerContentProps>((props, ref) => {\r\n const {\r\n file,\r\n onLoad,\r\n onError,\r\n fileName,\r\n showPageCount = true,\r\n showPageNavigation = true,\r\n showZoomControls = true,\r\n showDownload = true,\r\n showPrint = true,\r\n showSearch = true,\r\n showMetadata = true,\r\n showProperties = true,\r\n onMetadataClick,\r\n onPropertiesClick,\r\n onDownloadClick,\r\n onPrintClick,\r\n initialSearchText,\r\n initialSearchPages\r\n } = props;\r\n const [pdfBuffer, setPdfBuffer] = useState<ArrayBuffer | null>(null);\r\n const [state, setState] = useState<LoadingState>('idle');\r\n const [error, setError] = useState<string | null>(null);\r\n const pdfViewerRef = useRef<CannyMindsPDFViewerRef>(null);\r\n\r\n // File info\r\n const resolvedFileName = useMemo(() => {\r\n if (fileName) return fileName;\r\n if (file instanceof File) return file.name;\r\n if (typeof file === 'string') {\r\n const urlParts = file.split('/');\r\n return urlParts[urlParts.length - 1] || 'document.pdf';\r\n }\r\n return 'document.pdf';\r\n }, [file, fileName]);\r\n\r\n const fileExtension = useMemo(\r\n () => getFileExtension(resolvedFileName),\r\n [resolvedFileName]\r\n );\r\n\r\n // Toolbar state\r\n const [currentPage, setCurrentPage] = useState(1);\r\n const [totalPages, setTotalPages] = useState(0);\r\n const [zoom, setZoom] = useState(100);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [isSearching, setIsSearching] = useState(false);\r\n const [pdfContainer, setPdfContainer] = useState<HTMLElement | null>(null);\r\n const [isSidebarOpen, setIsSidebarOpen] = useState(false);\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const [currentSearchResultIndex, setCurrentSearchResultIndex] = useState(0);\r\n const [totalSearchResults, setTotalSearchResults] = useState(0);\r\n const [autoExecuteSearch, setAutoExecuteSearch] = useState(!!initialSearchText);\r\n const [isFullScreen, setIsFullScreen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Password dialog state\r\n const [isPasswordDialogOpen, setIsPasswordDialogOpen] = useState(false);\r\n const [passwordError, setPasswordError] = useState<string>('');\r\n const [passwordResolve, setPasswordResolve] = useState<((password: string | null) => void) | null>(null);\r\n\r\n const hasExecutedInitialSearch = useRef(false);\r\n\r\n const handleToggleFullScreen = useCallback(() => {\r\n if (!isFullScreen && containerRef.current?.requestFullscreen) {\r\n containerRef.current.requestFullscreen();\r\n setIsFullScreen(true);\r\n } else if (isFullScreen && document.exitFullscreen) {\r\n document.exitFullscreen();\r\n setIsFullScreen(false);\r\n }\r\n }, [isFullScreen]);\r\n\r\n // Handle sidebar close - clear all search state and highlighting\r\n const handleSidebarClose = useCallback(() => {\r\n setIsSidebarOpen(false);\r\n setSearchQuery('');\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n pdfViewerRef.current?.search.stopSearch(); // Stop search to remove highlighting\r\n }, []);\r\n\r\n const toolbar = mergeToolbarConfig({ \r\n showDownload, \r\n showPrint, \r\n showMetadata, \r\n showProperties, \r\n onDownloadClick, \r\n onPrintClick, \r\n onMetadataClick, \r\n onPropertiesClick, \r\n toolbarActions: props.toolbarActions \r\n });\r\n\r\n // Create stable callback handlers to prevent re-renders\r\n const toolbarHandlers = useMemo(() => ({\r\n handleZoomIn: () => {\r\n pdfViewerRef.current?.zoom.zoomIn();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handleZoomOut: () => {\r\n pdfViewerRef.current?.zoom.zoomOut();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handleFitToWidth: () => {\r\n pdfViewerRef.current?.zoom.fitToWidth();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handleFitToPage: () => {\r\n pdfViewerRef.current?.zoom.fitToPage();\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n },\r\n handlePreviousPage: () => {\r\n pdfViewerRef.current?.navigation.previousPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n handleNextPage: () => {\r\n pdfViewerRef.current?.navigation.nextPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n handleFirstPage: () => {\r\n pdfViewerRef.current?.navigation.goToFirstPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n handleLastPage: () => {\r\n pdfViewerRef.current?.navigation.goToLastPage();\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n },\r\n toggleSidebar: () => {\r\n if (isSidebarOpen) {\r\n // Closing sidebar - clear search state\r\n handleSidebarClose();\r\n } else {\r\n // Opening sidebar\r\n setIsSidebarOpen(true);\r\n }\r\n },\r\n handlePageInput: (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n if (/^\\d*$/.test(value)) {\r\n return;\r\n }\r\n const page = parseInt(value, 10);\r\n if (!isNaN(page) && page >= 1 && (totalPages === 0 || page <= totalPages)) {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n }\r\n },\r\n handlePageInputKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n const value = (e.target as HTMLInputElement).value;\r\n const page = parseInt(value, 10);\r\n if (!isNaN(page) && page >= 1 && (totalPages === 0 || page <= totalPages)) {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n }\r\n }\r\n },\r\n handleToggleFullScreen\r\n }), [isSidebarOpen, totalPages, handleToggleFullScreen]);\r\n\r\n // Auto-execute initial search when PDF is ready\r\n useEffect(() => {\r\n console.log('came', initialSearchText, pdfViewerRef.current, hasExecutedInitialSearch.current, 'state:', state, 'totalPages:', totalPages);\r\n\r\n // Skip if no search text or already executed\r\n if (!initialSearchText || hasExecutedInitialSearch.current) return;\r\n\r\n // Validate all prerequisites are met\r\n const isPDFReady = state === 'ready';\r\n const isPagesInitialized = totalPages > 0;\r\n const isViewerAvailable = !!pdfViewerRef.current;\r\n const isSearchAPIReady = !!pdfViewerRef.current?.search?.searchText;\r\n\r\n const canExecuteSearch = isPDFReady && isPagesInitialized && isViewerAvailable && isSearchAPIReady;\r\n\r\n if (!canExecuteSearch) return;\r\n\r\n // Mark as executed to prevent duplicate runs\r\n hasExecutedInitialSearch.current = true;\r\n\r\n // Small delay to ensure render completes and search index is stable\r\n const SEARCH_INITIALIZATION_DELAY = 100;\r\n\r\n setTimeout(() => {\r\n // Safety check: Verify search API is still available\r\n if (!pdfViewerRef.current?.search?.searchText) {\r\n console.warn('Search API became unavailable, skipping initial search');\r\n hasExecutedInitialSearch.current = false;\r\n return;\r\n }\r\n\r\n // Execute search after render completes\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n setIsSidebarOpen(true);\r\n handleSidebarSearch(initialSearchText, initialSearchPages);\r\n setAutoExecuteSearch(false);\r\n });\r\n });\r\n }, SEARCH_INITIALIZATION_DELAY);\r\n }, [state, totalPages, pdfViewerRef.current, initialSearchText, initialSearchPages]);\r\n\r\n // Reset all state when file changes\r\n useEffect(() => {\r\n // Reset search state\r\n setSearchQuery('');\r\n setSearchResults([]);\r\n setCurrentSearchResultIndex(0);\r\n setTotalSearchResults(0);\r\n setIsSearching(false);\r\n setIsSidebarOpen(false);\r\n hasExecutedInitialSearch.current = false;\r\n\r\n // Reset page state\r\n setCurrentPage(1);\r\n setTotalPages(0);\r\n setZoom(100);\r\n\r\n // Reset PDF state\r\n setState('idle');\r\n setError(null);\r\n setPdfBuffer(null);\r\n }, [file]);\r\n\r\n // Track the PDF container for page detection using MutationObserver\r\n useEffect(() => {\r\n if (state !== 'ready') return;\r\n\r\n const container = document.querySelector('[data-pdf-viewer], .embedpdf-viewport, [role=\"document\"]') as HTMLElement;\r\n if (container) {\r\n setPdfContainer(container);\r\n return;\r\n }\r\n\r\n // Use MutationObserver to wait for container to appear in DOM\r\n const observer = new MutationObserver(() => {\r\n const foundContainer = document.querySelector('[data-pdf-viewer], .embedpdf-viewport, [role=\"document\"]') as HTMLElement;\r\n if (foundContainer) {\r\n setPdfContainer(foundContainer);\r\n observer.disconnect();\r\n }\r\n });\r\n\r\n observer.observe(document.body, { childList: true, subtree: true });\r\n return () => observer.disconnect();\r\n }, [state]);\r\n\r\n // Initialize page count after PDF loads - using async polling with exponential backoff\r\n useEffect(() => {\r\n if (state !== 'ready' || totalPages > 0) return;\r\n\r\n const initializePageCount = async () => {\r\n // Wait for viewer ref with exponential backoff\r\n const waitForViewer = async (maxAttempts = 10): Promise<typeof pdfViewerRef.current> => {\r\n for (let i = 0; i < maxAttempts; i++) {\r\n if (pdfViewerRef.current) return pdfViewerRef.current;\r\n await new Promise(resolve => requestAnimationFrame(() =>\r\n setTimeout(resolve, Math.min(100 * Math.pow(2, i), 1000))\r\n ));\r\n }\r\n return null;\r\n };\r\n\r\n const viewer = await waitForViewer();\r\n if (!viewer) return;\r\n\r\n // Wait for pages to render using requestAnimationFrame\r\n await new Promise(resolve => requestAnimationFrame(resolve));\r\n\r\n // Try navigation API first\r\n try {\r\n const count = viewer.navigation?.getTotalPages?.();\r\n if (count && count > 1) {\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (e) {\r\n // Continue to fallback methods\r\n }\r\n\r\n // Fallback: Search for common character and count unique pages\r\n try {\r\n const results = await viewer.search?.searchText?.('e');\r\n\r\n if (results?.results && results.results.length > 0) {\r\n const pageIndices = results.results\r\n .map((m: any) => m.pageIndex as number)\r\n .filter((idx: any): idx is number => typeof idx === 'number');\r\n const count = Math.max(...pageIndices) + 1;\r\n viewer.search?.stopSearch?.();\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (error) {\r\n // Continue to next method\r\n }\r\n\r\n // DOM inspection fallback - count rendered pages\r\n // Wait a bit for pages to render in DOM before checking\r\n await new Promise(resolve => setTimeout(resolve, 200));\r\n\r\n try {\r\n const selectors = [\r\n '[data-page-index]',\r\n '[data-page-number]',\r\n '.embedpdf-page',\r\n '[role=\"article\"]',\r\n 'canvas[data-page]',\r\n '.react-pdf__Page'\r\n ];\r\n\r\n for (const selector of selectors) {\r\n const pages = document.querySelectorAll(selector);\r\n if (pages.length > 0) {\r\n setTotalPages(pages.length);\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n // Continue to fallback\r\n }\r\n\r\n // If we still don't have a count, try one more time with navigation API\r\n try {\r\n const count = viewer.navigation?.getTotalPages?.();\r\n if (count && count > 0) {\r\n setTotalPages(count);\r\n return;\r\n }\r\n } catch (e) {\r\n // Final fallback\r\n }\r\n\r\n // Only set to 1 as last resort (this should rarely happen)\r\n console.warn('Could not determine total pages, using fallback value of 1');\r\n setTotalPages(1);\r\n };\r\n\r\n initializePageCount();\r\n }, [state, totalPages]);\r\n\r\n // Auto-execute search when initialSearchText is provided via props\r\n // useEffect(() => {\r\n // if (state !== 'ready' || !autoExecuteSearch || !initialSearchText) return;\r\n\r\n // // Use requestIdleCallback for better performance, fallback to rAF\r\n // const scheduleSearch = (callback: () => void) => {\r\n // if ('requestIdleCallback' in window) {\r\n // requestIdleCallback(callback, { timeout: 2000 });\r\n // } else {\r\n // requestAnimationFrame(() => setTimeout(callback, 0));\r\n // }\r\n // };\r\n\r\n // scheduleSearch(() => {\r\n // if (!pdfViewerRef.current) return;\r\n\r\n // setIsSidebarOpen(true);\r\n // setSearchQuery(initialSearchText);\r\n // handleSidebarSearch(initialSearchText, initialSearchPages);\r\n // setAutoExecuteSearch(false);\r\n // });\r\n // }, [state, autoExecuteSearch, initialSearchText, initialSearchPages]);\r\n\r\n // Update page info and search state periodically\r\n useEffect(() => {\r\n if (state === 'ready' && pdfViewerRef.current) {\r\n const updateInfo = () => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n const total = pdfViewerRef.current?.navigation.getTotalPages() || 0;\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n const currentSearchState = pdfViewerRef.current?.search.getSearchState();\r\n\r\n setCurrentPage(current);\r\n\r\n // Update total pages if we got a valid count\r\n if (total > 0 && total !== totalPages) {\r\n setTotalPages(total);\r\n }\r\n\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n };\r\n\r\n updateInfo();\r\n const interval = setInterval(updateInfo, 300);\r\n return () => clearInterval(interval);\r\n }\r\n }, [state, totalPages]);\r\n\r\n // Expose methods through ref\r\n useImperativeHandle(ref, () => ({\r\n zoomIn: () => {\r\n pdfViewerRef.current?.zoom.zoomIn();\r\n updateZoomDisplay();\r\n },\r\n zoomOut: () => {\r\n pdfViewerRef.current?.zoom.zoomOut();\r\n updateZoomDisplay();\r\n },\r\n setZoom: (level: number) => {\r\n pdfViewerRef.current?.zoom.setZoom(level);\r\n updateZoomDisplay();\r\n },\r\n resetZoom: () => {\r\n pdfViewerRef.current?.zoom.resetZoom();\r\n updateZoomDisplay();\r\n },\r\n getZoom: () => {\r\n const zoom = pdfViewerRef.current?.zoom.getZoom();\r\n return typeof zoom === 'number' ? zoom : 1.0;\r\n },\r\n goToPage: (page: number) => {\r\n pdfViewerRef.current?.navigation.goToPage(page);\r\n setCurrentPage(page);\r\n },\r\n getCurrentPage: () => pdfViewerRef.current?.navigation.getCurrentPage() || 1,\r\n getTotalPages: () => pdfViewerRef.current?.navigation.getTotalPages() || 0,\r\n nextPage: () => {\r\n pdfViewerRef.current?.navigation.nextPage();\r\n updatePageDisplay();\r\n },\r\n previousPage: () => {\r\n pdfViewerRef.current?.navigation.previousPage();\r\n updatePageDisplay();\r\n },\r\n goToFirstPage: () => {\r\n pdfViewerRef.current?.navigation.goToFirstPage();\r\n updatePageDisplay();\r\n },\r\n goToLastPage: () => {\r\n pdfViewerRef.current?.navigation.goToLastPage();\r\n updatePageDisplay();\r\n },\r\n searchText: async (keyword: string) => {\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(keyword);\r\n setIsSearching(false);\r\n setSearchQuery(keyword);\r\n // Search state will be updated by the interval\r\n return results;\r\n },\r\n nextResult: () => {\r\n const index = pdfViewerRef.current?.search.nextResult() || -1;\r\n return index;\r\n },\r\n previousResult: () => {\r\n const index = pdfViewerRef.current?.search.previousResult() || -1;\r\n return index;\r\n },\r\n goToResult: (index: number) => pdfViewerRef.current?.search.goToResult(index) || -1,\r\n stopSearch: () => {\r\n pdfViewerRef.current?.search.stopSearch();\r\n setSearchQuery('');\r\n },\r\n getSearchState: () => pdfViewerRef.current?.search.getSearchState() || null,\r\n getSelectedText: () => pdfViewerRef.current?.selection.getSelectedText() || '',\r\n clearSelection: () => pdfViewerRef.current?.selection.clearSelection(),\r\n }), []);\r\n\r\n const updatePageDisplay = () => {\r\n requestAnimationFrame(() => {\r\n const current = pdfViewerRef.current?.navigation.getCurrentPage() || 1;\r\n setCurrentPage(current);\r\n });\r\n };\r\n\r\n const updateZoomDisplay = () => {\r\n requestAnimationFrame(() => {\r\n const zoomValue = pdfViewerRef.current?.zoom.getZoom();\r\n if (typeof zoomValue === 'number') {\r\n setZoom(Math.round(zoomValue * 100));\r\n }\r\n });\r\n };\r\n\r\n\r\n const handleSearch = async () => {\r\n if (!searchQuery.trim()) return;\r\n\r\n setIsSearching(true);\r\n const results = await pdfViewerRef.current?.search.searchText(searchQuery);\r\n setIsSearching(false);\r\n\r\n // Validate and format results\r\n if (results?.results && Array.isArray(results.results) && results.results.length > 0) {\r\n const formattedResults = formatSearchResults(results.results);\r\n updateSearchState(formattedResults);\r\n } else {\r\n clearSearchResults();\r\n }\r\n };\r\n\r\n const handleSearchKeyPress = (e: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (e.key === 'Enter') {\r\n handleSearch();\r\n }\r\n };\r\n\r\n const handleSidebarSearch = async (keyword: string, pageNumbers?: number[]) => {\r\n setSearchQuery(keyword);\r\n\r\n // Handle empty search - clear results\r\n if (!keyword.trim()) {\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n pdfViewerRef.current?.search.stopSearch();\r\n return;\r\n }\r\n\r\n // Verify search API is available\r\n if (!pdfViewerRef.current?.search?.searchText) {\r\n console.warn('Search functionality not yet available');\r\n return;\r\n }\r\n\r\n setIsSearching(true);\r\n\r\n try {\r\n // Execute PDF text search\r\n const results = await pdfViewerRef.current.search.searchText(keyword);\r\n console.log('Search completed:', results);\r\n setIsSearching(false);\r\n\r\n // Validate search results\r\n const hasValidResults =\r\n results?.results &&\r\n Array.isArray(results.results) &&\r\n results.results.length > 0;\r\n\r\n if (hasValidResults) {\r\n // Format and display PDF search results\r\n const formattedResults = formatSearchResults(results.results);\r\n updateSearchState(formattedResults);\r\n navigateToFirstResult(formattedResults);\r\n } else if (pageNumbers && pageNumbers.length > 0) {\r\n // Fallback: Use OCR-provided page numbers\r\n const fallbackResults = createFallbackResults(pageNumbers, keyword);\r\n updateSearchState(fallbackResults);\r\n navigateToPage(pageNumbers[0]);\r\n } else {\r\n // No results found\r\n clearSearchResults();\r\n }\r\n } catch (error) {\r\n console.error('Search failed:', error);\r\n setIsSearching(false);\r\n clearSearchResults();\r\n }\r\n };\r\n\r\n // Helper: Format raw search results into displayable format\r\n const formatSearchResults = (results: any[]) => {\r\n return results.map((result: any, index: number) => {\r\n let textContent = '';\r\n let contextContent = '';\r\n\r\n // Extract text based on result structure\r\n if (result.context && typeof result.context === 'object') {\r\n const { before = '', match = '', after = '' } = result.context;\r\n textContent = match;\r\n contextContent = `${before}${match}${after}`;\r\n } else if (typeof result === 'string') {\r\n textContent = result;\r\n contextContent = result;\r\n } else {\r\n textContent = String(result.match || result.text || '');\r\n contextContent = textContent;\r\n }\r\n\r\n return {\r\n pageNumber: (result.pageIndex ?? result.pageNumber ?? 0) + 1,\r\n text: textContent,\r\n context: contextContent,\r\n index: index\r\n };\r\n });\r\n };\r\n\r\n // Helper: Create fallback results from OCR page numbers\r\n const createFallbackResults = (pageNumbers: number[], keyword: string) => {\r\n return pageNumbers.map((pageNum, index) => ({\r\n pageNumber: pageNum,\r\n text: keyword,\r\n context: `\"${keyword}\" found on this page ${pageNum}`,\r\n index: index\r\n }));\r\n };\r\n\r\n // Helper: Update search state with results\r\n const updateSearchState = (results: any[]) => {\r\n setSearchResults(results);\r\n setTotalSearchResults(results.length);\r\n setCurrentSearchResultIndex(0);\r\n };\r\n\r\n // Helper: Clear search results\r\n const clearSearchResults = () => {\r\n setSearchResults([]);\r\n setTotalSearchResults(0);\r\n setCurrentSearchResultIndex(0);\r\n };\r\n\r\n // Helper: Navigate to first search result\r\n const navigateToFirstResult = (results: any[]) => {\r\n if (results.length > 0) {\r\n navigateToPage(results[0].pageNumber);\r\n }\r\n };\r\n\r\n // Helper: Navigate to specific page\r\n const navigateToPage = (pageNumber: number) => {\r\n requestAnimationFrame(() => {\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n });\r\n };\r\n\r\n const handleSearchResultClick = (pageNumber: number, resultIndex: number) => {\r\n // Navigate to the page first\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentSearchResultIndex(resultIndex);\r\n setCurrentPage(pageNumber);\r\n\r\n // Then go to the specific result\r\n pdfViewerRef.current?.search.goToResult(resultIndex);\r\n };\r\n\r\n\r\n const handleNextSearchResult = () => {\r\n if (currentSearchResultIndex < totalSearchResults - 1) {\r\n const nextIndex = currentSearchResultIndex + 1;\r\n setCurrentSearchResultIndex(nextIndex);\r\n\r\n pdfViewerRef.current?.search.nextResult();\r\n\r\n // Navigate to the page of the next result\r\n if (searchResults[nextIndex]) {\r\n const pageNumber = searchResults[nextIndex].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n }\r\n }\r\n };\r\n\r\n const handlePreviousSearchResult = () => {\r\n if (currentSearchResultIndex > 0) {\r\n const prevIndex = currentSearchResultIndex - 1;\r\n setCurrentSearchResultIndex(prevIndex);\r\n\r\n pdfViewerRef.current?.search.previousResult();\r\n\r\n // Navigate to the page of the previous result\r\n if (searchResults[prevIndex]) {\r\n const pageNumber = searchResults[prevIndex].pageNumber;\r\n pdfViewerRef.current?.navigation.goToPage(pageNumber);\r\n setCurrentPage(pageNumber);\r\n }\r\n }\r\n };\r\n\r\n // Load PDF from file\r\n useEffect(() => {\r\n if (!file) {\r\n setState('error');\r\n setError('No file provided');\r\n return;\r\n }\r\n\r\n const loadPDF = async () => {\r\n try {\r\n setState('loading');\r\n setError(null);\r\n\r\n let arrayBuffer: ArrayBuffer;\r\n\r\n if (file instanceof File) {\r\n arrayBuffer = await file.arrayBuffer();\r\n } else if (typeof file === 'string') {\r\n // Load from URL\r\n const response = await fetch(file);\r\n if (!response.ok) {\r\n throw new Error(`Failed to load PDF: ${response.statusText}`);\r\n }\r\n arrayBuffer = await response.arrayBuffer();\r\n } else if (file instanceof ArrayBuffer) {\r\n arrayBuffer = file;\r\n } else {\r\n throw new Error('Unsupported file type');\r\n }\r\n\r\n setPdfBuffer(arrayBuffer);\r\n setState('ready');\r\n onLoad?.();\r\n\r\n } catch (err: any) {\r\n const errorMessage = err.message || 'Failed to load PDF';\r\n setState('error');\r\n setError(errorMessage);\r\n onError?.(err);\r\n }\r\n };\r\n\r\n loadPDF();\r\n }, [file, onLoad, onError]);\r\n\r\n // Handle password request for encrypted PDFs\r\n const handlePasswordRequest = useCallback(async (fileName?: string): Promise<string | null> => {\r\n return new Promise((resolve) => {\r\n setPasswordResolve(() => resolve);\r\n setPasswordError('');\r\n setIsPasswordDialogOpen(true);\r\n });\r\n }, []);\r\n\r\n const handlePasswordSubmit = useCallback((password: string) => {\r\n if (passwordResolve) {\r\n passwordResolve(password);\r\n setPasswordResolve(null);\r\n setIsPasswordDialogOpen(false);\r\n setPasswordError('');\r\n }\r\n }, [passwordResolve]);\r\n\r\n const handlePasswordCancel = useCallback(() => {\r\n if (passwordResolve) {\r\n passwordResolve(null);\r\n setPasswordResolve(null);\r\n setIsPasswordDialogOpen(false);\r\n setPasswordError('');\r\n }\r\n }, [passwordResolve]);\r\n\r\n if (state === 'loading') {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%',\r\n gap: '16px'\r\n }}>\r\n <div className=\"spinner\" style={{\r\n width: '48px',\r\n height: '48px',\r\n border: '4px solid #f3f3f3',\r\n borderTop: '4px solid #3498db',\r\n borderRadius: '50%',\r\n animation: 'spin 1s linear infinite'\r\n }} />\r\n <p>Loading PDF...</p>\r\n <style>{`\r\n @keyframes spin {\r\n 0% { transform: rotate(0deg); }\r\n 100% { transform: rotate(360deg); }\r\n }\r\n `}</style>\r\n </div>\r\n );\r\n }\r\n\r\n if (state === 'error' || error) {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%',\r\n padding: '24px'\r\n }}>\r\n <div style={{\r\n maxWidth: '400px',\r\n padding: '16px',\r\n backgroundColor: '#fee',\r\n border: '1px solid #fcc',\r\n borderRadius: '4px'\r\n }}>\r\n <h3 style={{ marginTop: 0 }}>Failed to Load PDF</h3>\r\n <p>{error || 'Unknown error occurred'}</p>\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n if (!pdfBuffer || state !== 'ready') {\r\n return (\r\n <div style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n height: '100%'\r\n }}>\r\n <p>Preparing PDF...</p>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div ref={containerRef} className=\"pdf-viewer-container\">\r\n <style>{toolbarStyles}</style>\r\n\r\n {/* Header - File Info */}\r\n <PDFHeader\r\n fileName={resolvedFileName}\r\n fileExtension={fileExtension}\r\n />\r\n\r\n {/* Toolbar */}\r\n <PDFToolbar\r\n currentPage={currentPage}\r\n totalPages={totalPages}\r\n zoom={zoom}\r\n isSidebarOpen={isSidebarOpen}\r\n showPageNavigation={showPageNavigation}\r\n showPageCount={showPageCount}\r\n showZoomControls={showZoomControls}\r\n showSearch={showSearch}\r\n showMetadata={!toolbar.isHidden('metadata')}\r\n showProperties={!toolbar.isHidden('properties')}\r\n showDownload={!toolbar.isHidden('download')}\r\n showPrint={!toolbar.isHidden('print')}\r\n disabledMetadata={toolbar.isDisabled('metadata')}\r\n disabledProperties={toolbar.isDisabled('properties')}\r\n disabledDownload={toolbar.isDisabled('download')}\r\n disabledPrint={toolbar.isDisabled('print')}\r\n onFirstPage={toolbarHandlers.handleFirstPage}\r\n onPreviousPage={toolbarHandlers.handlePreviousPage}\r\n onNextPage={toolbarHandlers.handleNextPage}\r\n onLastPage={toolbarHandlers.handleLastPage}\r\n onPageInput={toolbarHandlers.handlePageInput}\r\n onPageInputKeyPress={toolbarHandlers.handlePageInputKeyPress}\r\n onZoomIn={toolbarHandlers.handleZoomIn}\r\n onZoomOut={toolbarHandlers.handleZoomOut}\r\n onFitToWidth={toolbarHandlers.handleFitToWidth}\r\n onFitToPage={toolbarHandlers.handleFitToPage}\r\n onToggleSidebar={toolbarHandlers.toggleSidebar}\r\n onToggleFullScreen={toolbarHandlers.handleToggleFullScreen}\r\n onDownloadClick={toolbar.getHandler('download', onDownloadClick)}\r\n onPrintClick={toolbar.getHandler('print', onPrintClick)}\r\n onMetadataClick={toolbar.getHandler('metadata', onMetadataClick)}\r\n onPropertiesClick={toolbar.getHandler('properties', onPropertiesClick)}\r\n />\r\n\r\n {/* Main Content Area with Sidebar */}\r\n <div className=\"pdf-viewer-main\">\r\n {/* PDF Viewer */}\r\n <div className=\"pdf-viewer-viewer-area\">\r\n <StablePDFViewer\r\n pdfBuffer={pdfBuffer}\r\n onPasswordRequest={handlePasswordRequest}\r\n pdfViewerRef={pdfViewerRef}\r\n />\r\n </div>\r\n\r\n {/* Search Sidebar */}\r\n <SearchSidebar\r\n isOpen={isSidebarOpen}\r\n onClose={handleSidebarClose}\r\n onSearch={handleSidebarSearch}\r\n onSearchResultClick={handleSearchResultClick}\r\n onNextResult={handleNextSearchResult}\r\n onPreviousResult={handlePreviousSearchResult}\r\n currentResultIndex={currentSearchResultIndex}\r\n totalResults={totalSearchResults}\r\n searchKeyword={searchQuery}\r\n searchResults={searchResults}\r\n isSearching={isSearching}\r\n />\r\n </div>\r\n\r\n {/* Password Dialog */}\r\n <PasswordDialog\r\n open={isPasswordDialogOpen}\r\n fileName={resolvedFileName}\r\n onSubmit={handlePasswordSubmit}\r\n onCancel={handlePasswordCancel}\r\n error={passwordError}\r\n />\r\n </div>\r\n );\r\n});\r\n\r\nPDFViewerContent.displayName = 'PDFViewerContent';\r\n\r\nexport const PDFViewer = forwardRef<PDFViewerMethods, FileViewerProps>((props, ref) => {\r\n return <PDFViewerContent {...props} sourceDescription=\"doc.pdf\" ref={ref} />;\r\n});\r\n\r\nPDFViewer.displayName = 'PDFViewer';\r\n","import React from 'react';\nimport { PDFViewer as HeadlessPDFViewerImport } from '@cannyminds/pdf-viewer';\n\n// Ensure we have a valid component\nconst HeadlessPDFViewer: any = HeadlessPDFViewerImport;\n\ninterface CannyMindsPDFViewerRef {\n zoom: {\n zoomIn: () => void;\n zoomOut: () => void;\n setZoom: (level: number) => void;\n resetZoom: () => void;\n getZoom: () => number | any;\n fitToWidth: () => void;\n fitToPage: () => void;\n };\n navigation: {\n goToPage: (page: number) => void;\n getCurrentPage: () => number;\n getTotalPages: () => number;\n nextPage: () => void;\n previousPage: () => void;\n goToFirstPage: () => void;\n goToLastPage: () => void;\n };\n selection: {\n clearSelection: () => void;\n getSelectedText: () => string;\n };\n search: {\n searchText: (keyword: string) => Promise<any>;\n nextResult: () => number;\n previousResult: () => number;\n goToResult: (index: number) => number;\n stopSearch: () => void;\n startSearch: () => void;\n getSearchState: () => any;\n setShowAllResults: (show: boolean) => void;\n };\n document?: {\n isReady: () => boolean;\n isLoading: () => boolean;\n hasPassword: () => boolean;\n getDocumentInfo: () => any;\n };\n scroll?: {\n scrollToPage: (page: number) => void;\n };\n}\n\ninterface StablePDFViewerProps {\n pdfBuffer: ArrayBuffer;\n onPasswordRequest: (fileName?: string) => Promise<string | null>;\n pdfViewerRef: React.RefObject<CannyMindsPDFViewerRef | null>;\n}\n\n// Stable PDF Viewer Component - only re-renders when PDF data changes\nexport const StablePDFViewer = React.memo<StablePDFViewerProps>(({ \n pdfBuffer, \n onPasswordRequest, \n pdfViewerRef \n}) => {\n return (\n <HeadlessPDFViewer\n ref={pdfViewerRef}\n pdfBuffer={pdfBuffer}\n onPasswordRequest={onPasswordRequest}\n />\n );\n});\n\nStablePDFViewer.displayName = 'StablePDFViewer';\n\nexport type { CannyMindsPDFViewerRef };","import React from 'react';\r\nimport FirstPageIcon from '@mui/icons-material/FirstPage';\r\nimport LastPageIcon from '@mui/icons-material/LastPage';\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\r\nimport ChevronRightIcon from '@mui/icons-material/ChevronRight';\r\nimport ZoomInIcon from '@mui/icons-material/ZoomIn';\r\nimport ZoomOutIcon from '@mui/icons-material/ZoomOut';\r\nimport FitScreenIcon from '@mui/icons-material/FitScreen';\r\nimport AspectRatioIcon from '@mui/icons-material/AspectRatio';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport FullscreenIcon from '@mui/icons-material/Fullscreen';\r\nimport DownloadIcon from '@mui/icons-material/Download';\r\nimport PrintIcon from '@mui/icons-material/Print';\r\nimport InfoIcon from '@mui/icons-material/Info';\r\nimport DescriptionIcon from '@mui/icons-material/Description';\r\n\r\ninterface PDFToolbarProps {\r\n currentPage: number;\r\n totalPages: number;\r\n zoom: number;\r\n isSidebarOpen: boolean;\r\n showPageNavigation: boolean;\r\n showPageCount: boolean;\r\n showZoomControls: boolean;\r\n showSearch: boolean;\r\n showMetadata: boolean;\r\n showProperties: boolean;\r\n showDownload: boolean;\r\n showPrint: boolean;\r\n disabledMetadata?: boolean;\r\n disabledProperties?: boolean;\r\n disabledDownload?: boolean;\r\n disabledPrint?: boolean;\r\n onFirstPage: () => void;\r\n onPreviousPage: () => void;\r\n onNextPage: () => void;\r\n onLastPage: () => void;\r\n onPageInput: (e: React.ChangeEvent<HTMLInputElement>) => void;\r\n onPageInputKeyPress: (e: React.KeyboardEvent<HTMLInputElement>) => void;\r\n onZoomIn: () => void;\r\n onZoomOut: () => void;\r\n onFitToWidth: () => void;\r\n onFitToPage: () => void;\r\n onToggleSidebar: () => void;\r\n onToggleFullScreen: () => void;\r\n onDownloadClick?: () => void;\r\n onPrintClick?: () => void;\r\n onMetadataClick?: () => void;\r\n onPropertiesClick?: () => void;\r\n}\r\n\r\nexport const PDFToolbar = React.memo<PDFToolbarProps>(({\r\n currentPage,\r\n totalPages,\r\n zoom,\r\n isSidebarOpen,\r\n showPageNavigation,\r\n showPageCount,\r\n showZoomControls,\r\n showSearch,\r\n showMetadata,\r\n showProperties,\r\n showDownload,\r\n showPrint,\r\n disabledMetadata,\r\n disabledProperties,\r\n disabledDownload,\r\n disabledPrint,\r\n onFirstPage,\r\n onPreviousPage,\r\n onNextPage,\r\n onLastPage,\r\n onPageInput,\r\n onPageInputKeyPress,\r\n onZoomIn,\r\n onZoomOut,\r\n onFitToWidth,\r\n onFitToPage,\r\n onToggleSidebar,\r\n onToggleFullScreen,\r\n onDownloadClick,\r\n onPrintClick,\r\n onMetadataClick,\r\n onPropertiesClick\r\n}) => {\r\n return (\r\n <div className=\"pdf-viewer-toolbar\">\r\n {showPageNavigation && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onFirstPage}\r\n disabled={currentPage <= 1}\r\n title=\"First Page\"\r\n >\r\n <FirstPageIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onPreviousPage}\r\n disabled={currentPage <= 1}\r\n title=\"Previous Page\"\r\n >\r\n <ChevronLeftIcon fontSize=\"small\" />\r\n </button>\r\n <input\r\n type=\"number\"\r\n className=\"page-input\"\r\n value={currentPage}\r\n onChange={onPageInput}\r\n onKeyPress={onPageInputKeyPress}\r\n min={1}\r\n max={totalPages || undefined}\r\n />\r\n {showPageCount && <span className=\"page-info\">of {totalPages || '...'}</span>}\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onNextPage}\r\n disabled={currentPage >= totalPages}\r\n title=\"Next Page\"\r\n >\r\n <ChevronRightIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onLastPage}\r\n disabled={currentPage >= totalPages}\r\n title=\"Last Page\"\r\n >\r\n <LastPageIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showZoomControls && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onZoomOut}\r\n title=\"Zoom Out\"\r\n >\r\n <ZoomOutIcon fontSize=\"small\" />\r\n </button>\r\n <span className=\"zoom-display\">{zoom}%</span>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onZoomIn}\r\n title=\"Zoom In\"\r\n >\r\n <ZoomInIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onFitToWidth}\r\n title=\"Fit to Width\"\r\n >\r\n <AspectRatioIcon fontSize=\"small\" />\r\n </button>\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onFitToPage}\r\n title=\"Fit to Page\"\r\n >\r\n <FitScreenIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n {showSearch && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onToggleSidebar}\r\n title=\"Search in PDF\"\r\n style={{\r\n backgroundColor: isSidebarOpen ? '#e3f2fd' : 'transparent',\r\n color: isSidebarOpen ? '#1976d2' : 'inherit'\r\n }}\r\n >\r\n <SearchIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onToggleFullScreen}\r\n title=\"Fullscreen\"\r\n >\r\n <FullscreenIcon fontSize=\"small\" />\r\n </button>\r\n </div>\r\n\r\n {(showMetadata || showProperties || showDownload || showPrint) && (\r\n <>\r\n <div className=\"toolbar-separator\"></div>\r\n <div className=\"toolbar-section\">\r\n {showDownload && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onDownloadClick}\r\n disabled={disabledDownload}\r\n title=\"Download PDF\"\r\n >\r\n <DownloadIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n {showPrint && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onPrintClick}\r\n disabled={disabledPrint}\r\n title=\"Print PDF\"\r\n >\r\n <PrintIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n {showMetadata && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onMetadataClick}\r\n disabled={disabledMetadata}\r\n title=\"Document Metadata\"\r\n >\r\n <DescriptionIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n {showProperties && (\r\n <button\r\n className=\"toolbar-button\"\r\n onClick={onPropertiesClick}\r\n disabled={disabledProperties}\r\n title=\"Document Properties\"\r\n >\r\n <InfoIcon fontSize=\"small\" />\r\n </button>\r\n )}\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n );\r\n});\r\n\r\nPDFToolbar.displayName = 'PDFToolbar';","import React from 'react';\nimport FileIcon from '../../FileIcon';\n\ninterface PDFHeaderProps {\n fileName: string;\n fileExtension: string;\n}\n\nexport const PDFHeader = React.memo<PDFHeaderProps>(({ fileName, fileExtension }) => {\n return (\n <div className=\"pdf-viewer-header\">\n <FileIcon ext={fileExtension} size={26} />\n <div className=\"header-file-name\" title={fileName}>\n {fileName}\n </div>\n </div>\n );\n});\n\nPDFHeader.displayName = 'PDFHeader';","import React, { useState, useLayoutEffect, useEffect, useRef } from 'react';\r\nimport {\r\n Box,\r\n Typography,\r\n TextField,\r\n IconButton,\r\n InputAdornment,\r\n Divider,\r\n CircularProgress\r\n} from '@mui/material';\r\nimport SearchIcon from '@mui/icons-material/Search';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp';\r\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown';\r\nimport ClearIcon from '@mui/icons-material/Clear';\r\nimport FindInPageIcon from '@mui/icons-material/FindInPage';\r\n\r\ninterface SearchResult {\r\n pageNumber: number;\r\n text: string;\r\n context: string;\r\n index: number;\r\n}\r\n\r\ninterface SearchSidebarProps {\r\n isOpen: boolean;\r\n onClose: () => void;\r\n onSearch: (keyword: string) => void;\r\n onSearchResultClick: (pageNumber: number, resultIndex: number) => void;\r\n onNextResult: () => void;\r\n onPreviousResult: () => void;\r\n currentResultIndex: number;\r\n totalResults: number;\r\n searchKeyword: string;\r\n searchResults?: SearchResult[];\r\n isSearching?: boolean;\r\n isSyntheticResults?: boolean; // Indicates results are from OCR/document analysis\r\n}\r\n\r\nexport const SearchSidebar: React.FC<SearchSidebarProps> = ({\r\n isOpen,\r\n onClose,\r\n onSearch,\r\n onSearchResultClick,\r\n onNextResult,\r\n onPreviousResult,\r\n currentResultIndex,\r\n totalResults,\r\n searchKeyword,\r\n searchResults = [],\r\n isSearching = false,\r\n isSyntheticResults = false\r\n}) => {\r\n const [searchTerm, setSearchTerm] = useState(searchKeyword || '');\r\n const [hasSearched, setHasSearched] = useState(false);\r\n const contentRef = useRef<HTMLDivElement>(null);\r\n\r\n // Sync local search term with prop changes (for URL-based auto-search)\r\n useEffect(() => {\r\n if (searchKeyword && searchKeyword !== searchTerm) {\r\n setSearchTerm(searchKeyword);\r\n }\r\n }, [searchKeyword]);\r\n\r\n // Scrollbar hover handler\r\n useLayoutEffect(() => {\r\n const element = contentRef.current;\r\n if (!element) return;\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n const rect = element.getBoundingClientRect();\r\n const distanceFromRight = rect.right - e.clientX;\r\n const distanceFromBottom = rect.bottom - e.clientY;\r\n\r\n if (distanceFromRight <= 15 || distanceFromBottom <= 15) {\r\n element.classList.add('scrollbar-hover');\r\n } else {\r\n element.classList.remove('scrollbar-hover');\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => element.classList.remove('scrollbar-hover');\r\n\r\n element.addEventListener('mousemove', handleMouseMove);\r\n element.addEventListener('mouseleave', handleMouseLeave);\r\n\r\n return () => {\r\n element.removeEventListener('mousemove', handleMouseMove);\r\n element.removeEventListener('mouseleave', handleMouseLeave);\r\n };\r\n }, []);\r\n\r\n // Inject scrollbar styles\r\n useLayoutEffect(() => {\r\n const style = document.createElement('style');\r\n style.id = 'search-sidebar-scrollbar';\r\n style.textContent = `\r\n @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Tamil:wght@400;600&family=Noto+Sans+Devanagari:wght@400;600&display=swap');\r\n \r\n .search-sidebar-content::-webkit-scrollbar {\r\n width: 12px;\r\n height: 12px;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-track {\r\n background-color: transparent;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-thumb {\r\n background-color: rgba(128, 128, 128, 0.3);\r\n border-radius: 8px;\r\n border: 4px solid transparent;\r\n background-clip: padding-box;\r\n transition: all 0.15s ease;\r\n }\r\n .search-sidebar-content.scrollbar-hover::-webkit-scrollbar-thumb {\r\n background-color: rgba(128, 128, 128, 0.5);\r\n border: 2px solid transparent;\r\n }\r\n .search-sidebar-content::-webkit-scrollbar-thumb:active {\r\n background-color: rgba(25, 118, 210, 0.8);\r\n border: 1px solid transparent;\r\n }\r\n\r\n @media (prefers-color-scheme: dark) {\r\n .search-sidebar-content::-webkit-scrollbar-thumb {\r\n background-color: rgba(255, 255, 255, 0.2);\r\n }\r\n .search-sidebar-content.scrollbar-hover::-webkit-scrollbar-thumb {\r\n background-color: rgba(255, 255, 255, 0.35);\r\n }\r\n }\r\n \r\n /* Tamil font support for search results */\r\n .search-result-text {\r\n font-family: 'Noto Sans Tamil', 'Noto Sans Devanagari', Arial, sans-serif !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n return () => {\r\n const el = document.getElementById('search-sidebar-scrollbar');\r\n if (el) el.remove();\r\n };\r\n }, []);\r\n\r\n useLayoutEffect(() => {\r\n setSearchTerm(searchKeyword || '');\r\n if (searchKeyword || searchResults.length > 0) {\r\n setHasSearched(true);\r\n }\r\n }, [searchKeyword, searchResults]);\r\n\r\n const handleSearchSubmit = (e?: React.FormEvent) => {\r\n if (e) e.preventDefault();\r\n\r\n if (searchTerm.trim()) {\r\n setHasSearched(true);\r\n onSearch(searchTerm.trim());\r\n }\r\n };\r\n\r\n const handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\r\n const value = e.target.value;\r\n setSearchTerm(value);\r\n\r\n if (!value.trim()) {\r\n setHasSearched(false);\r\n onSearch('');\r\n }\r\n };\r\n\r\n const handleClearSearch = () => {\r\n setSearchTerm('');\r\n setHasSearched(false);\r\n onSearch('');\r\n };\r\n\r\n // Group results by page\r\n const resultsByPage = searchResults.reduce((acc, result) => {\r\n if (!acc[result.pageNumber]) {\r\n acc[result.pageNumber] = [];\r\n }\r\n acc[result.pageNumber].push(result);\r\n return acc;\r\n }, {} as Record<number, SearchResult[]>);\r\n\r\n const highlightText = (text: any, keyword: string) => {\r\n if (!keyword) return text;\r\n\r\n const textString = typeof text === 'string' ? text : String(text || '');\r\n if (!textString) return text;\r\n\r\n try {\r\n const escapedKeyword = keyword.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n const regex = new RegExp(`(${escapedKeyword})`, 'gi');\r\n const parts = textString.split(regex);\r\n\r\n return parts.map((part, index) =>\r\n regex.test(part) ? (\r\n <Box\r\n component=\"span\"\r\n key={index}\r\n sx={{\r\n color: 'primary.main',\r\n fontWeight: 600,\r\n fontSize: 'inherit'\r\n }}\r\n >\r\n {part}\r\n </Box>\r\n ) : (\r\n part\r\n )\r\n );\r\n } catch (error) {\r\n // Return plain text if highlighting fails\r\n return textString;\r\n }\r\n };\r\n\r\n if (!isOpen) return null;\r\n\r\n return (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n flexDirection: 'column',\r\n height: '100%',\r\n width: '320px',\r\n backgroundColor: 'background.paper',\r\n borderLeft: '1px solid',\r\n borderColor: 'divider',\r\n overflow: 'hidden'\r\n }}\r\n >\r\n {/* Header */}\r\n <Box sx={{ px: 3, py: 2.5, backgroundColor: 'background.default' }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}>\r\n <Typography variant=\"h6\" sx={{ fontSize: '1.125rem', fontWeight: 600, color: 'text.primary' }}>\r\n Search\r\n </Typography>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onClose}\r\n sx={{\r\n color: 'text.secondary',\r\n padding: '6px'\r\n }}\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n\r\n {/* Search Input */}\r\n <form onSubmit={handleSearchSubmit}>\r\n <TextField\r\n fullWidth\r\n size=\"medium\"\r\n placeholder=\"Search in document...\"\r\n value={searchTerm}\r\n onChange={handleSearchChange}\r\n autoComplete=\"off\"\r\n InputProps={{\r\n startAdornment: (\r\n <InputAdornment position=\"start\">\r\n <SearchIcon sx={{ color: 'text.disabled', fontSize: 20 }} />\r\n </InputAdornment>\r\n ),\r\n endAdornment: searchTerm && (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n size=\"small\"\r\n onClick={handleClearSearch}\r\n sx={{\r\n color: 'text.secondary',\r\n padding: '4px',\r\n '&:hover': {\r\n backgroundColor: 'action.hover'\r\n }\r\n }}\r\n >\r\n <ClearIcon sx={{ fontSize: 18 }} />\r\n </IconButton>\r\n </InputAdornment>\r\n )\r\n }}\r\n sx={{\r\n '& .MuiOutlinedInput-root': {\r\n fontSize: '0.9375rem',\r\n backgroundColor: 'background.paper',\r\n borderRadius: '8px',\r\n '& fieldset': {\r\n borderColor: 'divider'\r\n },\r\n '&.Mui-focused fieldset': {\r\n borderColor: 'primary.main',\r\n borderWidth: '2px'\r\n }\r\n },\r\n '& .MuiInputBase-input': {\r\n padding: '10px 14px'\r\n }\r\n }}\r\n />\r\n </form>\r\n\r\n {/* Results Summary and Navigation */}\r\n {totalResults > 0 && (\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n mt: 2,\r\n pt: 2,\r\n borderTop: '1px solid',\r\n borderColor: 'divider'\r\n }}\r\n >\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', fontSize: '0.875rem', fontWeight: 500 }}>\r\n {currentResultIndex + 1} of {totalResults} results\r\n </Typography>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onPreviousResult}\r\n disabled={currentResultIndex <= 0}\r\n sx={{\r\n color: currentResultIndex <= 0 ? 'text.disabled' : 'primary.main',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n border: '1px solid',\r\n borderColor: currentResultIndex <= 0 ? 'divider' : 'primary.main'\r\n }}\r\n >\r\n <KeyboardArrowUpIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onNextResult}\r\n disabled={currentResultIndex >= totalResults - 1}\r\n sx={{\r\n color: currentResultIndex >= totalResults - 1 ? 'text.disabled' : 'primary.main',\r\n padding: '6px',\r\n borderRadius: '6px',\r\n border: '1px solid',\r\n borderColor: currentResultIndex >= totalResults - 1 ? 'divider' : 'primary.main'\r\n }}\r\n >\r\n <KeyboardArrowDownIcon sx={{ fontSize: 20 }} />\r\n </IconButton>\r\n </Box>\r\n </Box>\r\n )}\r\n </Box>\r\n\r\n <Divider />\r\n\r\n {/* Search Results */}\r\n <Box ref={contentRef} className=\"search-sidebar-content\" sx={{\r\n flex: 1,\r\n overflow: 'auto',\r\n backgroundColor: 'background.default'\r\n }}>\r\n {!searchTerm && !hasSearched && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: 'action.hover',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3\r\n }}\r\n >\r\n <SearchIcon sx={{ fontSize: 40, color: 'text.disabled' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Search in Document\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n Enter keywords to find text within the PDF document\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {searchTerm && !hasSearched && !isSearching && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: 'primary.light',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3,\r\n opacity: 0.2\r\n }}\r\n >\r\n <FindInPageIcon sx={{ fontSize: 40, color: 'primary.main' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Ready to Search\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', mb: 2, lineHeight: 1.6 }}>\r\n Press Enter to find\r\n </Typography>\r\n <Typography\r\n variant=\"body2\"\r\n sx={{\r\n color: 'white',\r\n fontWeight: 600,\r\n backgroundColor: (theme) => theme.palette.mode === 'dark'\r\n ? 'rgba(144, 202, 249, 0.16)'\r\n : 'primary.light',\r\n padding: '6px 16px',\r\n borderRadius: '16px',\r\n display: 'inline-block',\r\n opacity: 0.9\r\n }}\r\n >\r\n \"{searchTerm}\"\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {isSearching && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3\r\n }}\r\n >\r\n <CircularProgress size={60} thickness={4} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n Searching...\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n Finding matches for \"{searchTerm}\"\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {hasSearched && totalResults === 0 && !isSearching && (\r\n <Box sx={{ p: 4, textAlign: 'center', mt: 6 }}>\r\n <Box\r\n sx={{\r\n width: 80,\r\n height: 80,\r\n borderRadius: '50%',\r\n backgroundColor: (theme) => theme.palette.mode === 'dark'\r\n ? 'rgba(255, 152, 0, 0.12)'\r\n : 'warning.light',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n margin: '0 auto',\r\n mb: 3,\r\n opacity: 0.6\r\n }}\r\n >\r\n <SearchIcon sx={{ fontSize: 40, color: 'warning.main' }} />\r\n </Box>\r\n <Typography variant=\"body1\" sx={{ color: 'text.primary', fontWeight: 500, mb: 1 }}>\r\n No Results Found\r\n </Typography>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', lineHeight: 1.6 }}>\r\n No matches found for <strong>\"{searchTerm}\"</strong>\r\n </Typography>\r\n </Box>\r\n )}\r\n\r\n {totalResults > 0 && (\r\n <Box sx={{ p: 2 }}>\r\n {Object.keys(resultsByPage)\r\n .sort((a, b) => parseInt(a) - parseInt(b))\r\n .map((pageNum) => {\r\n const pageNumber = parseInt(pageNum);\r\n const pageResults = resultsByPage[pageNumber];\r\n\r\n return (\r\n <Box key={pageNumber} sx={{ mb: 3 }}>\r\n {/* Page Header */}\r\n <Typography\r\n variant=\"subtitle2\"\r\n sx={{\r\n color: 'text.secondary',\r\n mb: 1.5,\r\n px: 1,\r\n fontSize: '0.8125rem',\r\n fontWeight: 600,\r\n textTransform: 'uppercase',\r\n letterSpacing: '0.5px'\r\n }}\r\n >\r\n Page {pageNumber}\r\n </Typography>\r\n\r\n {/* Results for this page */}\r\n {pageResults.map((result: SearchResult, index: number) => (\r\n <Box\r\n key={index}\r\n onClick={() => onSearchResultClick(result.pageNumber, result.index)}\r\n sx={{\r\n p: 2,\r\n mx: 1,\r\n mb: 1.5,\r\n borderRadius: '8px',\r\n border: '2px solid',\r\n borderColor: result.index === currentResultIndex ? 'primary.main' : 'divider',\r\n backgroundColor: 'background.paper',\r\n cursor: 'pointer',\r\n transition: 'all 0.2s ease',\r\n boxShadow: (theme) => theme.palette.mode === 'dark'\r\n ? '0 1px 3px rgba(0, 0, 0, 0.3)'\r\n : '0 1px 3px rgba(0, 0, 0, 0.05)',\r\n '&:hover': {\r\n borderColor: 'primary.main',\r\n boxShadow: (theme) => theme.palette.mode === 'dark'\r\n ? '0 2px 8px rgba(255, 255, 255, 0.15)'\r\n : '0 2px 8px rgba(0, 0, 0, 0.1)',\r\n transform: 'translateY(-1px)'\r\n }\r\n }}\r\n >\r\n <Typography\r\n variant=\"body2\"\r\n className=\"search-result-text\"\r\n sx={{\r\n fontSize: '0.875rem',\r\n lineHeight: 1.6,\r\n color: result.index === currentResultIndex ? 'text.primary' : 'text.secondary'\r\n }}\r\n >\r\n {highlightText(result.context, searchTerm)}\r\n </Typography>\r\n </Box>\r\n ))}\r\n </Box>\r\n );\r\n })}\r\n </Box>\r\n )}\r\n </Box>\r\n </Box>\r\n );\r\n};\r\n","import React, { useState, useEffect } from 'react';\r\nimport {\r\n Dialog,\r\n DialogTitle,\r\n DialogContent,\r\n DialogActions,\r\n TextField,\r\n Button,\r\n Typography,\r\n IconButton,\r\n InputAdornment,\r\n Box,\r\n Alert\r\n} from '@mui/material';\r\nimport CloseIcon from '@mui/icons-material/Close';\r\nimport LockIcon from '@mui/icons-material/Lock';\r\nimport VisibilityIcon from '@mui/icons-material/Visibility';\r\nimport VisibilityOffIcon from '@mui/icons-material/VisibilityOff';\r\n\r\ninterface PasswordDialogProps {\r\n open: boolean;\r\n fileName?: string;\r\n onSubmit: (password: string) => void;\r\n onCancel: () => void;\r\n error?: string;\r\n}\r\n\r\nexport const PasswordDialog: React.FC<PasswordDialogProps> = ({\r\n open,\r\n fileName,\r\n onSubmit,\r\n onCancel,\r\n error\r\n}) => {\r\n const [password, setPassword] = useState('');\r\n const [showPassword, setShowPassword] = useState(false);\r\n\r\n // Reset password when dialog opens/closes\r\n useEffect(() => {\r\n if (open) {\r\n setPassword('');\r\n setShowPassword(false);\r\n }\r\n }, [open]);\r\n\r\n const handleSubmit = (e: React.FormEvent) => {\r\n e.preventDefault();\r\n if (password.trim()) {\r\n onSubmit(password);\r\n }\r\n };\r\n\r\n const handleTogglePasswordVisibility = () => {\r\n setShowPassword(!showPassword);\r\n };\r\n\r\n const handleKeyPress = (e: React.KeyboardEvent) => {\r\n if (e.key === 'Enter' && password.trim()) {\r\n handleSubmit(e as any);\r\n }\r\n };\r\n\r\n return (\r\n <Dialog\r\n open={open}\r\n onClose={onCancel}\r\n maxWidth=\"sm\"\r\n fullWidth\r\n PaperProps={{\r\n sx: {\r\n borderRadius: 2\r\n }\r\n }}\r\n >\r\n <DialogTitle sx={{ pb: 1 }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\r\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\r\n <Box\r\n sx={{\r\n width: 40,\r\n height: 40,\r\n borderRadius: '50%',\r\n backgroundColor: 'primary.light',\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n opacity: 0.9\r\n }}\r\n >\r\n <LockIcon sx={{ color: 'white', fontSize: 20 }} />\r\n </Box>\r\n <Typography variant=\"h6\" component=\"div\" sx={{ fontWeight: 600 }}>\r\n Password Protected\r\n </Typography>\r\n </Box>\r\n <IconButton\r\n size=\"small\"\r\n onClick={onCancel}\r\n sx={{ color: 'text.secondary' }}\r\n aria-label=\"Close dialog\"\r\n >\r\n <CloseIcon fontSize=\"small\" />\r\n </IconButton>\r\n </Box>\r\n </DialogTitle>\r\n\r\n <DialogContent sx={{ pt: 2 }}>\r\n <Typography variant=\"body2\" sx={{ color: 'text.secondary', mb: 3 }}>\r\n This PDF is password protected. Please enter the password to view{' '}\r\n {fileName && <strong>\"{fileName}\"</strong>}\r\n </Typography>\r\n\r\n {error && (\r\n <Alert severity=\"error\" sx={{ mb: 2 }}>\r\n {error}\r\n </Alert>\r\n )}\r\n\r\n <form onSubmit={handleSubmit}>\r\n <TextField\r\n fullWidth\r\n autoFocus\r\n type={showPassword ? 'text' : 'password'}\r\n label=\"Password\"\r\n placeholder=\"Enter password\"\r\n value={password}\r\n onChange={(e) => setPassword(e.target.value)}\r\n onKeyPress={handleKeyPress}\r\n error={Boolean(error)}\r\n InputProps={{\r\n endAdornment: (\r\n <InputAdornment position=\"end\">\r\n <IconButton\r\n onClick={handleTogglePasswordVisibility}\r\n edge=\"end\"\r\n size=\"small\"\r\n aria-label={showPassword ? 'Hide password' : 'Show password'}\r\n >\r\n {showPassword ? <VisibilityOffIcon /> : <VisibilityIcon />}\r\n </IconButton>\r\n </InputAdornment>\r\n )\r\n }}\r\n sx={{\r\n '& .MuiOutlinedInput-root': {\r\n borderRadius: 2\r\n }\r\n }}\r\n />\r\n </form>\r\n </DialogContent>\r\n\r\n <DialogActions sx={{ px: 3, pb: 3, pt: 2 }}>\r\n <Button\r\n onClick={onCancel}\r\n variant=\"outlined\"\r\n sx={{\r\n borderRadius: 2,\r\n textTransform: 'none',\r\n px: 3\r\n }}\r\n >\r\n Cancel\r\n </Button>\r\n <Button\r\n onClick={handleSubmit}\r\n variant=\"contained\"\r\n disabled={!password.trim()}\r\n sx={{\r\n borderRadius: 2,\r\n textTransform: 'none',\r\n px: 3,\r\n boxShadow: 2\r\n }}\r\n >\r\n Unlock PDF\r\n </Button>\r\n </DialogActions>\r\n </Dialog>\r\n );\r\n};"],"mappings":"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","names":["useEffect","useRef","useState","React","jsx","React","jsx","jsxs","React","SearchIcon","jsx","jsxs","useState","useEffect","TextField","Typography","IconButton","InputAdornment","Box","CloseIcon","jsx","jsxs","jsx","jsxs","useState","useRef","useEffect","error","zoom","fileName"]}
@@ -1130,7 +1130,7 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1130
1130
  const canExecuteSearch = isPDFReady && isPagesInitialized && isViewerAvailable && isSearchAPIReady;
1131
1131
  if (!canExecuteSearch) return;
1132
1132
  hasExecutedInitialSearch.current = true;
1133
- const SEARCH_INITIALIZATION_DELAY = 10;
1133
+ const SEARCH_INITIALIZATION_DELAY = 100;
1134
1134
  setTimeout(() => {
1135
1135
  if (!_optionalChain([pdfViewerRef, 'access', _82 => _82.current, 'optionalAccess', _83 => _83.search, 'optionalAccess', _84 => _84.searchText])) {
1136
1136
  console.warn("Search API became unavailable, skipping initial search");
@@ -1212,6 +1212,7 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1212
1212
  }
1213
1213
  } catch (error2) {
1214
1214
  }
1215
+ await new Promise((resolve) => setTimeout(resolve, 200));
1215
1216
  try {
1216
1217
  const selectors = [
1217
1218
  "[data-page-index]",
@@ -1230,6 +1231,15 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1230
1231
  }
1231
1232
  } catch (error2) {
1232
1233
  }
1234
+ try {
1235
+ const count = _optionalChain([viewer, 'access', _95 => _95.navigation, 'optionalAccess', _96 => _96.getTotalPages, 'optionalCall', _97 => _97()]);
1236
+ if (count && count > 0) {
1237
+ setTotalPages(count);
1238
+ return;
1239
+ }
1240
+ } catch (e) {
1241
+ }
1242
+ console.warn("Could not determine total pages, using fallback value of 1");
1233
1243
  setTotalPages(1);
1234
1244
  };
1235
1245
  initializePageCount();
@@ -1237,10 +1247,10 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1237
1247
  _react.useEffect.call(void 0, () => {
1238
1248
  if (state === "ready" && pdfViewerRef.current) {
1239
1249
  const updateInfo = () => {
1240
- const current = _optionalChain([pdfViewerRef, 'access', _95 => _95.current, 'optionalAccess', _96 => _96.navigation, 'access', _97 => _97.getCurrentPage, 'call', _98 => _98()]) || 1;
1241
- const total = _optionalChain([pdfViewerRef, 'access', _99 => _99.current, 'optionalAccess', _100 => _100.navigation, 'access', _101 => _101.getTotalPages, 'call', _102 => _102()]) || 0;
1242
- const zoomValue = _optionalChain([pdfViewerRef, 'access', _103 => _103.current, 'optionalAccess', _104 => _104.zoom, 'access', _105 => _105.getZoom, 'call', _106 => _106()]);
1243
- const currentSearchState = _optionalChain([pdfViewerRef, 'access', _107 => _107.current, 'optionalAccess', _108 => _108.search, 'access', _109 => _109.getSearchState, 'call', _110 => _110()]);
1250
+ const current = _optionalChain([pdfViewerRef, 'access', _98 => _98.current, 'optionalAccess', _99 => _99.navigation, 'access', _100 => _100.getCurrentPage, 'call', _101 => _101()]) || 1;
1251
+ const total = _optionalChain([pdfViewerRef, 'access', _102 => _102.current, 'optionalAccess', _103 => _103.navigation, 'access', _104 => _104.getTotalPages, 'call', _105 => _105()]) || 0;
1252
+ const zoomValue = _optionalChain([pdfViewerRef, 'access', _106 => _106.current, 'optionalAccess', _107 => _107.zoom, 'access', _108 => _108.getZoom, 'call', _109 => _109()]);
1253
+ const currentSearchState = _optionalChain([pdfViewerRef, 'access', _110 => _110.current, 'optionalAccess', _111 => _111.search, 'access', _112 => _112.getSearchState, 'call', _113 => _113()]);
1244
1254
  setCurrentPage(current);
1245
1255
  if (total > 0 && total !== totalPages) {
1246
1256
  setTotalPages(total);
@@ -1256,80 +1266,80 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1256
1266
  }, [state, totalPages]);
1257
1267
  _react.useImperativeHandle.call(void 0, ref, () => ({
1258
1268
  zoomIn: () => {
1259
- _optionalChain([pdfViewerRef, 'access', _111 => _111.current, 'optionalAccess', _112 => _112.zoom, 'access', _113 => _113.zoomIn, 'call', _114 => _114()]);
1269
+ _optionalChain([pdfViewerRef, 'access', _114 => _114.current, 'optionalAccess', _115 => _115.zoom, 'access', _116 => _116.zoomIn, 'call', _117 => _117()]);
1260
1270
  updateZoomDisplay();
1261
1271
  },
1262
1272
  zoomOut: () => {
1263
- _optionalChain([pdfViewerRef, 'access', _115 => _115.current, 'optionalAccess', _116 => _116.zoom, 'access', _117 => _117.zoomOut, 'call', _118 => _118()]);
1273
+ _optionalChain([pdfViewerRef, 'access', _118 => _118.current, 'optionalAccess', _119 => _119.zoom, 'access', _120 => _120.zoomOut, 'call', _121 => _121()]);
1264
1274
  updateZoomDisplay();
1265
1275
  },
1266
1276
  setZoom: (level) => {
1267
- _optionalChain([pdfViewerRef, 'access', _119 => _119.current, 'optionalAccess', _120 => _120.zoom, 'access', _121 => _121.setZoom, 'call', _122 => _122(level)]);
1277
+ _optionalChain([pdfViewerRef, 'access', _122 => _122.current, 'optionalAccess', _123 => _123.zoom, 'access', _124 => _124.setZoom, 'call', _125 => _125(level)]);
1268
1278
  updateZoomDisplay();
1269
1279
  },
1270
1280
  resetZoom: () => {
1271
- _optionalChain([pdfViewerRef, 'access', _123 => _123.current, 'optionalAccess', _124 => _124.zoom, 'access', _125 => _125.resetZoom, 'call', _126 => _126()]);
1281
+ _optionalChain([pdfViewerRef, 'access', _126 => _126.current, 'optionalAccess', _127 => _127.zoom, 'access', _128 => _128.resetZoom, 'call', _129 => _129()]);
1272
1282
  updateZoomDisplay();
1273
1283
  },
1274
1284
  getZoom: () => {
1275
- const zoom2 = _optionalChain([pdfViewerRef, 'access', _127 => _127.current, 'optionalAccess', _128 => _128.zoom, 'access', _129 => _129.getZoom, 'call', _130 => _130()]);
1285
+ const zoom2 = _optionalChain([pdfViewerRef, 'access', _130 => _130.current, 'optionalAccess', _131 => _131.zoom, 'access', _132 => _132.getZoom, 'call', _133 => _133()]);
1276
1286
  return typeof zoom2 === "number" ? zoom2 : 1;
1277
1287
  },
1278
1288
  goToPage: (page) => {
1279
- _optionalChain([pdfViewerRef, 'access', _131 => _131.current, 'optionalAccess', _132 => _132.navigation, 'access', _133 => _133.goToPage, 'call', _134 => _134(page)]);
1289
+ _optionalChain([pdfViewerRef, 'access', _134 => _134.current, 'optionalAccess', _135 => _135.navigation, 'access', _136 => _136.goToPage, 'call', _137 => _137(page)]);
1280
1290
  setCurrentPage(page);
1281
1291
  },
1282
- getCurrentPage: () => _optionalChain([pdfViewerRef, 'access', _135 => _135.current, 'optionalAccess', _136 => _136.navigation, 'access', _137 => _137.getCurrentPage, 'call', _138 => _138()]) || 1,
1283
- getTotalPages: () => _optionalChain([pdfViewerRef, 'access', _139 => _139.current, 'optionalAccess', _140 => _140.navigation, 'access', _141 => _141.getTotalPages, 'call', _142 => _142()]) || 0,
1292
+ getCurrentPage: () => _optionalChain([pdfViewerRef, 'access', _138 => _138.current, 'optionalAccess', _139 => _139.navigation, 'access', _140 => _140.getCurrentPage, 'call', _141 => _141()]) || 1,
1293
+ getTotalPages: () => _optionalChain([pdfViewerRef, 'access', _142 => _142.current, 'optionalAccess', _143 => _143.navigation, 'access', _144 => _144.getTotalPages, 'call', _145 => _145()]) || 0,
1284
1294
  nextPage: () => {
1285
- _optionalChain([pdfViewerRef, 'access', _143 => _143.current, 'optionalAccess', _144 => _144.navigation, 'access', _145 => _145.nextPage, 'call', _146 => _146()]);
1295
+ _optionalChain([pdfViewerRef, 'access', _146 => _146.current, 'optionalAccess', _147 => _147.navigation, 'access', _148 => _148.nextPage, 'call', _149 => _149()]);
1286
1296
  updatePageDisplay();
1287
1297
  },
1288
1298
  previousPage: () => {
1289
- _optionalChain([pdfViewerRef, 'access', _147 => _147.current, 'optionalAccess', _148 => _148.navigation, 'access', _149 => _149.previousPage, 'call', _150 => _150()]);
1299
+ _optionalChain([pdfViewerRef, 'access', _150 => _150.current, 'optionalAccess', _151 => _151.navigation, 'access', _152 => _152.previousPage, 'call', _153 => _153()]);
1290
1300
  updatePageDisplay();
1291
1301
  },
1292
1302
  goToFirstPage: () => {
1293
- _optionalChain([pdfViewerRef, 'access', _151 => _151.current, 'optionalAccess', _152 => _152.navigation, 'access', _153 => _153.goToFirstPage, 'call', _154 => _154()]);
1303
+ _optionalChain([pdfViewerRef, 'access', _154 => _154.current, 'optionalAccess', _155 => _155.navigation, 'access', _156 => _156.goToFirstPage, 'call', _157 => _157()]);
1294
1304
  updatePageDisplay();
1295
1305
  },
1296
1306
  goToLastPage: () => {
1297
- _optionalChain([pdfViewerRef, 'access', _155 => _155.current, 'optionalAccess', _156 => _156.navigation, 'access', _157 => _157.goToLastPage, 'call', _158 => _158()]);
1307
+ _optionalChain([pdfViewerRef, 'access', _158 => _158.current, 'optionalAccess', _159 => _159.navigation, 'access', _160 => _160.goToLastPage, 'call', _161 => _161()]);
1298
1308
  updatePageDisplay();
1299
1309
  },
1300
1310
  searchText: async (keyword) => {
1301
1311
  setIsSearching(true);
1302
- const results = await _optionalChain([pdfViewerRef, 'access', _159 => _159.current, 'optionalAccess', _160 => _160.search, 'access', _161 => _161.searchText, 'call', _162 => _162(keyword)]);
1312
+ const results = await _optionalChain([pdfViewerRef, 'access', _162 => _162.current, 'optionalAccess', _163 => _163.search, 'access', _164 => _164.searchText, 'call', _165 => _165(keyword)]);
1303
1313
  setIsSearching(false);
1304
1314
  setSearchQuery(keyword);
1305
1315
  return results;
1306
1316
  },
1307
1317
  nextResult: () => {
1308
- const index = _optionalChain([pdfViewerRef, 'access', _163 => _163.current, 'optionalAccess', _164 => _164.search, 'access', _165 => _165.nextResult, 'call', _166 => _166()]) || -1;
1318
+ const index = _optionalChain([pdfViewerRef, 'access', _166 => _166.current, 'optionalAccess', _167 => _167.search, 'access', _168 => _168.nextResult, 'call', _169 => _169()]) || -1;
1309
1319
  return index;
1310
1320
  },
1311
1321
  previousResult: () => {
1312
- const index = _optionalChain([pdfViewerRef, 'access', _167 => _167.current, 'optionalAccess', _168 => _168.search, 'access', _169 => _169.previousResult, 'call', _170 => _170()]) || -1;
1322
+ const index = _optionalChain([pdfViewerRef, 'access', _170 => _170.current, 'optionalAccess', _171 => _171.search, 'access', _172 => _172.previousResult, 'call', _173 => _173()]) || -1;
1313
1323
  return index;
1314
1324
  },
1315
- goToResult: (index) => _optionalChain([pdfViewerRef, 'access', _171 => _171.current, 'optionalAccess', _172 => _172.search, 'access', _173 => _173.goToResult, 'call', _174 => _174(index)]) || -1,
1325
+ goToResult: (index) => _optionalChain([pdfViewerRef, 'access', _174 => _174.current, 'optionalAccess', _175 => _175.search, 'access', _176 => _176.goToResult, 'call', _177 => _177(index)]) || -1,
1316
1326
  stopSearch: () => {
1317
- _optionalChain([pdfViewerRef, 'access', _175 => _175.current, 'optionalAccess', _176 => _176.search, 'access', _177 => _177.stopSearch, 'call', _178 => _178()]);
1327
+ _optionalChain([pdfViewerRef, 'access', _178 => _178.current, 'optionalAccess', _179 => _179.search, 'access', _180 => _180.stopSearch, 'call', _181 => _181()]);
1318
1328
  setSearchQuery("");
1319
1329
  },
1320
- getSearchState: () => _optionalChain([pdfViewerRef, 'access', _179 => _179.current, 'optionalAccess', _180 => _180.search, 'access', _181 => _181.getSearchState, 'call', _182 => _182()]) || null,
1321
- getSelectedText: () => _optionalChain([pdfViewerRef, 'access', _183 => _183.current, 'optionalAccess', _184 => _184.selection, 'access', _185 => _185.getSelectedText, 'call', _186 => _186()]) || "",
1322
- clearSelection: () => _optionalChain([pdfViewerRef, 'access', _187 => _187.current, 'optionalAccess', _188 => _188.selection, 'access', _189 => _189.clearSelection, 'call', _190 => _190()])
1330
+ getSearchState: () => _optionalChain([pdfViewerRef, 'access', _182 => _182.current, 'optionalAccess', _183 => _183.search, 'access', _184 => _184.getSearchState, 'call', _185 => _185()]) || null,
1331
+ getSelectedText: () => _optionalChain([pdfViewerRef, 'access', _186 => _186.current, 'optionalAccess', _187 => _187.selection, 'access', _188 => _188.getSelectedText, 'call', _189 => _189()]) || "",
1332
+ clearSelection: () => _optionalChain([pdfViewerRef, 'access', _190 => _190.current, 'optionalAccess', _191 => _191.selection, 'access', _192 => _192.clearSelection, 'call', _193 => _193()])
1323
1333
  }), []);
1324
1334
  const updatePageDisplay = () => {
1325
1335
  requestAnimationFrame(() => {
1326
- const current = _optionalChain([pdfViewerRef, 'access', _191 => _191.current, 'optionalAccess', _192 => _192.navigation, 'access', _193 => _193.getCurrentPage, 'call', _194 => _194()]) || 1;
1336
+ const current = _optionalChain([pdfViewerRef, 'access', _194 => _194.current, 'optionalAccess', _195 => _195.navigation, 'access', _196 => _196.getCurrentPage, 'call', _197 => _197()]) || 1;
1327
1337
  setCurrentPage(current);
1328
1338
  });
1329
1339
  };
1330
1340
  const updateZoomDisplay = () => {
1331
1341
  requestAnimationFrame(() => {
1332
- const zoomValue = _optionalChain([pdfViewerRef, 'access', _195 => _195.current, 'optionalAccess', _196 => _196.zoom, 'access', _197 => _197.getZoom, 'call', _198 => _198()]);
1342
+ const zoomValue = _optionalChain([pdfViewerRef, 'access', _198 => _198.current, 'optionalAccess', _199 => _199.zoom, 'access', _200 => _200.getZoom, 'call', _201 => _201()]);
1333
1343
  if (typeof zoomValue === "number") {
1334
1344
  setZoom(Math.round(zoomValue * 100));
1335
1345
  }
@@ -1338,9 +1348,9 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1338
1348
  const handleSearch = async () => {
1339
1349
  if (!searchQuery.trim()) return;
1340
1350
  setIsSearching(true);
1341
- const results = await _optionalChain([pdfViewerRef, 'access', _199 => _199.current, 'optionalAccess', _200 => _200.search, 'access', _201 => _201.searchText, 'call', _202 => _202(searchQuery)]);
1351
+ const results = await _optionalChain([pdfViewerRef, 'access', _202 => _202.current, 'optionalAccess', _203 => _203.search, 'access', _204 => _204.searchText, 'call', _205 => _205(searchQuery)]);
1342
1352
  setIsSearching(false);
1343
- if (_optionalChain([results, 'optionalAccess', _203 => _203.results]) && Array.isArray(results.results) && results.results.length > 0) {
1353
+ if (_optionalChain([results, 'optionalAccess', _206 => _206.results]) && Array.isArray(results.results) && results.results.length > 0) {
1344
1354
  const formattedResults = formatSearchResults(results.results);
1345
1355
  updateSearchState(formattedResults);
1346
1356
  } else {
@@ -1358,10 +1368,10 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1358
1368
  setSearchResults([]);
1359
1369
  setTotalSearchResults(0);
1360
1370
  setCurrentSearchResultIndex(0);
1361
- _optionalChain([pdfViewerRef, 'access', _204 => _204.current, 'optionalAccess', _205 => _205.search, 'access', _206 => _206.stopSearch, 'call', _207 => _207()]);
1371
+ _optionalChain([pdfViewerRef, 'access', _207 => _207.current, 'optionalAccess', _208 => _208.search, 'access', _209 => _209.stopSearch, 'call', _210 => _210()]);
1362
1372
  return;
1363
1373
  }
1364
- if (!_optionalChain([pdfViewerRef, 'access', _208 => _208.current, 'optionalAccess', _209 => _209.search, 'optionalAccess', _210 => _210.searchText])) {
1374
+ if (!_optionalChain([pdfViewerRef, 'access', _211 => _211.current, 'optionalAccess', _212 => _212.search, 'optionalAccess', _213 => _213.searchText])) {
1365
1375
  console.warn("Search functionality not yet available");
1366
1376
  return;
1367
1377
  }
@@ -1370,7 +1380,7 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1370
1380
  const results = await pdfViewerRef.current.search.searchText(keyword);
1371
1381
  console.log("Search completed:", results);
1372
1382
  setIsSearching(false);
1373
- const hasValidResults = _optionalChain([results, 'optionalAccess', _211 => _211.results]) && Array.isArray(results.results) && results.results.length > 0;
1383
+ const hasValidResults = _optionalChain([results, 'optionalAccess', _214 => _214.results]) && Array.isArray(results.results) && results.results.length > 0;
1374
1384
  if (hasValidResults) {
1375
1385
  const formattedResults = formatSearchResults(results.results);
1376
1386
  updateSearchState(formattedResults);
@@ -1436,24 +1446,24 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1436
1446
  };
1437
1447
  const navigateToPage = (pageNumber) => {
1438
1448
  requestAnimationFrame(() => {
1439
- _optionalChain([pdfViewerRef, 'access', _212 => _212.current, 'optionalAccess', _213 => _213.navigation, 'access', _214 => _214.goToPage, 'call', _215 => _215(pageNumber)]);
1449
+ _optionalChain([pdfViewerRef, 'access', _215 => _215.current, 'optionalAccess', _216 => _216.navigation, 'access', _217 => _217.goToPage, 'call', _218 => _218(pageNumber)]);
1440
1450
  setCurrentPage(pageNumber);
1441
1451
  });
1442
1452
  };
1443
1453
  const handleSearchResultClick = (pageNumber, resultIndex) => {
1444
- _optionalChain([pdfViewerRef, 'access', _216 => _216.current, 'optionalAccess', _217 => _217.navigation, 'access', _218 => _218.goToPage, 'call', _219 => _219(pageNumber)]);
1454
+ _optionalChain([pdfViewerRef, 'access', _219 => _219.current, 'optionalAccess', _220 => _220.navigation, 'access', _221 => _221.goToPage, 'call', _222 => _222(pageNumber)]);
1445
1455
  setCurrentSearchResultIndex(resultIndex);
1446
1456
  setCurrentPage(pageNumber);
1447
- _optionalChain([pdfViewerRef, 'access', _220 => _220.current, 'optionalAccess', _221 => _221.search, 'access', _222 => _222.goToResult, 'call', _223 => _223(resultIndex)]);
1457
+ _optionalChain([pdfViewerRef, 'access', _223 => _223.current, 'optionalAccess', _224 => _224.search, 'access', _225 => _225.goToResult, 'call', _226 => _226(resultIndex)]);
1448
1458
  };
1449
1459
  const handleNextSearchResult = () => {
1450
1460
  if (currentSearchResultIndex < totalSearchResults - 1) {
1451
1461
  const nextIndex = currentSearchResultIndex + 1;
1452
1462
  setCurrentSearchResultIndex(nextIndex);
1453
- _optionalChain([pdfViewerRef, 'access', _224 => _224.current, 'optionalAccess', _225 => _225.search, 'access', _226 => _226.nextResult, 'call', _227 => _227()]);
1463
+ _optionalChain([pdfViewerRef, 'access', _227 => _227.current, 'optionalAccess', _228 => _228.search, 'access', _229 => _229.nextResult, 'call', _230 => _230()]);
1454
1464
  if (searchResults[nextIndex]) {
1455
1465
  const pageNumber = searchResults[nextIndex].pageNumber;
1456
- _optionalChain([pdfViewerRef, 'access', _228 => _228.current, 'optionalAccess', _229 => _229.navigation, 'access', _230 => _230.goToPage, 'call', _231 => _231(pageNumber)]);
1466
+ _optionalChain([pdfViewerRef, 'access', _231 => _231.current, 'optionalAccess', _232 => _232.navigation, 'access', _233 => _233.goToPage, 'call', _234 => _234(pageNumber)]);
1457
1467
  setCurrentPage(pageNumber);
1458
1468
  }
1459
1469
  }
@@ -1462,10 +1472,10 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1462
1472
  if (currentSearchResultIndex > 0) {
1463
1473
  const prevIndex = currentSearchResultIndex - 1;
1464
1474
  setCurrentSearchResultIndex(prevIndex);
1465
- _optionalChain([pdfViewerRef, 'access', _232 => _232.current, 'optionalAccess', _233 => _233.search, 'access', _234 => _234.previousResult, 'call', _235 => _235()]);
1475
+ _optionalChain([pdfViewerRef, 'access', _235 => _235.current, 'optionalAccess', _236 => _236.search, 'access', _237 => _237.previousResult, 'call', _238 => _238()]);
1466
1476
  if (searchResults[prevIndex]) {
1467
1477
  const pageNumber = searchResults[prevIndex].pageNumber;
1468
- _optionalChain([pdfViewerRef, 'access', _236 => _236.current, 'optionalAccess', _237 => _237.navigation, 'access', _238 => _238.goToPage, 'call', _239 => _239(pageNumber)]);
1478
+ _optionalChain([pdfViewerRef, 'access', _239 => _239.current, 'optionalAccess', _240 => _240.navigation, 'access', _241 => _241.goToPage, 'call', _242 => _242(pageNumber)]);
1469
1479
  setCurrentPage(pageNumber);
1470
1480
  }
1471
1481
  }
@@ -1496,12 +1506,12 @@ var PDFViewerContent = _react.forwardRef.call(void 0, (props, ref) => {
1496
1506
  }
1497
1507
  setPdfBuffer(arrayBuffer);
1498
1508
  setState("ready");
1499
- _optionalChain([onLoad, 'optionalCall', _240 => _240()]);
1509
+ _optionalChain([onLoad, 'optionalCall', _243 => _243()]);
1500
1510
  } catch (err) {
1501
1511
  const errorMessage = err.message || "Failed to load PDF";
1502
1512
  setState("error");
1503
1513
  setError(errorMessage);
1504
- _optionalChain([onError, 'optionalCall', _241 => _241(err)]);
1514
+ _optionalChain([onError, 'optionalCall', _244 => _244(err)]);
1505
1515
  }
1506
1516
  };
1507
1517
  loadPDF();
@@ -1675,4 +1685,4 @@ PDFViewer.displayName = "PDFViewer";
1675
1685
 
1676
1686
 
1677
1687
  exports.PDFViewer = PDFViewer;
1678
- //# sourceMappingURL=chunk-HQJPMN53.js.map
1688
+ //# sourceMappingURL=chunk-RSCUIGVW.js.map