Rescue Paperjet v1 implementation
This commit is contained in:
parent
7ff5c8130d
commit
db9e2ca51b
83 changed files with 6186 additions and 3894 deletions
|
|
@ -4,50 +4,61 @@ import { PageStack } from './PageStack';
|
|||
|
||||
pdfjsLib.GlobalWorkerOptions.workerSrc = new URL(
|
||||
'pdfjs-dist/build/pdf.worker.mjs',
|
||||
import.meta.url
|
||||
import.meta.url,
|
||||
).toString();
|
||||
|
||||
interface LoadedDocument {
|
||||
id: string;
|
||||
document: pdfjsLib.PDFDocumentProxy;
|
||||
}
|
||||
|
||||
interface DocumentError {
|
||||
id: string;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export function PdfDocument({ documentId }: { documentId: string }) {
|
||||
const [pdfDoc, setPdfDoc] = useState<pdfjsLib.PDFDocumentProxy | null>(null);
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
|
||||
const [loaded, setLoaded] = useState<LoadedDocument | null>(null);
|
||||
const [error, setError] = useState<DocumentError | null>(null);
|
||||
|
||||
useEffect(() => {
|
||||
let active = true;
|
||||
const url = `/api/v1/documents/${documentId}/file`;
|
||||
|
||||
const loadingTask = pdfjsLib.getDocument({ url });
|
||||
|
||||
loadingTask.promise.then((doc) => {
|
||||
if (active) setPdfDoc(doc);
|
||||
}).catch(err => {
|
||||
console.error('Failed to load PDF', err);
|
||||
if (active) setError(err.message);
|
||||
const loadingTask = pdfjsLib.getDocument({ url: `/api/v1/documents/${documentId}/file` });
|
||||
|
||||
loadingTask.promise.then((document) => {
|
||||
if (active) setLoaded({ id: documentId, document });
|
||||
}).catch((reason: unknown) => {
|
||||
if (active) {
|
||||
const message = reason instanceof Error ? reason.message : 'Unable to load this PDF.';
|
||||
setError({ id: documentId, message });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
return () => {
|
||||
active = false;
|
||||
loadingTask.destroy();
|
||||
void loadingTask.destroy();
|
||||
};
|
||||
}, [documentId]);
|
||||
|
||||
if (error) {
|
||||
|
||||
const currentError = error?.id === documentId ? error.message : null;
|
||||
const currentDocument = loaded?.id === documentId ? loaded.document : null;
|
||||
|
||||
if (currentError) {
|
||||
return (
|
||||
<div className="flex items-center justify-center h-full w-full">
|
||||
<div className="text-red-500 bg-red-50 px-4 py-3 rounded-lg border border-red-200">
|
||||
Error loading PDF: {error}
|
||||
</div>
|
||||
<div className="flex h-full w-full items-center justify-center">
|
||||
<div className="rounded-lg border border-red-200 bg-red-50 px-4 py-3 text-red-600">Error loading PDF: {currentError}</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (!pdfDoc) {
|
||||
|
||||
if (!currentDocument) {
|
||||
return (
|
||||
<div className="flex flex-col items-center justify-center h-full w-full gap-4">
|
||||
<div className="animate-spin rounded-full h-8 w-8 border-b-2 border-accent-500"></div>
|
||||
<div className="text-neutral-500 font-medium animate-pulse">Loading document...</div>
|
||||
<div className="flex h-full w-full flex-col items-center justify-center gap-4">
|
||||
<div className="h-8 w-8 animate-spin rounded-full border-b-2 border-accent-500" />
|
||||
<div className="font-medium animate-pulse text-neutral-500">Loading document…</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return <PageStack pdfDoc={pdfDoc} />;
|
||||
|
||||
return <PageStack pdfDoc={currentDocument} />;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue