import React, { useEffect, useState, useRef } from "react"; import * as pdfjsLib from "pdfjs-dist"; import { fetchNoteBlob } from "../api/notesService"; import { ChevronLeft, ChevronRight, ZoomIn, ZoomOut, Loader2, } from "lucide-react"; // Configure PDF Worker (Required for pdfjs-dist) pdfjsLib.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjsLib.version}/build/pdf.worker.min.mjs`; interface Props { noteId: number; } const SecurePdfViewer: React.FC = ({ noteId }) => { const [pdfDoc, setPdfDoc] = useState(null); const [pageNum, setPageNum] = useState(1); const [scale, setScale] = useState(1.2); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const canvasRef = useRef(null); // 1. Fetch and Load PDF Data useEffect(() => { let isMounted = true; const loadPdf = async () => { try { setLoading(true); setError(null); // Fetch securely using existing Axios setup (sends Auth header) const blob = await fetchNoteBlob(noteId); const arrayBuffer = await blob.arrayBuffer(); // Load into PDF.js const loadedPdf = await pdfjsLib.getDocument({ data: arrayBuffer }) .promise; if (isMounted) { setPdfDoc(loadedPdf); setPageNum(1); setLoading(false); } } catch (err) { console.error("PDF Load Error:", err); if (isMounted) setError("Failed to load PDF. Please try again."); setLoading(false); } }; if (noteId) loadPdf(); return () => { isMounted = false; }; }, [noteId]); // 2. Render Page on Canvas useEffect(() => { if (!pdfDoc || !canvasRef.current) return; const renderPage = async () => { try { const page = await pdfDoc.getPage(pageNum); const viewport = page.getViewport({ scale }); const canvas = canvasRef.current!; const context = canvas.getContext("2d")!; // Handle High DPI screens const outputScale = window.devicePixelRatio || 1; canvas.width = Math.floor(viewport.width * outputScale); canvas.height = Math.floor(viewport.height * outputScale); canvas.style.width = Math.floor(viewport.width) + "px"; canvas.style.height = Math.floor(viewport.height) + "px"; const transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : undefined; await page.render({ canvasContext: context, canvas: canvas, // <--- FIX APPLIED HERE viewport: viewport, transform: transform, }).promise; } catch (err) { console.error("Page Render Error:", err); } }; renderPage(); }, [pdfDoc, pageNum, scale]); if (loading) { return (

Securely loading document...

); } if (error) { return
{error}
; } return (
{/* Toolbar */}
{pageNum} / {pdfDoc?.numPages}
{Math.round(scale * 100)}%
{/* Scrollable Canvas Area */}
); }; export default SecurePdfViewer;