2023-12-28 14:04:44 +03:00
|
|
|
|
'use client';
|
|
|
|
|
|
|
|
|
|
import type { PDFDocumentProxy } from 'pdfjs-dist';
|
|
|
|
|
import { useMemo, useState } from 'react';
|
|
|
|
|
import { Document, Page } from 'react-pdf';
|
|
|
|
|
|
|
|
|
|
import useWindowSize from '@/hooks/useWindowSize';
|
2024-01-06 03:15:02 +03:00
|
|
|
|
import { graphLightT } from '@/styling/color';
|
2023-12-28 14:04:44 +03:00
|
|
|
|
|
2024-03-20 15:27:32 +03:00
|
|
|
|
import Overlay from '../Overlay';
|
2023-12-28 14:04:44 +03:00
|
|
|
|
import PageControls from './PageControls';
|
|
|
|
|
|
|
|
|
|
const MAXIMUM_WIDTH = 1000;
|
2024-02-22 15:07:05 +03:00
|
|
|
|
const MINIMUM_WIDTH = 320;
|
2023-12-28 14:04:44 +03:00
|
|
|
|
|
|
|
|
|
interface PDFViewerProps {
|
|
|
|
|
file?: string | ArrayBuffer | Blob;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function PDFViewer({ file }: PDFViewerProps) {
|
|
|
|
|
const windowSize = useWindowSize();
|
|
|
|
|
|
|
|
|
|
const [pageCount, setPageCount] = useState(0);
|
|
|
|
|
const [pageNumber, setPageNumber] = useState(1);
|
|
|
|
|
|
|
|
|
|
const pageWidth = useMemo(() => {
|
2024-02-22 15:07:05 +03:00
|
|
|
|
return Math.max(MINIMUM_WIDTH, Math.min((windowSize?.width ?? 0) - 10, MAXIMUM_WIDTH));
|
2023-12-28 14:04:44 +03:00
|
|
|
|
}, [windowSize]);
|
|
|
|
|
|
|
|
|
|
function onDocumentLoadSuccess({ numPages }: PDFDocumentProxy) {
|
|
|
|
|
setPageCount(numPages);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
<Document
|
|
|
|
|
file={file}
|
|
|
|
|
onLoadSuccess={onDocumentLoadSuccess}
|
|
|
|
|
loading='Загрузка PDF файла...'
|
|
|
|
|
error='Не удалось загрузить файл.'
|
|
|
|
|
>
|
2024-02-22 15:07:05 +03:00
|
|
|
|
<Overlay position='top-3 left-1/2 -translate-x-1/2' className='flex select-none'>
|
2023-12-28 14:04:44 +03:00
|
|
|
|
<PageControls pageCount={pageCount} pageNumber={pageNumber} setPageNumber={setPageNumber} />
|
|
|
|
|
</Overlay>
|
|
|
|
|
<Page
|
2024-02-22 15:07:05 +03:00
|
|
|
|
className='pointer-events-none select-none sm:translate-x-0'
|
2023-12-28 14:04:44 +03:00
|
|
|
|
renderTextLayer={false}
|
|
|
|
|
renderAnnotationLayer={false}
|
|
|
|
|
pageNumber={pageNumber}
|
|
|
|
|
width={pageWidth}
|
|
|
|
|
canvasBackground={graphLightT.canvas.background}
|
|
|
|
|
/>
|
|
|
|
|
<Overlay position='bottom-6 left-1/2 -translate-x-1/2' className='flex select-none'>
|
|
|
|
|
<PageControls pageCount={pageCount} pageNumber={pageNumber} setPageNumber={setPageNumber} />
|
|
|
|
|
</Overlay>
|
|
|
|
|
</Document>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default PDFViewer;
|