From 6e8468a36612710d218b46eedda4589c9af3bc3a Mon Sep 17 00:00:00 2001 From: Zack Scholl Date: Thu, 27 Nov 2025 13:43:12 -0800 Subject: [PATCH] feat: improve content --- web/src/SharedFile.jsx | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/web/src/SharedFile.jsx b/web/src/SharedFile.jsx index 355f1ef..140352d 100644 --- a/web/src/SharedFile.jsx +++ b/web/src/SharedFile.jsx @@ -79,6 +79,11 @@ const getFileType = (filename) => { return { category: 'video', mimeType: `video/${ext}` }; } + // PDF files + if (ext === 'pdf') { + return { category: 'pdf', mimeType: 'application/pdf' }; + } + // Code/text files with language mapping const languageMap = { 'js': 'javascript', @@ -330,6 +335,16 @@ export default function SharedFile() { mimeType: fileType.mimeType, filename: decryptedFilename }); + } else if (fileType.category === 'pdf') { + // Create object URL for PDF with explicit MIME type + const pdfBlob = new Blob([decryptedBlob], { type: 'application/pdf' }); + const url = URL.createObjectURL(pdfBlob); + setPreview({ + type: 'pdf', + url: url, + mimeType: fileType.mimeType, + filename: decryptedFilename + }); } else { toast.error("Preview not available for this file type", { id: "preview" }); return; @@ -348,7 +363,7 @@ export default function SharedFile() { useEffect(() => { if (decryptedFilename && !preview && !previewing) { const fileType = getFileType(decryptedFilename); - if (['code', 'image', 'audio', 'video'].includes(fileType.category)) { + if (['code', 'image', 'audio', 'video', 'pdf'].includes(fileType.category)) { handlePreview(); } } @@ -494,6 +509,23 @@ export default function SharedFile() { )} + + {preview.type === 'pdf' && ( +
+ +
+ )} )}