index.tsx 2.2 KB

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