|
@@ -0,0 +1,85 @@
|
|
|
+import React, { useEffect, useState, useRef, useCallback } from 'react';
|
|
|
+
|
|
|
+import Viewer from '../components/Viewer';
|
|
|
+import { fetchPdf } from '../helpers/pdf';
|
|
|
+import { watchScroll } from '../helpers/utility';
|
|
|
+import { ProgressType, ScrollStateType } from '../constants/type';
|
|
|
+
|
|
|
+import useActions from '../actions';
|
|
|
+import useStore from '../store';
|
|
|
+
|
|
|
+const PdfViewer: React.FunctionComponent = () => {
|
|
|
+ const containerRef = useRef<HTMLDivElement>(null);
|
|
|
+ const pageRef = useRef(1);
|
|
|
+ const viewportRef = useRef({height: 0, width: 0});
|
|
|
+ const [initialized, setInitialize] = useState(false);
|
|
|
+ const [{totalPage, currentPage, viewport, pdf, scale, rotation}, dispatch] = useStore();
|
|
|
+ const { setTotalPage, setCurrentPage, setPdf, setProgress, setViewport } = useActions(dispatch);
|
|
|
+
|
|
|
+ const pdfGenerator = async () => {
|
|
|
+ const pdf = await fetchPdf('../static/Quick Start Guide.pdf', getProgress);
|
|
|
+
|
|
|
+ const totalNum = pdf.numPages;
|
|
|
+ setTotalPage(totalNum);
|
|
|
+ setPdf(pdf);
|
|
|
+
|
|
|
+ await getViewport(pdf, 1);
|
|
|
+ setInitialize(true);
|
|
|
+ }
|
|
|
+
|
|
|
+ const getViewport = async (pdfEle: any, scale: number) => {
|
|
|
+ const page = await pdfEle.getPage(1);
|
|
|
+ const viewport = page.getViewport({ scale });
|
|
|
+ viewport.width = Math.round(viewport.width);
|
|
|
+ viewport.height = Math.round(viewport.height);
|
|
|
+ setViewport(viewport);
|
|
|
+ }
|
|
|
+
|
|
|
+ const getProgress = useCallback((progress: ProgressType) => {
|
|
|
+ setProgress(progress);
|
|
|
+ }, [dispatch]);
|
|
|
+
|
|
|
+ const scrollUpdate = useCallback((state: ScrollStateType) => {
|
|
|
+ const viewport = viewportRef.current;
|
|
|
+ const page = Math.round((state.lastY + viewport.height / 1.4) / (viewport.height + 50));
|
|
|
+ if (page !== pageRef.current) {
|
|
|
+ setCurrentPage(page);
|
|
|
+ }
|
|
|
+ }, [dispatch]);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ pdfGenerator();
|
|
|
+ }, []);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (containerRef.current) {
|
|
|
+ watchScroll(containerRef.current, scrollUpdate);
|
|
|
+ }
|
|
|
+ }, [initialized]);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ pageRef.current = currentPage;
|
|
|
+ viewportRef.current = viewport;
|
|
|
+ }, [currentPage, viewport]);
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (pdf) {
|
|
|
+ getViewport(pdf, scale);
|
|
|
+ }
|
|
|
+ }, [scale]);
|
|
|
+
|
|
|
+ return (
|
|
|
+ initialized ? (
|
|
|
+ <Viewer
|
|
|
+ ref={containerRef}
|
|
|
+ totalPage={totalPage}
|
|
|
+ currentPage={currentPage}
|
|
|
+ viewport={viewport}
|
|
|
+ pdf={pdf}
|
|
|
+ rotation={rotation}
|
|
|
+ />
|
|
|
+ ) : null
|
|
|
+ );
|
|
|
+};
|
|
|
+
|
|
|
+export default PdfViewer;
|