UNPKG

enoviq-react-document-viewer

Version:

Custom React & Next.js compatible document viewer package

1 lines 22.1 kB
{"version":3,"file":"index.cjs","sources":["../src/context/DocumentViewerContext.jsx","../src/components/ViewDocument.jsx","../src/service/ServiceDocumentViewerProvider.jsx"],"sourcesContent":["import { createContext } from \"react\";\r\nconst DocumentViewerContext = createContext(null);\r\nexport default DocumentViewerContext;\r\n","\"use client\";\r\nimport { useContext, lazy, useState, useEffect, Suspense } from \"react\";\r\nconst PDFViewer = lazy(() => import(\"./PDFViewer\"));\r\n\r\nconst xlsIcon = new URL(\"../icons/xls_doc_icon.png\", import.meta.url).href;\r\nconst wordIcon = new URL(\"../icons/image_doc_icon.png\", import.meta.url).href;\r\nconst textIcon = new URL(\"../icons/text_doc_icon.png\", import.meta.url).href;\r\nconst imageIcon = new URL(\"../icons/image_doc_icon.png\", import.meta.url).href;\r\nconst videoIcon = new URL(\"../icons/video_doc_icon.png\", import.meta.url).href;\r\nconst pdfIcon = new URL(\"../icons/pdf_doc_icon.png\", import.meta.url).href;\r\n/**\r\n * Guesses the MIME type of a file given its URL.\r\n */\r\nexport const guessFileTypeFromUrl = (url) => {\r\n const extension = url.split(\".\").pop().toLowerCase();\r\n const typeMap = {\r\n pdf: \"application/pdf\",\r\n jpg: \"image/jpeg\",\r\n jpeg: \"image/jpeg\",\r\n png: \"image/png\",\r\n gif: \"image/gif\",\r\n webp: \"image/webp\",\r\n svg: \"image/svg+xml\",\r\n mp4: \"video/mp4\",\r\n webm: \"video/webm\",\r\n ogv: \"video/ogg\",\r\n mp3: \"audio/mpeg\",\r\n wav: \"audio/wav\",\r\n ogg: \"audio/ogg\",\r\n txt: \"text/plain\",\r\n json: \"application/json\",\r\n xml: \"application/xml\",\r\n html: \"text/html\",\r\n css: \"text/css\",\r\n js: \"application/javascript\",\r\n doc: \"application/msword\",\r\n docx: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\",\r\n xls: \"application/vnd.ms-excel\",\r\n xlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\r\n ppt: \"application/vnd.ms-powerpoint\",\r\n pptx: \"application/vnd.openxmlformats-officedocument.presentationml.presentation\",\r\n };\r\n return typeMap[extension] || \"application/octet-stream\";\r\n};\r\nexport const HelloWorld = () => (<h2>Hello World</h2>)\r\n/**\r\n * Renders a preview of a file in the document viewer.\r\n * Supports images, pdfs, videos, and word/excel documents.\r\n * If the file type is not supported, it falls back to a generic\r\n * file preview icon.\r\n *\r\n * @param {Object} props\r\n * @param {string | Blob} props.file - file to preview\r\n * @param {string} props.fileName - name of the file\r\n * @returns {ReactElement} - a ReactElement representing the preview\r\n */\r\nexport const RenderFilePreview = ({ file }) => {\r\n const { setDocumentViewerOpen } = useContext(DocumentViewerContext);\r\n if (!file) return <span className=\"EnoviqPackage-noFile\">No File</span>; // ✅ updated\r\n\r\n const src = typeof file === \"string\" ? file : URL.createObjectURL(file);\r\n\r\n const fileType =\r\n typeof file === \"string\"\r\n ? file.split(\".\").pop()?.toLowerCase()\r\n : file.type;\r\n\r\n const fileName =\r\n typeof file === \"string\" ? file.split(\"/\").pop() : file.name;\r\n\r\n const Wrapper = ({ children }) => (\r\n <div\r\n onClick={() => {\r\n console.log(\"clicked\");\r\n setDocumentViewerOpen(\r\n <DocumentViewer file={file} onClose={() => setDocumentViewerOpen(\"\")} />\r\n );\r\n }}\r\n style={{\r\n display: \"flex\",\r\n width: \"200px\",\r\n height: \"200px\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n cursor: \"pointer\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n\r\n if (\r\n fileType.includes(\"image\") ||\r\n [\"jpg\", \"jpeg\", \"png\", \"gif\", \"webp\"].includes(fileType)\r\n ) {\r\n return (\r\n <Wrapper>\r\n <img\r\n src={imageIcon}\r\n alt=\"Image preview\"\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n />\r\n </Wrapper>\r\n );\r\n }\r\n\r\n if (fileType.includes(\"pdf\") || fileType === \"pdf\") {\r\n return (\r\n <Wrapper>\r\n <img\r\n src={pdfIcon.src}\r\n alt=\"PDF preview\"\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n />\r\n </Wrapper>\r\n );\r\n }\r\n\r\n if (fileType.includes(\"video\") || [\"mp4\", \"webm\", \"ogg\"].includes(fileType)) {\r\n return (\r\n <Wrapper>\r\n <img\r\n src={videoIcon.src}\r\n alt=\"Video preview\"\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n />\r\n </Wrapper>\r\n );\r\n }\r\n\r\n if (fileType.includes(\"doc\") || fileType.includes(\"docx\")) {\r\n return (\r\n <Wrapper>\r\n <img\r\n src={wordIcon.src}\r\n alt=\"Word preview\"\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n />\r\n </Wrapper>\r\n );\r\n }\r\n\r\n if (fileType.includes(\"xls\") || fileType.includes(\"xlsx\")) {\r\n return (\r\n <Wrapper>\r\n <img\r\n src={xlsIcon.src}\r\n alt=\"Excel preview\"\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n />\r\n </Wrapper>\r\n );\r\n }\r\n\r\n return (\r\n <Wrapper>\r\n <img\r\n src={textIcon.src}\r\n alt=\"File preview\"\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n />\r\n </Wrapper>\r\n );\r\n};\r\n\r\nexport const renderMultipleImages = (files) => {\r\n if (!files || files.length === 0) {\r\n return <span className=\"EnoviqPackage-noImage\">No Images</span>; // ✅ updated\r\n }\r\n return files.map((file, idx) => (\r\n <div className=\"EnoviqPackage-imageBox\" key={idx}> {/* ✅ updated */}\r\n <RenderFilePreview file={file} />\r\n </div>\r\n ));\r\n};\r\n\r\nexport const DocumentViewer = ({\r\n file,\r\n fileType,\r\n fileName = \"Document\",\r\n onClose\r\n}) => {\r\n const [src, setSrc] = useState(null);\r\n const [detectedFileType, setDetectedFileType] = useState(null);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState(null);\r\n const [textContent, setTextContent] = useState(\"\");\r\n\r\n // ================= File Processing =================\r\n useEffect(() => {\r\n if (!file) {\r\n setSrc(null);\r\n setDetectedFileType(null);\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n const processFile = async () => {\r\n try {\r\n let objectUrl = null;\r\n let type = fileType;\r\n\r\n if (typeof file === \"string\") {\r\n if (file.startsWith(\"data:\")) {\r\n objectUrl = file;\r\n if (!type) {\r\n const mimeMatch = file.match(/data:([^;]+)/);\r\n type = mimeMatch ? mimeMatch[1] : \"application/octet-stream\";\r\n }\r\n } else if (file.startsWith(\"http\") || file.startsWith(\"/\")) {\r\n objectUrl = file;\r\n if (!type) type = guessFileTypeFromUrl(file);\r\n } else {\r\n if (!type) {\r\n throw new Error(\r\n \"fileType is required for base64 strings without data URL prefix\"\r\n );\r\n }\r\n objectUrl = `data:${type};base64,${file}`;\r\n }\r\n } else if (file instanceof File || file instanceof Blob) {\r\n objectUrl = URL.createObjectURL(file);\r\n type = type || file.type;\r\n } else {\r\n throw new Error(\"Unsupported file format\");\r\n }\r\n\r\n setSrc(objectUrl);\r\n setDetectedFileType(type);\r\n } catch (err) {\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n processFile();\r\n\r\n return () => {\r\n if (src && src.startsWith(\"blob:\")) {\r\n URL.revokeObjectURL(src);\r\n }\r\n };\r\n }, [file, fileType]);\r\n\r\n // ================= Helpers =================\r\n const getFileName = () => {\r\n if (typeof file === \"string\" && file.startsWith(\"http\")) {\r\n return file.split(\"/\").pop() || fileName;\r\n }\r\n if (file?.name) return file.name;\r\n return fileName;\r\n };\r\n\r\n const isImageType = (type) => type?.startsWith(\"image/\");\r\n const isVideoType = (type) => type?.startsWith(\"video/\");\r\n const isAudioType = (type) => type?.startsWith(\"audio/\");\r\n const isPdfType = (type) => type?.includes(\"pdf\");\r\n const isTextType = (type) =>\r\n type?.startsWith(\"text/\") ||\r\n [\"application/json\", \"application/xml\", \"application/javascript\"].includes(\r\n type\r\n );\r\n\r\n // ================= Content Renderers =================\r\n const renderPDF = () => (\r\n <Suspense fallback={<div>Loading PDF...</div>}>\r\n <PDFViewer file={file} />\r\n </Suspense>\r\n );\r\n\r\n const renderImage = () => (\r\n <>\r\n <img\r\n src={src}\r\n alt={getFileName()}\r\n className=\"EnoviqPackage-imagePreview\" // ✅ updated\r\n onError={() => setError(\"Failed to load image\")}\r\n />\r\n </>\r\n );\r\n\r\n const renderVideo = () => (\r\n <video\r\n src={src}\r\n controls\r\n className=\"EnoviqPackage-mediaPlayer\" // ✅ updated\r\n onError={() => setError(\"Failed to load video\")}\r\n >\r\n Your browser does not support the video tag.\r\n </video>\r\n );\r\n\r\n const renderAudio = () => (\r\n <audio\r\n src={src}\r\n controls\r\n className=\"EnoviqPackage-mediaPlayer\" // ✅ updated\r\n onError={() => setError(\"Failed to load audio\")}\r\n >\r\n Your browser does not support the audio tag.\r\n </audio>\r\n );\r\n\r\n useEffect(() => {\r\n if (\r\n src &&\r\n (detectedFileType?.startsWith(\"text/\") ||\r\n [\"application/json\", \"application/xml\", \"application/javascript\"].includes(detectedFileType))\r\n ) {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const text = reader.result; // CSV, TXT, etc.\r\n setTextContent(text);\r\n };\r\n\r\n reader.readAsText(file);\r\n } else if (src?.startsWith(\"data:\")) {\r\n try {\r\n const base64 = src.split(\",\")[1];\r\n const decoded = atob(base64);\r\n setTextContent(decoded);\r\n } catch (err) {\r\n setError(\"Failed to decode text content\");\r\n }\r\n }\r\n }, [src, detectedFileType]);\r\n\r\n const renderText = () => (\r\n <pre className=\"EnoviqPackage-textPreview\">\r\n {textContent || \"Loading text content...\"}\r\n </pre> // ✅ updated\r\n );\r\n\r\n const renderUnsupported = () => (\r\n <div className=\"EnoviqPackage-unsupported\"> {/* ✅ updated */}\r\n <div className=\"EnoviqPackage-unsupportedIcon\">📄</div>\r\n <h4>Cannot preview this file type</h4>\r\n <p>File type: {detectedFileType}</p>\r\n <p>File name: {getFileName()}</p>\r\n {src && (\r\n <a\r\n href={src}\r\n download={getFileName()}\r\n className=\"EnoviqPackage-downloadLink\" // ✅ updated\r\n >\r\n Download File\r\n </a>\r\n )}\r\n </div>\r\n );\r\n\r\n // ================= Main Content Renderer =================\r\n const renderContent = () => {\r\n if (loading) {\r\n return (\r\n <div className=\"EnoviqPackage-loading\"> {/* ✅ updated */}\r\n <div className=\"EnoviqPackage-spinner\"></div>\r\n <p>Loading file...</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (error) {\r\n return (\r\n <div className=\"EnoviqPackage-error\"> {/* ✅ updated */}\r\n <div className=\"EnoviqPackage-errorIcon\">⚠️</div>\r\n <h4>Error loading file</h4>\r\n <p>{error}</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (!src || !detectedFileType) {\r\n return (\r\n <div className=\"EnoviqPackage-noFile\"> {/* ✅ updated */}\r\n <p>No file to display</p>\r\n </div>\r\n );\r\n }\r\n\r\n if (isPdfType(detectedFileType)) return renderPDF();\r\n if (isImageType(detectedFileType)) return renderImage();\r\n if (isVideoType(detectedFileType)) return renderVideo();\r\n if (isAudioType(detectedFileType)) return renderAudio();\r\n if (isTextType(detectedFileType)) return renderText();\r\n\r\n return renderUnsupported();\r\n };\r\n\r\n\r\n // ================= Component Render =================\r\n return (\r\n <div className=\"EnoviqPackage-overlay\" onClick={onClose}>\r\n <div className=\"EnoviqPackage-modal\" onClick={(e) => e.stopPropagation()}>\r\n <div className=\"EnoviqPackage-modalHeader\">\r\n <div className=\"EnoviqPackage-fileInfo\">\r\n <h3>{getFileName()}</h3>\r\n {detectedFileType && (\r\n <span className=\"EnoviqPackage-fileType\">{detectedFileType}</span>\r\n )}\r\n </div>\r\n <button onClick={onClose} className=\"EnoviqPackage-closeBtn\">\r\n &times;\r\n </button>\r\n </div>\r\n <div className=\"EnoviqPackage-modalBody\">{renderContent()}</div>\r\n </div>\r\n </div>\r\n\r\n );\r\n};\r\n\r\nexport default DocumentViewer;\r\n","import { useState } from \"react\";\r\nimport DocumentViewerContext from \"../context/DocumentViewerContext\";\r\n\r\nconst DocumentViewerProvider = ({ children }) => {\r\n const [documentViewerOpen, setDocumentViewerOpen] = useState(\"\");\r\n\r\n return (\r\n <DocumentViewerContext.Provider\r\n value={{\r\n setDocumentViewerOpen,\r\n documentViewerOpen\r\n }}\r\n >\r\n {documentViewerOpen}\r\n {children}\r\n </DocumentViewerContext.Provider>\r\n );\r\n};\r\n\r\nexport default DocumentViewerProvider;"],"names":["DocumentViewerContext","createContext","PDFViewer","lazy","Promise","resolve","then","require","xlsIcon","URL","import","href","wordIcon","document","__filename","currentScript","tagName","toUpperCase","src","baseURI","textIcon","imageIcon","videoIcon","pdfIcon","DocumentViewer","_ref3","file","fileType","_ref3$fileName","fileName","onClose","_useState","useState","setSrc","_useState2","detectedFileType","setDetectedFileType","_useState3","loading","setLoading","_useState4","error","setError","_useState5","textContent","setTextContent","useEffect","objectUrl","type","startsWith","mimeMatch","match","pdf","jpg","jpeg","png","gif","webp","svg","mp4","webm","ogv","mp3","wav","ogg","txt","json","xml","html","css","js","doc","docx","xls","xlsx","ppt","pptx","split","pop","toLowerCase","Error","File","Blob","createObjectURL","err","message","e","reject","processFile","revokeObjectURL","getFileName","name","includes","reader","FileReader","onload","result","readAsText","base64","decoded","atob","h","className","onClick","stopPropagation","Suspense","fallback","isImageType","Fragment","alt","onError","isVideoType","controls","isAudioType","isTextType","download","_ref","children","documentViewerOpen","Provider","value","setDocumentViewerOpen","_file$split$pop","useContext","Wrapper","_ref2","console","log","style","display","width","height","justifyContent","alignItems","cursor"],"mappings":"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"}