Skip to content

Commit ea52180

Browse files
authored
fix: not displaying initially selected text
1 parent 70080cf commit ea52180

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

src/components/PdfViewer/SelectionRenderer/SelectionRenderer.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,20 @@ import { subtractBorder } from "../../../utils/subtractBorder";
44
import { type IPdfContext, PdfContext } from "../../PdfProvider/PdfProvider";
55
import { type ISelectionContext, SelectionContext } from "../../SelectionProvider/SelectionProvider";
66
import { Highlighter, type IHighlighterColor } from "../Highlighter/Highlighter";
7+
import { useIsCurrentPageRendered } from "./useIsCurrentPageRendered";
78

89
const SELECTION_COLOR: IHighlighterColor = { r: 0, g: 100, b: 200 };
910
const SELECTION_OPACITY = 0.3;
1011
const SCROLL_TO_OFFSET_PX: number = 200;
1112

1213
export function SelectionRenderer() {
13-
const { viewer, textLayerRenderedRef } = useContext(PdfContext) as IPdfContext;
14+
const { viewer } = useContext(PdfContext) as IPdfContext;
1415
const { selectedBlocks, pageNumber, lastScrolledTo, setSelectionString } = useContext(
1516
SelectionContext,
1617
) as ISelectionContext;
1718
const { pageOffsets } = useContext(PdfContext) as IPdfContext;
1819
const [retryScrolling, setRetryScrolling] = useState(0);
20+
const { isCurrentPageTextLayerRendered } = useIsCurrentPageRendered();
1921

2022
useEffect(() => {
2123
// not ready yet
@@ -59,8 +61,9 @@ export function SelectionRenderer() {
5961
}, [selectedBlocks, setSelectionString]);
6062

6163
useEffect(() => {
62-
if (!viewer || !selectedBlocks.length || pageNumber === null || !textLayerRenderedRef.current.includes(pageNumber))
64+
if (!viewer || !selectedBlocks.length || pageNumber === null || !isCurrentPageTextLayerRendered) {
6365
return;
66+
}
6467

6568
const pageElement = viewer.getPageView(pageNumber - 1)?.div;
6669
const textLayerElement = viewer.getPageView(pageNumber - 1)?.textLayer?.div;
@@ -105,7 +108,7 @@ export function SelectionRenderer() {
105108
}
106109

107110
setSelectionString(document.getSelection()?.toString() || "");
108-
}, [selectedBlocks, pageNumber, viewer, textLayerRenderedRef, setSelectionString]);
111+
}, [selectedBlocks, pageNumber, viewer, isCurrentPageTextLayerRendered, setSelectionString]);
109112

110113
const pageOffset = pageNumber ? pageOffsets.current[pageNumber] : null;
111114

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { useContext, useEffect, useState } from "react";
2+
import { type IPdfContext, PdfContext } from "../../PdfProvider/PdfProvider";
3+
import { type ISelectionContext, SelectionContext } from "../../SelectionProvider/SelectionProvider";
4+
5+
export const useIsCurrentPageRendered = () => {
6+
const { textLayerRenderedRef, eventBus } = useContext(PdfContext) as IPdfContext;
7+
const [isCurrentPageTextLayerRendered, setIsCurrentPageTextLayerRendered] = useState(false);
8+
9+
const { pageNumber } = useContext(SelectionContext) as ISelectionContext;
10+
11+
useEffect(() => {
12+
if (pageNumber === null) {
13+
setIsCurrentPageTextLayerRendered(false);
14+
} else {
15+
setIsCurrentPageTextLayerRendered(textLayerRenderedRef.current.includes(pageNumber));
16+
}
17+
}, [pageNumber, textLayerRenderedRef]);
18+
19+
useEffect(() => {
20+
if (!eventBus || pageNumber === null) return;
21+
22+
const handleTextLayerRendered = (e: { pageNumber: number }) => {
23+
if (e.pageNumber === pageNumber) {
24+
setIsCurrentPageTextLayerRendered(true);
25+
}
26+
};
27+
28+
eventBus.on("textlayerrendered", handleTextLayerRendered);
29+
30+
return () => {
31+
eventBus.off("textlayerrendered", handleTextLayerRendered);
32+
};
33+
}, [eventBus, pageNumber]);
34+
35+
return {
36+
isCurrentPageTextLayerRendered,
37+
};
38+
};

0 commit comments

Comments
 (0)