Files
2023-04-24 23:29:00 +10:00

56 lines
1.7 KiB
JavaScript

import React, { useState, useEffect, useRef } from "react";
import { MenuBar } from "./menubar";
import "./pdfviewer.scss";
import { Bundle, Loader } from "../../components/";
const PDFJSViewer = (props) => (
<Bundle loader={import(/* webpackChunkName: "pdfjs" */"./pdfviewer_lazy")} symbol="PDFJSViewer">
{(Comp) => <Comp {...props}/>}
</Bundle>
);
export function PDFViewer({ filename, data }) {
const [isLoading, setIsLoading] = useState()
return (
<div className="component_pdfviewer">
<MenuBar title={filename} download={data} />
<div className="pdfviewer_container">
{
"application/pdf" in navigator.mimeTypes ? (
<PDFEmbedViewer src={data} />
) : (
<PDFJSViewer src={data} />
)
}
</div>
</div>
);
};
function PDFEmbedViewer({ src }) {
const $embed = useRef();
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
if (!$embed.current) return;
const onloadHandler = () => {
setIsLoading(false);
};
$embed.current.addEventListener("load", onloadHandler);
return () => {
$embed.current.removeEventListener("load", onloadHandler);
}
}, [$embed, src]);
return (
<React.Fragment>
{ isLoading && ( <Loader /> ) }
<embed
ref={$embed}
src={`${src}#toolbar=0`}
type="application/pdf"
style={{ height: "100%", width: "100%", "opacity": (isLoading ? "0": "1") }}
/>
</React.Fragment>
);
}