index.tsx 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import React, {
  2. useEffect, useRef,
  3. } from 'react';
  4. import { renderPdfPage } from '../../helpers/pdf';
  5. import { TypeRenderingStates, ViewportType } from '../../constants/type';
  6. import {
  7. PageWrapper, PdfCanvas, AnnotationLayer, TextLayer, DrawingLayer, LoadingLayer,
  8. } from './styled';
  9. type Props = {
  10. pageNum: number;
  11. renderingState?: TypeRenderingStates;
  12. getPage?: () => void;
  13. viewport: ViewportType;
  14. rotation?: number;
  15. annotations?: React.ReactElement[];
  16. };
  17. const PageView: React.FunctionComponent<Props> = ({
  18. pageNum,
  19. getPage,
  20. viewport,
  21. renderingState = 'PAUSED',
  22. rotation,
  23. annotations = [],
  24. }: Props) => {
  25. const rootEle = useRef<HTMLDivElement | null>(null);
  26. let pdfPage: any = null;
  27. const renderPage = async (): Promise<any> => {
  28. if (getPage) {
  29. pdfPage = await getPage();
  30. if (rootEle.current) {
  31. await renderPdfPage({
  32. rootEle: rootEle.current,
  33. pdfPage,
  34. viewport,
  35. });
  36. }
  37. }
  38. };
  39. useEffect(() => {
  40. if (renderingState === 'RENDERING') {
  41. renderPage();
  42. } else if (pdfPage && renderingState === 'LOADING') {
  43. pdfPage.cleanup();
  44. }
  45. }, [renderingState, viewport]);
  46. useEffect(() => (): void => {
  47. if (pdfPage) pdfPage.cleanup();
  48. }, []);
  49. return (
  50. <PageWrapper
  51. ref={rootEle}
  52. id={`page_${pageNum}`}
  53. data-page-num={pageNum}
  54. width={viewport.width}
  55. height={viewport.height}
  56. rotation={rotation}
  57. >
  58. {
  59. renderingState === 'LOADING' ? (
  60. <>
  61. <LoadingLayer />
  62. <TextLayer data-id="text-layer" />
  63. </>
  64. ) : (
  65. <>
  66. <PdfCanvas />
  67. <DrawingLayer data-id="drawing-layer" />
  68. <TextLayer data-id="text-layer" />
  69. <AnnotationLayer data-id="annotation-layer">
  70. {annotations}
  71. </AnnotationLayer>
  72. </>
  73. )
  74. }
  75. </PageWrapper>
  76. );
  77. };
  78. export default PageView;