diff --git a/app/api/pdf-proxy/route.ts b/app/api/pdf-proxy/route.ts new file mode 100644 index 0000000..0abc7b7 --- /dev/null +++ b/app/api/pdf-proxy/route.ts @@ -0,0 +1,29 @@ +import { NextResponse } from "next/server"; + +export async function GET(request: Request) { + const { searchParams } = new URL(request.url); + const url = searchParams.get("url"); + + if (!url) { + return NextResponse.json({ error: "No URL provided" }, { status: 400 }); + } + + try { + const response = await fetch(url); + if (!response.ok) { + return NextResponse.json({ error: "Failed to fetch PDF" }, { status: response.status }); + } + + const arrayBuffer = await response.arrayBuffer(); + + return new NextResponse(arrayBuffer, { + headers: { + "Content-Type": "application/pdf", + "Content-Disposition": "inline", + "Cache-Control": "public, max-age=3600", + }, + }); + } catch (error) { + return NextResponse.json({ error: "Failed to fetch PDF" }, { status: 500 }); + } +} diff --git a/components/mission-control/PDFViewerClient.tsx b/components/mission-control/PDFViewerClient.tsx index 7e3f40a..8006081 100644 --- a/components/mission-control/PDFViewerClient.tsx +++ b/components/mission-control/PDFViewerClient.tsx @@ -21,16 +21,13 @@ export default function PDFViewerClient() { const pdfDocRef = useRef(null); useEffect(() => { - // Load PDF.js from CDN const script = document.createElement("script"); script.src = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.min.js"; script.async = true; script.onload = () => { try { window.pdfjsLib = window.pdfjsLib; - // Disable worker to avoid CSP issues - window.pdfjsLib.GlobalWorkerOptions.workerSrc = ""; - window.pdfjsLib.GlobalWorkerOptions.workerPort = null; + window.pdfjsLib.GlobalWorkerOptions.workerSrc = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.11.174/pdf.worker.min.js"; setPdfjsLoaded(true); } catch (e) { setError("Failed to initialize PDF.js"); @@ -54,14 +51,10 @@ export default function PDFViewerClient() { canvas.height = viewport.height; canvas.width = viewport.width; - // Use synchronous rendering to avoid worker - const renderContext = { + await page.render({ canvasContext: context, viewport: viewport, - }; - - // For older pdf.js without worker, use direct render - await page.render(renderContext).promise; + }).promise; } catch (err) { console.error("Error rendering page:", err); } @@ -89,19 +82,13 @@ export default function PDFViewerClient() { try { const arrayBuffer = await file.arrayBuffer(); - // Disable worker for this load - const loadingTask = window.pdfjsLib.getDocument({ - data: arrayBuffer, - disableWorker: true, - verbosity: 0 - }); - const pdf = await loadingTask.promise; + const pdf = await window.pdfjsLib.getDocument({ data: arrayBuffer }).promise; pdfDocRef.current = pdf; setNumPages(pdf.numPages); setPdfData("local"); await renderPage(1); } catch (err) { - setError("Failed to load PDF. Try using 'Load from URL' instead."); + setError("Failed to load PDF. Try uploading to a public URL and use 'Load from URL'."); console.error(err); } setLoading(false); @@ -119,11 +106,20 @@ export default function PDFViewerClient() { new URL(input); setPdfName(input.split("/").pop() || "document.pdf"); - // Use Google Docs viewer for external URLs - setPdfData(`https://docs.google.com/gview?url=${encodeURIComponent(input)}&embedded=true`); - setNumPages(1); // We don't know the page count for external URLs + // Use our proxy to fetch the PDF + const proxyUrl = `https://sitemente.com/api/pdf-proxy?url=${encodeURIComponent(input)}`; + + const response = await fetch(proxyUrl); + if (!response.ok) throw new Error("Failed to fetch through proxy"); + + const arrayBuffer = await response.arrayBuffer(); + const pdf = await window.pdfjsLib.getDocument({ data: arrayBuffer }).promise; + pdfDocRef.current = pdf; + setNumPages(pdf.numPages); + setPdfData("proxied"); + await renderPage(1); } catch (err) { - setError("Failed to load PDF from URL."); + setError("Failed to load PDF. Try another URL or upload file directly."); console.error(err); } setLoading(false); @@ -208,7 +204,7 @@ export default function PDFViewerClient() {
📄

No PDF Loaded

Upload a PDF or enter a URL

-

💡 Tip: For best results, use "Load from URL" with a public PDF link

+

💡 Tip: Upload PDF file directly or paste a public URL

)} @@ -224,21 +220,11 @@ export default function PDFViewerClient() { {pdfData && !loading && (
- {pdfData.startsWith("https://docs.google.com") ? ( - // Google Docs viewer for external URLs -