import { useEffect, useRef, useState } from 'react'; // @ts-ignore import * as pdfjsLib from 'pdfjs-dist'; import styles from '../ContentPreview.module.css'; import { useLanguage } from '../../../providers/language/LanguageContext'; // Set worker source for PDF.js if (typeof window !== 'undefined') { // Try to use local worker first, fallback to CDN try { pdfjsLib.GlobalWorkerOptions.workerSrc = new URL( '../../../../node_modules/pdfjs-dist/build/pdf.worker.min.js', import.meta.url ).toString(); } catch (e) { // Fallback to CDN if local worker not available pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`; } } interface PdfJsRendererProps { previewUrl: string; fileName: string; onError: () => void; onLoad?: () => void; } export function PdfJsRenderer({ previewUrl, fileName: _fileName, onError, onLoad }: PdfJsRendererProps) { const { t } = useLanguage(); const canvasRef = useRef(null); const containerRef = useRef(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const [numPages, setNumPages] = useState(0); const [currentPage, setCurrentPage] = useState(1); const [scale, setScale] = useState(1.5); useEffect(() => { let pdfDoc: pdfjsLib.PDFDocumentProxy | null = null; let isMounted = true; const loadPdf = async () => { try { setIsLoading(true); setError(null); // Load PDF using fetch (like download) const response = await fetch(previewUrl); if (!response.ok) { throw new Error(`Failed to fetch PDF: ${response.statusText}`); } const arrayBuffer = await response.arrayBuffer(); const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer }); pdfDoc = await loadingTask.promise; if (!isMounted) return; setNumPages(pdfDoc.numPages); setIsLoading(false); if (onLoad) { onLoad(); } } catch (err) { console.error('Error loading PDF with PDF.js:', err); if (isMounted) { setError(err instanceof Error ? err.message : t('PDF konnte nicht geladen werden.')); setIsLoading(false); onError(); } } }; loadPdf(); return () => { isMounted = false; }; }, [previewUrl, onLoad, onError]); useEffect(() => { if (!canvasRef.current || isLoading || error) return; let isMounted = true; const renderPage = async (pageNum: number) => { try { // Load PDF again for rendering (could be optimized with caching) const response = await fetch(previewUrl); const arrayBuffer = await response.arrayBuffer(); const loadingTask = pdfjsLib.getDocument({ data: arrayBuffer }); const pdfDoc = await loadingTask.promise; if (!isMounted) return; const page = await pdfDoc.getPage(pageNum); const viewport = page.getViewport({ scale }); const canvas = canvasRef.current; if (!canvas) return; canvas.height = viewport.height; canvas.width = viewport.width; const context = canvas.getContext('2d'); if (!context) return; const renderContext = { canvasContext: context, viewport: viewport, }; await page.render(renderContext).promise; } catch (err) { console.error('Error rendering PDF page:', err); if (isMounted) { setError(err instanceof Error ? err.message : t('PDF-Seite konnte nicht gerendert werden.')); } } }; renderPage(currentPage); return () => { isMounted = false; }; }, [previewUrl, currentPage, scale, isLoading, error]); if (error) { return (
⚠️

{t('Fehler beim Laden der PDF:')} {error}

); } if (isLoading) { return (

{t('PDF wird geladen')}

); } return (
{/* Navigation Controls */} {numPages > 1 && (
Seite {currentPage} von {numPages}
{Math.round(scale * 100)}%
)} {/* PDF Canvas */}
); }