diff --git a/packages/layout/src/steps/resolvePagination.js b/packages/layout/src/steps/resolvePagination.js index 98d6f3135..4e3c28dd7 100644 --- a/packages/layout/src/steps/resolvePagination.js +++ b/packages/layout/src/steps/resolvePagination.js @@ -245,7 +245,7 @@ const dissocSubPageData = (page) => { return omit(['subPageNumber', 'subPageTotalPages'], page); }; -const paginate = (page, pageNumber, fontStore, yoga) => { +const paginate = (page, pageNumber, fontStore, yoga,currentPageCallBack) => { if (!page) return []; if (page.props?.wrap === false) return [page]; @@ -254,17 +254,17 @@ const paginate = (page, pageNumber, fontStore, yoga) => { const pages = [splittedPage[0]]; let nextPage = splittedPage[1]; - + let pageCount = 1; while (nextPage !== null) { - splittedPage = splitPage( - nextPage, - pageNumber + pages.length, - fontStore, - yoga, - ); - + splittedPage = splitPage(nextPage, pageNumber + pages.length, fontStore,yoga); + pageCount++; + pages.push(splittedPage[0]); nextPage = splittedPage[1]; + // Call the progressCallback to update progress + if (currentPageCallBack) { + currentPageCallBack(pageCount); + } } return pages; @@ -276,15 +276,16 @@ const paginate = (page, pageNumber, fontStore, yoga) => { * * @param {Object} doc 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, doc.yoga); + let subpages = paginate(page, pageNumber, fontStore, doc.yoga, currentPageCallBack); subpages = assocSubPageData(subpages); pageNumber += subpages.length; diff --git a/packages/renderer/index.d.ts b/packages/renderer/index.d.ts index af356cba4..df4054e1c 100644 --- a/packages/renderer/index.d.ts +++ b/packages/renderer/index.d.ts @@ -460,6 +460,7 @@ declare namespace ReactPDF { style?: Style | Style[]; className?: string; children?: React.ReactElement; + currentPageCallBack? : ( value:Number ) => void; innerRef?: React.Ref; showToolbar?: boolean; } @@ -502,7 +503,8 @@ declare namespace ReactPDF { * React hook for creating and updating a PDF document instance * @platform web */ - function usePDF(options?: { + function usePDF(options: { + currentPageCallBack? : ( value:Number ) => void; document?: React.ReactElement; }): [ UsePDFInstance, 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 41464edce..fd7a5e1e7 100644 --- a/packages/renderer/src/dom/usePDF.js +++ b/packages/renderer/src/dom/usePDF.js @@ -5,13 +5,7 @@ import { useState, useRef, useEffect, useCallback } from 'react'; import { pdf } from '../index'; -/** - * PDF hook - * - * @param {Object} [options] hook options - * @returns {[Object, Function]} pdf state and update function - */ -export const usePDF = ({ document } = {}) => { +export const usePDF = ({ document, currentPageCallBack } = {}) => { const pdfInstance = useRef(null); const [state, setState] = useState({ @@ -47,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 c6f3ac4ff..0b6c7d9a2 100644 --- a/packages/renderer/src/index.js +++ b/packages/renderer/src/index.js @@ -17,7 +17,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](); @@ -47,7 +47,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 }; };