PdfPages.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React, { useEffect, useState, useRef } from 'react';
  2. import _ from 'lodash';
  3. import Viewer from '../components/Viewer';
  4. import PdfPage from './PdfPage';
  5. import { watchScroll } from '../helpers/utility';
  6. import useStore from '../store';
  7. type Props = {
  8. scrollToUpdate: (state: ScrollStateType) => void;
  9. };
  10. const PdfPages: React.FC<Props> = ({ scrollToUpdate }: Props) => {
  11. const [elements, setElement] = useState<React.ReactNode[]>([]);
  12. const containerRef = useRef<HTMLDivElement>(null);
  13. const [
  14. { totalPage, currentPage, viewport, rotation, displayMode, annotations },
  15. ] = useStore();
  16. const createPages = (): void => {
  17. const pagesContent: React.ReactNode[] = [];
  18. for (let i = 1; i <= totalPage; i += 1) {
  19. const key = `page-${i}`;
  20. const component = (
  21. <PdfPage
  22. key={key}
  23. index={i}
  24. renderingState={_.range(1, 3).includes(i) ? 'RENDERING' : 'LOADING'}
  25. />
  26. );
  27. pagesContent.push(component);
  28. }
  29. setElement(pagesContent);
  30. };
  31. const updatePages = (): void => {
  32. const renderingIndexQueue = _.range(currentPage - 1, currentPage + 2);
  33. let index = currentPage - 3;
  34. const end = currentPage + 3;
  35. while (currentPage) {
  36. if (elements[index]) {
  37. const pageNum = index + 1;
  38. const key = `page-${pageNum}`;
  39. elements[index] = (
  40. <PdfPage
  41. key={key}
  42. index={pageNum}
  43. renderingState={
  44. renderingIndexQueue.includes(pageNum) ? 'RENDERING' : 'LOADING'
  45. }
  46. />
  47. );
  48. }
  49. index += 1;
  50. if (index >= end) break;
  51. }
  52. if (elements.length) {
  53. setElement([...elements]);
  54. }
  55. };
  56. useEffect(() => {
  57. createPages();
  58. watchScroll(containerRef.current, scrollToUpdate);
  59. }, []);
  60. useEffect(() => {
  61. updatePages();
  62. }, [currentPage, viewport, rotation, annotations]);
  63. return (
  64. <Viewer
  65. ref={containerRef}
  66. viewport={viewport}
  67. rotation={rotation}
  68. displayMode={displayMode}
  69. >
  70. {elements}
  71. </Viewer>
  72. );
  73. };
  74. export default PdfPages;