Skip to content

Commit e0f8178

Browse files
Fix zoom again (#27)
* wip * remove scale * wip * fix: Improve scroll anchor offset calculation * refactor: Extract getOffsetForIndexEager logic Co-authored-by: aider (vertex_ai/gemini-2.5-pro) <aider@aider.chat> * fix: zoom offset calc dont use cached value --------- Co-authored-by: aider (vertex_ai/gemini-2.5-pro) <aider@aider.chat>
1 parent 8a4941b commit e0f8178

5 files changed

Lines changed: 22 additions & 17 deletions

File tree

demo/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ function App() {
2727
const [zoomMode, setZoomMode] = useState<ZoomMode>("default");
2828
const [pageNum, setPageNum] = useState<number | null>(null);
2929
const [scale, setScale] = useState<number | null>(0.75);
30-
const [file, setFile] = useState<string>("pdf-open-parameters.pdf");
30+
const [file, setFile] = useState<string>("rai.pdf");
3131
const [wantPage, setWantPage] = useState<number | null>(null);
3232
const [readerAPI, setReaderAPI] = useState<ReaderAPI | null>(null);
3333
const [offset, setOffset] = useState<number | null>(null);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-pdf-headless",
3-
"version": "1.0.0",
3+
"version": "1.1.0",
44
"type": "module",
55
"files": [
66
"src",

src/Page.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ export const EXTRA_WIDTH = 5;
77
const Page = ({
88
virtualItem,
99
viewports,
10-
scale = 1,
1110
rotation,
1211
pageObserver,
1312
shouldRender,
@@ -22,13 +21,7 @@ const Page = ({
2221
}, [pageObserver]);
2322

2423
const defaultPageRenderer: RenderPage = (props: RenderPageProps) => {
25-
return (
26-
<ReactPdfPage
27-
pageIndex={props.pageIndex}
28-
scale={props.scale}
29-
rotate={props.rotate}
30-
/>
31-
);
24+
return <ReactPdfPage pageIndex={props.pageIndex} rotate={props.rotate} />;
3225
};
3326

3427
const renderPageLayer = renderPage || defaultPageRenderer;
@@ -79,7 +72,6 @@ const Page = ({
7972
>
8073
{renderPageLayer({
8174
pageIndex: virtualItem.index,
82-
scale,
8375
rotate: rotation,
8476
rotationAdjustment,
8577
})}

src/Reader.tsx

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
Virtualizer,
23
VirtualizerOptions,
34
elementScroll,
45
useVirtualizer,
@@ -29,6 +30,18 @@ const determineScale = (parentElement: HTMLElement, width: number): number => {
2930
return scaleWidth;
3031
};
3132

33+
const getOffsetForIndexEager = (
34+
index: number,
35+
virtualizer: Virtualizer<any, any>,
36+
estimateSize: (i: number) => number,
37+
) => {
38+
let offset = virtualizer.options.paddingStart;
39+
for (let i = 0; i < index; i++) {
40+
offset += estimateSize(i) + virtualizer.options.gap;
41+
}
42+
return offset;
43+
};
44+
3245
export interface ZoomState {
3346
currentScale: number | null;
3447
nextScale: number | null;
@@ -309,10 +322,12 @@ const Reader = ({
309322
onViewportsMeasured && onViewportsMeasured();
310323

311324
if (scrollAnchor) {
312-
const startOffset = virtualizer.getOffsetForIndex(
325+
// manually calculate offset here in case it was cached from an earlier render
326+
const startOffset = getOffsetForIndexEager(
313327
scrollAnchor.index,
314-
"start",
315-
)?.[0];
328+
virtualizer,
329+
estimateSize,
330+
);
316331

317332
if (startOffset != null) {
318333
const itemHeight = estimateSize(scrollAnchor.index);
@@ -439,6 +454,7 @@ const Reader = ({
439454
{...reactPDFDocumentProps}
440455
file={file}
441456
onLoadSuccess={onDocumentLoadSuccess}
457+
scale={scale}
442458
>
443459
<div
444460
id="pages-container"
@@ -457,7 +473,6 @@ const Reader = ({
457473
key={virtualItem.key}
458474
virtualItem={virtualItem}
459475
viewports={viewports}
460-
scale={scale}
461476
rotationAdjustment={getRotationAdjustment(virtualItem.index)}
462477
rotation={rotation + getRotationAdjustment(virtualItem.index)}
463478
pageObserver={pageObserver}

src/types.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ export interface HighlightArea {
7878

7979
export interface RenderPageProps {
8080
pageIndex: number;
81-
scale: number;
8281
rotate: number;
8382
rotationAdjustment: number;
8483
}
@@ -88,7 +87,6 @@ export type RenderPage = (props: RenderPageProps) => React.ReactNode;
8887
export interface ReaderPageProps {
8988
virtualItem: VirtualItem;
9089
viewports: Array<PageViewport> | null;
91-
scale: number | undefined;
9290
rotation: number;
9391
pageObserver: IntersectionObserver | undefined;
9492
shouldRender: boolean;

0 commit comments

Comments
 (0)