UNPKG

@salina-app/pdf-viewer-react

Version:
1 lines 34.9 kB
{"version":3,"sources":["../../src/SalinaPDFViewer.tsx","../../src/hooks/usePDFViewer.ts","../../src/components/PDFViewerToolbar.tsx","../../src/index.ts"],"sourcesContent":["import React, {\n useRef,\n useEffect,\n useImperativeHandle,\n forwardRef,\n} from \"react\";\nimport {\n SalinaPDFViewer as CoreViewer,\n type SalinaPDFViewerOptions,\n type Highlight,\n type SearchResult,\n} from \"@salina-app/pdf-viewer-core\";\nimport type { ActiveHighlight } from \"@salina-app/pdf-viewer-core\";\n\nexport interface SalinaPDFViewerProps\n extends Omit<SalinaPDFViewerOptions, \"container\"> {\n className?: string;\n style?: React.CSSProperties;\n onHighlight?: (highlight: Highlight) => void;\n onHighlightRemove?: (highlightId: string) => void;\n onSearch?: (results: SearchResult[]) => void;\n onPageChange?: (page: number, totalPages: number) => void;\n onLoad?: (totalPages: number) => void;\n onError?: (error: Error) => void;\n onZoom?: (scale: number) => void;\n}\n\nexport interface SalinaPDFViewerRef {\n // Navigation\n goToPage: (page: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n\n // Zoom\n zoomIn: () => void;\n zoomOut: () => void;\n setZoom: (scale: number) => void;\n fitToWidth: () => void;\n fitToHeight: () => void;\n\n // Search\n search: (query: string) => SearchResult[];\n clearSearch: () => void;\n nextSearchResult: () => void;\n prevSearchResult: () => void;\n\n // Highlighting (simplified API)\n addHighlight: () => void;\n removeHighlight: () => boolean;\n clearHighlights: () => void;\n getHighlights: () => ActiveHighlight[];\n exportHighlights: () => string;\n importHighlights: () => void;\n\n // Document\n loadDocument: (file: File | string | ArrayBuffer) => Promise<void>;\n\n // Getters\n getCurrentPage: () => number;\n getTotalPages: () => number;\n getScale: () => number;\n getSearchResults: () => SearchResult[];\n getCurrentSearchIndex: () => number;\n isLoading: () => boolean;\n getError: () => string | null;\n\n // Core instance\n getViewer: () => CoreViewer;\n}\n\nexport const SalinaPDFViewer = forwardRef<\n SalinaPDFViewerRef,\n SalinaPDFViewerProps\n>(({ className, style, ...props }, ref) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const viewerRef = useRef<CoreViewer | null>(null);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n const viewer = new CoreViewer({\n ...props,\n container: containerRef.current,\n callbacks: {\n onHighlight: props.onHighlight,\n onHighlightRemove: props.onHighlightRemove,\n onSearch: props.onSearch,\n onPageChange: props.onPageChange,\n onLoad: props.onLoad,\n onError: props.onError,\n onZoom: props.onZoom,\n },\n });\n\n viewerRef.current = viewer;\n\n return () => {\n viewer.destroy();\n viewerRef.current = null;\n };\n }, []);\n\n // Update callbacks when props change\n useEffect(() => {\n if (!viewerRef.current) return;\n\n const viewer = viewerRef.current;\n\n // Remove old listeners\n viewer.removeAllListeners();\n\n // Add new listeners\n if (props.onHighlight) {\n viewer.on(\"highlight:added\", props.onHighlight);\n }\n if (props.onHighlightRemove) {\n viewer.on(\"highlight:removed\", props.onHighlightRemove);\n }\n if (props.onSearch) {\n viewer.on(\"search:results\", props.onSearch);\n }\n if (props.onPageChange) {\n viewer.on(\"page:changed\", props.onPageChange);\n }\n if (props.onLoad) {\n viewer.on(\"document:loaded\", props.onLoad);\n }\n if (props.onError) {\n viewer.on(\"document:error\", props.onError);\n }\n if (props.onZoom) {\n viewer.on(\"zoom:changed\", props.onZoom);\n }\n }, [\n props.onHighlight,\n props.onHighlightRemove,\n props.onSearch,\n props.onPageChange,\n props.onLoad,\n props.onError,\n props.onZoom,\n ]);\n\n // Load file when it changes\n useEffect(() => {\n if (props.file && viewerRef.current) {\n viewerRef.current.loadDocument(props.file);\n }\n }, [props.file]);\n\n useImperativeHandle(\n ref,\n () => ({\n // Navigation\n goToPage: (page: number) => viewerRef.current?.goToPage(page),\n nextPage: () => viewerRef.current?.nextPage(),\n prevPage: () => viewerRef.current?.prevPage(),\n\n // Zoom\n zoomIn: () => viewerRef.current?.zoomIn(),\n zoomOut: () => viewerRef.current?.zoomOut(),\n setZoom: (scale: number) => viewerRef.current?.setZoom(scale),\n fitToWidth: () => viewerRef.current?.fitToWidth(),\n fitToHeight: () => viewerRef.current?.fitToHeight(),\n\n // Search\n search: (query: string) => viewerRef.current?.search(query) || [],\n clearSearch: () => viewerRef.current?.clearSearch(),\n nextSearchResult: () => viewerRef.current?.nextSearchResult(),\n prevSearchResult: () => viewerRef.current?.prevSearchResult(),\n\n // Highlighting (simplified API)\n addHighlight: () => {\n viewerRef.current?.addHighlight();\n return undefined; // Simple highlighter doesn't return highlight objects\n },\n removeHighlight: () => {\n viewerRef.current?.removeHighlight();\n return true; // Always returns true for compatibility\n },\n clearHighlights: () => viewerRef.current?.clearHighlights(),\n getHighlights: () => viewerRef.current?.getHighlights() || [],\n exportHighlights: () => viewerRef.current?.exportHighlights() || \"\",\n importHighlights: () => {\n viewerRef.current?.importHighlights();\n },\n\n // Document\n loadDocument: (file) =>\n viewerRef.current?.loadDocument(file) || Promise.resolve(),\n\n // Getters\n getCurrentPage: () => viewerRef.current?.getCurrentPage() || 1,\n getTotalPages: () => viewerRef.current?.getTotalPages() || 0,\n getScale: () => viewerRef.current?.getScale() || 1,\n getSearchResults: () => viewerRef.current?.getSearchResults() || [],\n getCurrentSearchIndex: () =>\n viewerRef.current?.getCurrentSearchIndex() || -1,\n isLoading: () => viewerRef.current?.isLoading() || false,\n getError: () => viewerRef.current?.getError() || null,\n\n // Core instance\n getViewer: () => viewerRef.current!,\n }),\n []\n );\n\n return <div ref={containerRef} className={className} style={style} />;\n});\n\nSalinaPDFViewer.displayName = \"SalinaPDFViewer\";\n","import { useState, useCallback, useRef, useEffect } from \"react\";\nimport type {\n SearchResult,\n SalinaPDFViewerOptions,\n} from \"@salina-app/pdf-viewer-core\";\nimport type { SalinaPDFViewerRef } from \"../SalinaPDFViewer\";\n\nexport interface UsePDFViewerOptions extends Partial<SalinaPDFViewerOptions> {\n file?: File | string | ArrayBuffer;\n}\n\nexport interface UsePDFViewerReturn {\n // State\n currentPage: number;\n totalPages: number;\n scale: number;\n isLoading: boolean;\n error: string | null;\n searchResults: SearchResult[];\n currentSearchIndex: number;\n // Actions\n goToPage: (page: number) => void;\n nextPage: () => void;\n prevPage: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n setZoom: (scale: number) => void;\n fitToWidth: () => void;\n fitToHeight: () => void;\n search: (query: string) => SearchResult[];\n clearSearch: () => void;\n nextSearchResult: () => void;\n prevSearchResult: () => void;\n loadDocument: (file: File | string | ArrayBuffer) => Promise<void>;\n\n // Simple highlighting (no state management needed - handled by SimpleHighlighter internally)\n clearHighlights: () => void;\n\n // Ref and callbacks for SalinaPDFViewer component\n viewerRef: React.RefObject<SalinaPDFViewerRef | null>;\n callbacks: {\n onPageChange: (page: number, totalPages: number) => void;\n onLoad: (totalPages: number) => void;\n onError: (error: Error) => void;\n onZoom: (scale: number) => void;\n onSearch: (results: SearchResult[]) => void;\n };\n}\n\nexport function usePDFViewer(\n options: UsePDFViewerOptions = {}\n): UsePDFViewerReturn {\n const viewerRef = useRef<SalinaPDFViewerRef | null>(null);\n\n // State\n const [currentPage, setCurrentPage] = useState(1);\n const [totalPages, setTotalPages] = useState(0);\n const [scale, setScale] = useState(1.0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [currentSearchIndex, setCurrentSearchIndex] = useState(-1);\n // Update state when viewer events fire\n const handlePageChange = useCallback((page: number, total: number) => {\n setCurrentPage(page);\n setTotalPages(total);\n }, []);\n\n const handleLoad = useCallback((total: number) => {\n setTotalPages(total);\n setIsLoading(false);\n setError(null);\n }, []);\n\n const handleError = useCallback((err: Error) => {\n setError(err.message);\n setIsLoading(false);\n }, []);\n\n const handleZoom = useCallback((newScale: number) => {\n setScale(newScale);\n }, []);\n\n const handleSearch = useCallback((results: SearchResult[]) => {\n setSearchResults(results);\n setCurrentSearchIndex(results.length > 0 ? 0 : -1);\n }, []);\n\n // Actions\n const goToPage = useCallback((page: number) => {\n viewerRef.current?.goToPage(page);\n }, []);\n\n const nextPage = useCallback(() => {\n viewerRef.current?.nextPage();\n }, []);\n\n const prevPage = useCallback(() => {\n viewerRef.current?.prevPage();\n }, []);\n\n const zoomIn = useCallback(() => {\n viewerRef.current?.zoomIn();\n }, []);\n\n const zoomOut = useCallback(() => {\n viewerRef.current?.zoomOut();\n }, []);\n\n const setZoomCallback = useCallback((newScale: number) => {\n viewerRef.current?.setZoom(newScale);\n }, []);\n\n const fitToWidth = useCallback(() => {\n viewerRef.current?.fitToWidth();\n }, []);\n\n const fitToHeight = useCallback(() => {\n viewerRef.current?.fitToHeight();\n }, []);\n\n const search = useCallback((query: string) => {\n return viewerRef.current?.search(query) || [];\n }, []);\n\n const clearSearch = useCallback(() => {\n viewerRef.current?.clearSearch();\n setSearchResults([]);\n setCurrentSearchIndex(-1);\n }, []);\n\n const nextSearchResult = useCallback(() => {\n viewerRef.current?.nextSearchResult();\n setCurrentSearchIndex((prev) =>\n searchResults.length > 0 ? (prev + 1) % searchResults.length : -1\n );\n }, [searchResults.length]);\n\n const prevSearchResult = useCallback(() => {\n viewerRef.current?.prevSearchResult();\n setCurrentSearchIndex((prev) =>\n searchResults.length > 0\n ? prev === 0\n ? searchResults.length - 1\n : prev - 1\n : -1\n );\n }, [searchResults.length]);\n\n const clearHighlights = useCallback(() => {\n viewerRef.current?.clearHighlights();\n }, []);\n\n const loadDocument = useCallback(\n async (file: File | string | ArrayBuffer) => {\n setIsLoading(true);\n setError(null);\n return viewerRef.current?.loadDocument(file) || Promise.resolve();\n },\n []\n );\n\n // Note: Event handling is done through the SalinaPDFViewer component's callbacks\n // The handlers above are used by the React component wrapper\n\n // Load initial file\n useEffect(() => {\n if (options.file) {\n loadDocument(options.file);\n }\n }, [options.file, loadDocument]);\n\n return {\n // State\n currentPage,\n totalPages,\n scale,\n isLoading,\n error,\n searchResults,\n currentSearchIndex,\n\n // Actions\n goToPage,\n nextPage,\n prevPage,\n zoomIn,\n zoomOut,\n setZoom: setZoomCallback,\n fitToWidth,\n fitToHeight,\n search,\n clearSearch,\n nextSearchResult,\n prevSearchResult,\n clearHighlights,\n loadDocument,\n\n // Ref and callbacks\n viewerRef,\n callbacks: {\n onPageChange: handlePageChange,\n onLoad: handleLoad,\n onError: handleError,\n onZoom: handleZoom,\n onSearch: handleSearch,\n },\n };\n}\n","import React from \"react\";\nimport type { SalinaPDFViewerRef } from \"../SalinaPDFViewer\";\n\nexport interface PDFViewerToolbarProps {\n viewerRef: React.RefObject<SalinaPDFViewerRef>;\n currentPage?: number;\n totalPages?: number;\n scale?: number;\n searchResults?: any[];\n currentSearchIndex?: number;\n highlightCount?: number;\n onSearch?: (query: string) => void;\n className?: string;\n style?: React.CSSProperties;\n}\n\nexport const PDFViewerToolbar: React.FC<PDFViewerToolbarProps> = ({\n viewerRef,\n currentPage = 1,\n totalPages = 0,\n scale = 1.0,\n searchResults = [],\n currentSearchIndex = -1,\n highlightCount = 0,\n onSearch,\n className,\n style,\n}) => {\n const [searchQuery, setSearchQuery] = React.useState(\"\");\n\n const handleSearchSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!viewerRef || !viewerRef.current) {\n console.warn(\"PDFViewerToolbar: viewerRef is not available\");\n return;\n }\n\n if (searchQuery.trim()) {\n viewerRef.current?.search(searchQuery.trim());\n onSearch?.(searchQuery.trim());\n } else {\n viewerRef.current?.clearSearch();\n }\n };\n\n const handleExportHighlights = () => {\n if (!viewerRef || !viewerRef.current) {\n console.warn(\"PDFViewerToolbar: viewerRef is not available\");\n return;\n }\n\n const data = viewerRef.current?.exportHighlights();\n if (data) {\n const blob = new Blob([data], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = \"highlights.json\";\n link.click();\n URL.revokeObjectURL(url);\n }\n };\n\n const handleImportHighlights = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = () => {\n try {\n if (!viewerRef || !viewerRef.current) {\n console.warn(\"PDFViewerToolbar: viewerRef is not available\");\n return;\n }\n // Note: Simple highlighter doesn't support importing highlights\n viewerRef.current?.importHighlights();\n console.warn(\n \"Import highlights not supported in simple highlighter mode\"\n );\n } catch (error) {\n alert(\"Failed to import highlights: \" + error);\n }\n };\n reader.readAsText(file);\n }\n };\n\n return (\n <div\n className={`salina-pdf-toolbar ${className || \"\"}`}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"1rem\",\n padding: \"0.5rem 1rem\",\n backgroundColor: \"#f8f9fa\",\n borderBottom: \"1px solid #e9ecef\",\n flexWrap: \"wrap\",\n ...style,\n }}\n >\n {/* Page Navigation */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <button\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.prevPage();\n }\n }}\n disabled={currentPage <= 1}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: currentPage <= 1 ? \"not-allowed\" : \"pointer\",\n opacity: currentPage <= 1 ? 0.5 : 1,\n }}\n >\n\n </button>\n\n <span\n style={{ fontSize: \"0.9rem\", minWidth: \"4rem\", textAlign: \"center\" }}\n >\n {currentPage} / {totalPages}\n </span>\n\n <button\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.nextPage();\n }\n }}\n disabled={currentPage >= totalPages}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: currentPage >= totalPages ? \"not-allowed\" : \"pointer\",\n opacity: currentPage >= totalPages ? 0.5 : 1,\n }}\n >\n\n </button>\n </div>\n\n {/* Zoom Controls */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <button\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.zoomOut();\n }\n }}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n }}\n >\n -\n </button>\n\n <span\n style={{ fontSize: \"0.9rem\", minWidth: \"4rem\", textAlign: \"center\" }}\n >\n {Math.round(scale * 100)}%\n </span>\n\n <button\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.zoomIn();\n }\n }}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n }}\n >\n +\n </button>\n\n <button\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.fitToWidth();\n }\n }}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n fontSize: \"0.8rem\",\n }}\n >\n Fit Width\n </button>\n </div>\n\n {/* Search */}\n <form\n onSubmit={handleSearchSubmit}\n style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}\n >\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search in PDF...\"\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n minWidth: \"150px\",\n }}\n />\n\n <button\n type=\"submit\"\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n }}\n >\n Search\n </button>\n\n {searchResults.length > 0 && (\n <>\n <button\n type=\"button\"\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.prevSearchResult();\n }\n }}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n }}\n >\n\n </button>\n\n <span style={{ fontSize: \"0.8rem\" }}>\n {currentSearchIndex + 1} / {searchResults.length}\n </span>\n\n <button\n type=\"button\"\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.nextSearchResult();\n }\n }}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n }}\n >\n\n </button>\n </>\n )}\n </form>\n\n {/* Highlights */}\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <button\n onClick={handleExportHighlights}\n disabled={highlightCount === 0}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: highlightCount === 0 ? \"not-allowed\" : \"pointer\",\n opacity: highlightCount === 0 ? 0.5 : 1,\n fontSize: \"0.8rem\",\n }}\n >\n Export\n </button>\n\n <label\n style={{\n position: \"relative\",\n overflow: \"hidden\",\n display: \"inline-block\",\n }}\n >\n <input\n type=\"file\"\n accept=\".json\"\n onChange={handleImportHighlights}\n style={{\n position: \"absolute\",\n left: \"-9999px\",\n }}\n />\n <span\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: \"pointer\",\n fontSize: \"0.8rem\",\n display: \"inline-block\",\n }}\n >\n Import\n </span>\n </label>\n\n <button\n onClick={() => {\n if (viewerRef && viewerRef.current) {\n viewerRef.current?.clearHighlights();\n }\n }}\n disabled={highlightCount === 0}\n style={{\n padding: \"0.25rem 0.5rem\",\n border: \"1px solid #ccc\",\n borderRadius: \"4px\",\n background: \"white\",\n cursor: highlightCount === 0 ? \"not-allowed\" : \"pointer\",\n opacity: highlightCount === 0 ? 0.5 : 1,\n fontSize: \"0.8rem\",\n }}\n >\n Clear\n </button>\n\n <span style={{ fontSize: \"0.8rem\", color: \"#666\" }}>\n {highlightCount} highlights\n </span>\n </div>\n </div>\n );\n};\n\nPDFViewerToolbar.displayName = \"PDFViewerToolbar\";\n","// Main component exports\nexport { SalinaPDFViewer } from \"./SalinaPDFViewer\";\nexport type {\n SalinaPDFViewerProps,\n SalinaPDFViewerRef,\n} from \"./SalinaPDFViewer\";\n\n// Hook exports\nexport { usePDFViewer } from \"./hooks/usePDFViewer\";\nexport type {\n UsePDFViewerOptions,\n UsePDFViewerReturn,\n} from \"./hooks/usePDFViewer\";\n\n// Component exports\nexport { PDFViewerToolbar } from \"./components/PDFViewerToolbar\";\nexport type { PDFViewerToolbarProps } from \"./components/PDFViewerToolbar\";\n\n// Re-export core types for convenience\nexport type {\n SalinaPDFViewerOptions,\n Highlight,\n SearchResult,\n PDFPage,\n ViewerState,\n SalinaPDFPlugin,\n EventMap,\n} from \"@salina-app/pdf-viewer-core\";\n\n// Version\nexport const VERSION = \"1.0.0\";\n"],"mappings":"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","names":["useRef","useEffect","React","jsx"]}