index.tsx 1.6 KB

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