(null);
useEffect(() => {
let pdf: PDFDocumentProxy | null = null;
let cancelled = false;
async function load() {
- const res = await fetch(`${Config.API_URL}/files/${fileId}`);
- const buffer = await res.arrayBuffer();
- pdf = await pdfjsLib.getDocument({ data: buffer }).promise;
+ // pdf.js забирает переданный буфер себе, поэтому отдаём копию (эффект может выполниться повторно)
+ pdf = await pdfjsLib.getDocument({ data: data.slice(0) }).promise;
if (cancelled) {
pdf.destroy();
return;
@@ -35,12 +37,16 @@ export default function PdfJsBlock({ fileId }: { fileId: string }) {
setPdfDoc(pdf);
setNumPages(pdf.numPages);
}
- load();
+ load().catch(() => {
+ if (!cancelled) {
+ setError('Не удалось открыть PDF');
+ }
+ });
return () => {
cancelled = true;
if (pdf) pdf.destroy();
};
- }, [fileId]);
+ }, [data]);
// fit scale = wrapper inner width / page width.
// wrapper width = container client width - container padding - page margins
@@ -108,6 +114,7 @@ export default function PdfJsBlock({ fileId }: { fileId: string }) {
const zoomOut = useCallback(() => setZoom((z) => Math.max(MIN_ZOOM, +(z - ZOOM_STEP).toFixed(2))), []);
const resetZoom = useCallback(() => setZoom(1), []);
+ if (error) return {error}
;
if (!pdfDoc) return Загрузка PDF...
;
return (
@@ -119,7 +126,7 @@ export default function PdfJsBlock({ fileId }: { fileId: string }) {
minWidth: 0,
}}>
- Source FILE — {numPages} pages
+ Исходный файл — страниц: {numPages}
-
@@ -182,7 +191,7 @@ export default function PdfJsBlock({ fileId }: { fileId: string }) {
background: '#f1f1f1',
borderBottom: '1px solid #ddd',
}}>
- Page {i + 1} of {numPages}
+ Страница {i + 1} из {numPages}