import "./PdfPages.css"; import { useCallback, useEffect, useRef, useState } from "preact/hooks"; import { useActiveNoteContext, useGetContextData, useNoteProperty } from "../react/hooks"; import RightPanelWidget from "./RightPanelWidget"; export default function PdfPages() { const { note } = useActiveNoteContext(); const noteType = useNoteProperty(note, "type"); const noteMime = useNoteProperty(note, "mime"); if (noteType !== "file" || noteMime !== "application/pdf") { return null; } return ( ); } function PdfPagesList() { const pagesData = useGetContextData("pdfPages"); const [thumbnails, setThumbnails] = useState>(new Map()); const requestedThumbnails = useRef>(new Set()); useEffect(() => { // Listen for thumbnail responses via custom event function handleThumbnail(event: CustomEvent) { const { pageNumber, dataUrl } = event.detail; console.log("[PdfPages] Received thumbnail for page:", pageNumber); setThumbnails(prev => new Map(prev).set(pageNumber, dataUrl)); } window.addEventListener("pdf-thumbnail", handleThumbnail as EventListener); return () => { window.removeEventListener("pdf-thumbnail", handleThumbnail as EventListener); }; }, []); const requestThumbnail = useCallback((pageNumber: number) => { // Only request if we haven't already requested it and don't have it if (!requestedThumbnails.current.has(pageNumber) && !thumbnails.has(pageNumber) && pagesData) { console.log("[PdfPages] Requesting thumbnail for page:", pageNumber); requestedThumbnails.current.add(pageNumber); pagesData.requestThumbnail(pageNumber); } }, [pagesData, thumbnails]); if (!pagesData || pagesData.totalPages === 0) { return
No pages available
; } const pages = Array.from({ length: pagesData.totalPages }, (_, i) => i + 1); return (
{pages.map(pageNumber => ( pagesData.scrollToPage(pageNumber)} /> ))}
); } function PdfPageItem({ pageNumber, isActive, thumbnail, onRequestThumbnail, onPageClick }: { pageNumber: number; isActive: boolean; thumbnail?: string; }) { const hasRequested = useRef(false); useEffect(() => { if (!thumbnail && !hasRequested.current) { hasRequested.current = true; onRequestThumbnail(pageNumber); } }, [pageNumber, thumbnail, onRequestThumbnail]); return (
{pageNumber}
{thumbnail ? ( {`Page ) : (
Loading...
)}
); }