Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 1 addition & 6 deletions ui/library/src/components/thumbnails/Thumbnail.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,7 @@ type Props = {
};

export const Thumbnail: React.FunctionComponent<Props> = ({ pageNumber }: Props) => {
const { pageRenderStates, buildObjectURLForPage, getObjectURLForPage } =
React.useContext(PageRenderContext);
const { getObjectURLForPage } = React.useContext(PageRenderContext);
const { isPageVisible, scrollToPage, visiblePageRatios } = React.useContext(ScrollContext);
const [maxVisiblePageNumber, setMaxVisiblePageNumber] = React.useState<Nullable<string>>(null);
const objectURL = getObjectURLForPage({ pageNumber });
Expand All @@ -31,10 +30,6 @@ export const Thumbnail: React.FunctionComponent<Props> = ({ pageNumber }: Props)
parseInt(maxVisiblePageNumber) === pageNumber &&
isPageVisible({ pageNumber });

React.useEffect(() => {
buildObjectURLForPage({ pageNumber });
}, [pageRenderStates]);

const onClick = React.useCallback(
event => {
event.preventDefault();
Expand Down
39 changes: 34 additions & 5 deletions ui/library/src/context/PageRenderContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ export interface IPageRenderContext {
pageRenderStates: PageNumberToRenderStateMap;
getObjectURLForPage: (pageNumber: PageNumber) => Nullable<string>;
isBuildingObjectURLForPage: (pageNumber: PageNumber) => boolean;
isFinishedBuildingAllPagesObjectURLs: () => boolean;
buildObjectURLForPage: (pageNumber: PageNumber) => Promise<string>;
}

Expand All @@ -29,6 +30,10 @@ export const PageRenderContext = React.createContext<IPageRenderContext>({
logProviderWarning(`isBuildingObjectURLForPage(${JSON.stringify(args)})`, 'PageRenderContext');
return false;
},
isFinishedBuildingAllPagesObjectURLs: () => {
logProviderWarning(`isFinishedBuildingAllPagesObjectURLs()`, 'PageRenderContext');
return false;
},
buildObjectURLForPage: args => {
logProviderWarning(`buildObjectURLForPage(${JSON.stringify(args)})`, 'PageRenderContext');
return Promise.resolve('');
Expand Down Expand Up @@ -82,6 +87,16 @@ export function usePageRenderContextProps({
[pageRenderStates]
);

const isFinishedBuildingAllPagesObjectURLs = React.useCallback((): boolean => {
if (!pdfDocProxy) return false;
for (let pageNumber = 1; pageNumber <= pdfDocProxy.numPages; pageNumber++) {
if (!pageRenderStates.get(pageNumber)?.objectURL) {
return false;
}
}
return true;
}, [pdfDocProxy, pageRenderStates]);

const getObjectURLForPage = React.useCallback(
({ pageNumber, pageIndex }: PageNumber): Nullable<string> => {
if (typeof pageIndex === 'number') {
Expand Down Expand Up @@ -139,13 +154,26 @@ export function usePageRenderContextProps({
);

React.useEffect(() => {
for (const pageNumber of visiblePageRatios.keys()) {
if (pageRenderStates.has(pageNumber)) {
continue;
}
const visiblePages = [...visiblePageRatios.keys()];
if (
!pdfDocProxy ||
[...pageRenderStates.keys()].length === pdfDocProxy.numPages ||
visiblePages.length === 0
) {
return;
}

const visiblePagesNeighbors = [
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ericmarsh995 i would love to abstract this line from 166 - 171 into maybe a class itself where we can unit test it correctly.

Math.max(1, visiblePages[0] - 1),
Math.min(pdfDocProxy.numPages, visiblePages[visiblePages.length - 1] + 1),
];
const allPages = Array.from({ length: pdfDocProxy.numPages }, (_, i) => i + 1);
const priorityQueue = new Set([...visiblePages, ...visiblePagesNeighbors, ...allPages]);

for (const pageNumber of priorityQueue) {
buildObjectURLForPage({ pageNumber });
}
}, [pageRenderStates, visiblePageRatios]);
}, [pageRenderStates, pdfDocProxy, visiblePageRatios]);

// Flush page render states when scale changes
React.useEffect(() => {
Expand All @@ -166,6 +194,7 @@ export function usePageRenderContextProps({
pageRenderStates,
getObjectURLForPage,
isBuildingObjectURLForPage,
isFinishedBuildingAllPagesObjectURLs,
buildObjectURLForPage,
};
}
Expand Down