"use client"; import { useState, useRef, useEffect } from "react"; import * as pdfjsLib from "pdfjs-dist"; // Set worker source - use CDN pdfjsLib.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjsLib.version}/pdf.worker.min.js`; export default function PDFViewerClient() { const [pdfData, setPdfData] = useState(null); const [pdfName, setPdfName] = useState(""); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [numPages, setNumPages] = useState(0); const [currentPage, setCurrentPage] = useState(1); const [scale, setScale] = useState(1.5); const canvasRef = useRef(null); const pdfDocRef = useRef(null); const renderPage = async (pageNum: number) => { if (!pdfDocRef.current || !canvasRef.current) return; try { const page = await pdfDocRef.current.getPage(pageNum); const viewport = page.getViewport({ scale }); const canvas = canvasRef.current; const context = canvas.getContext("2d"); canvas.height = viewport.height; canvas.width = viewport.width; await page.render({ canvasContext: context, viewport: viewport, }).promise; } catch (err) { console.error("Error rendering page:", err); } }; useEffect(() => { if (pdfDocRef.current && currentPage) { renderPage(currentPage); } }, [currentPage, scale]); const handleFileUpload = async (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; if (file.type !== "application/pdf") { setError("Please select a PDF file"); return; } setLoading(true); setError(null); setPdfName(file.name); setCurrentPage(1); try { const arrayBuffer = await file.arrayBuffer(); const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise; pdfDocRef.current = pdf; setNumPages(pdf.numPages); setPdfData("local"); await renderPage(1); } catch (err) { setError("Failed to load PDF"); console.error(err); } setLoading(false); }; const handleUrlSubmit = async () => { const input = prompt("Enter PDF URL:"); if (!input) return; setLoading(true); setError(null); setCurrentPage(1); try { new URL(input); setPdfName(input.split("/").pop() || "document.pdf"); const response = await fetch(input); const arrayBuffer = await response.arrayBuffer(); const pdf = await pdfjsLib.getDocument({ data: arrayBuffer }).promise; pdfDocRef.current = pdf; setNumPages(pdf.numPages); setPdfData("url"); await renderPage(1); } catch (err) { setError("Failed to load PDF from URL. Make sure the URL is publicly accessible."); console.error(err); } setLoading(false); }; const goToPrevPage = () => { if (currentPage > 1) { setCurrentPage(currentPage - 1); } }; const goToNextPage = () => { if (currentPage < numPages) { setCurrentPage(currentPage + 1); } }; const zoomIn = () => setScale(scale + 0.25); const zoomOut = () => setScale(Math.max(0.5, scale - 0.25)); return (
{/* Toolbar */}
{pdfData && ( <>
{/* Page navigation */} Page {currentPage} of {numPages}
{/* Zoom controls */} {Math.round(scale * 100)}% )}
{/* Content */}
{error && (

Error

{error}

)} {!pdfData && !loading && (
📄

No PDF Loaded

Upload a PDF or enter a URL to view it

• Upload your resume to let Horus analyze it

• Supports PDF files up to 50MB

• Or load from any public PDF URL

)} {loading && (

Loading PDF...

)} {pdfData && !loading && (
)}
{/* Instructions */}

💡 Tip: Upload your resume PDF and Horus can analyze the design to recreate it

); }