From 0a61c6eeb3232b96da48afe0338b88d7ab7c0f07 Mon Sep 17 00:00:00 2001 From: Karan Janthe Date: Sat, 4 Nov 2023 15:07:56 +0530 Subject: [PATCH] added currentPageCallBack for the process of the current page --- packages/layout/src/steps/resolvePagination.js | 16 +++++++++++----- packages/renderer/index.d.ts | 2 ++ packages/renderer/src/dom/PDFViewer.js | 3 ++- packages/renderer/src/dom/usePDF.js | 4 ++-- packages/renderer/src/index.js | 4 ++-- 5 files changed, 19 insertions(+), 10 deletions(-) diff --git a/packages/layout/src/steps/resolvePagination.js b/packages/layout/src/steps/resolvePagination.js index c4a84903e..905a742f3 100644 --- a/packages/layout/src/steps/resolvePagination.js +++ b/packages/layout/src/steps/resolvePagination.js @@ -242,7 +242,7 @@ const dissocSubPageData = page => { return omit(['subPageNumber', 'subPageTotalPages'], page); }; -const paginate = (page, pageNumber, fontStore) => { +const paginate = (page, pageNumber, fontStore, currentPageCallBack) => { if (!page) return []; if (page.props?.wrap === false) return [page]; @@ -251,12 +251,17 @@ const paginate = (page, pageNumber, fontStore) => { const pages = [splittedPage[0]]; let nextPage = splittedPage[1]; - + let pageCount = 1; while (nextPage !== null) { splittedPage = splitPage(nextPage, pageNumber + pages.length, fontStore); - + pageCount++; + pages.push(splittedPage[0]); nextPage = splittedPage[1]; + // Call the progressCallback to update progress + if (currentPageCallBack) { + currentPageCallBack(pageCount); + } } return pages; @@ -268,15 +273,16 @@ const paginate = (page, pageNumber, fontStore) => { * * @param {Object} node * @param {Object} fontStore font store + * @param {Function} currentPageCallBack Callback to track progress * @returns {Object} layout node */ -const resolvePagination = (doc, fontStore) => { +const resolvePagination = (doc, fontStore, currentPageCallBack) => { let pages = []; let pageNumber = 1; for (let i = 0; i < doc.children.length; i += 1) { const page = doc.children[i]; - let subpages = paginate(page, pageNumber, fontStore); + let subpages = paginate(page, pageNumber, fontStore, currentPageCallBack); subpages = assocSubPageData(subpages); pageNumber += subpages.length; diff --git a/packages/renderer/index.d.ts b/packages/renderer/index.d.ts index 4dd88210b..377428dde 100644 --- a/packages/renderer/index.d.ts +++ b/packages/renderer/index.d.ts @@ -449,6 +449,7 @@ declare namespace ReactPDF { style?: Style | Style[]; className?: string; children?: React.ReactElement; + currentPageCallBack? : ( value:Number ) => void; innerRef?: React.Ref; showToolbar?: boolean; } @@ -489,6 +490,7 @@ declare namespace ReactPDF { * @platform web */ function usePDF(options: { + currentPageCallBack? : ( value:Number ) => void; document?: React.ReactElement; }): [UsePDFInstance, (newDocument: React.ReactElement) => void]; diff --git a/packages/renderer/src/dom/PDFViewer.js b/packages/renderer/src/dom/PDFViewer.js index 20b698d4c..6fe1c751d 100644 --- a/packages/renderer/src/dom/PDFViewer.js +++ b/packages/renderer/src/dom/PDFViewer.js @@ -10,11 +10,12 @@ export const PDFViewer = ({ style, className, children, + currentPageCallBack, innerRef, showToolbar = true, ...props }) => { - const [instance, updateInstance] = usePDF(); + const [instance, updateInstance] = usePDF({undefined,currentPageCallBack}); useEffect(() => updateInstance(children), [children]); diff --git a/packages/renderer/src/dom/usePDF.js b/packages/renderer/src/dom/usePDF.js index e78854562..0d467ff82 100644 --- a/packages/renderer/src/dom/usePDF.js +++ b/packages/renderer/src/dom/usePDF.js @@ -5,7 +5,7 @@ import { useState, useRef, useEffect, useCallback } from 'react'; import { pdf } from '../index'; -export const usePDF = ({ document } = {}) => { +export const usePDF = ({ document, currentPageCallBack } = {}) => { const pdfInstance = useRef(null); const [state, setState] = useState({ @@ -41,7 +41,7 @@ export const usePDF = ({ document } = {}) => { }); }; - pdfInstance.current = pdf(); + pdfInstance.current = pdf(undefined,currentPageCallBack); pdfInstance.current.on('change', queueDocumentRender); if (document) { pdfInstance.current.updateContainer(document); diff --git a/packages/renderer/src/index.js b/packages/renderer/src/index.js index 955d41a08..be0ee41f7 100644 --- a/packages/renderer/src/index.js +++ b/packages/renderer/src/index.js @@ -15,7 +15,7 @@ let renderer; // We only want to trigger an update when PDF content changes const events = {}; -const pdf = initialValue => { +const pdf = (initialValue,currentPageCallBack) => { const onChange = () => { const listeners = events.change?.slice() || []; for (let i = 0; i < listeners.length; i += 1) listeners[i](); @@ -45,7 +45,7 @@ const pdf = initialValue => { pageMode, }); - const layout = await layoutDocument(container.document, fontStore); + const layout = await layoutDocument(container.document, fontStore, currentPageCallBack); const fileStream = renderPDF(ctx, layout); return { layout, fileStream }; };