index.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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, 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 page: any = null;
  27. const renderPage = async (): Promise<any> => {
  28. if (getPage) {
  29. page = await getPage();
  30. if (rootEle.current) {
  31. await renderPdfPage({
  32. rootEle: rootEle.current,
  33. page,
  34. viewport,
  35. });
  36. }
  37. }
  38. };
  39. useEffect(() => {
  40. if (renderingState === 'RENDERING') {
  41. renderPage();
  42. } else if (page && renderingState === 'LOADING') {
  43. page.cleanup();
  44. }
  45. }, [renderingState, viewport]);
  46. useEffect(() => (): void => {
  47. if (page) page.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. <LoadingLayer />
  61. ) : (
  62. <>
  63. <div>
  64. <PdfCanvas />
  65. </div>
  66. <TextLayer data-id="text-layer" />
  67. <AnnotationLayer data-id="annotation-layer">
  68. {annotations}
  69. </AnnotationLayer>
  70. </>
  71. )
  72. }
  73. </PageWrapper>
  74. );
  75. };
  76. export default PageView;