Skip to content

Commit d64672d

Browse files
committed
Prevent resize handling after cleanup in useViewportRef
Introduces a 'cleanedUp' flag in both shared and Vue useViewportRef hooks to prevent ResizeObserver callbacks from executing after cleanup. Ensures resize handling does not occur after the component is unmounted or cleaned up, improving stability.
1 parent f38dded commit d64672d

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

.changeset/dry-chairs-lay.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@embedpdf/plugin-viewport': patch
3+
---
4+
5+
Prevent resize handling after cleanup in useViewportRef

packages/plugin-viewport/src/shared/hooks/use-viewport-ref.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export function useViewportRef() {
1313
const container = containerRef.current;
1414
if (!container) return;
1515

16+
let cleanedUp = false;
17+
1618
/* ---------- live rect provider --------------------------------- */
1719
const provideRect = (): Rect => {
1820
const r = container.getBoundingClientRect();
@@ -34,6 +36,7 @@ export function useViewportRef() {
3436

3537
// Example: On resize, call setMetrics
3638
const resizeObserver = new ResizeObserver(() => {
39+
if (cleanedUp) return;
3740
viewportPlugin.setViewportResizeMetrics({
3841
width: container.offsetWidth,
3942
height: container.offsetHeight,
@@ -57,9 +60,10 @@ export function useViewportRef() {
5760

5861
// Cleanup
5962
return () => {
63+
cleanedUp = true;
64+
resizeObserver.disconnect();
6065
viewportPlugin.registerBoundingRectProvider(null);
6166
container.removeEventListener('scroll', onScroll);
62-
resizeObserver.disconnect();
6367
unsubscribeScrollRequest();
6468
};
6569
}, [viewportPlugin]);

packages/plugin-viewport/src/vue/hooks/use-viewport-ref.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export function useViewportRef() {
1414

1515
if (!container || !viewportPlugin) return;
1616

17+
let cleanedUp = false;
1718
/* ---------- live rect provider --------------------------------- */
1819
const provideRect = (): Rect => {
1920
const r = container.getBoundingClientRect();
@@ -35,6 +36,7 @@ export function useViewportRef() {
3536

3637
// Example: On resize, call setMetrics
3738
const resizeObserver = new ResizeObserver(() => {
39+
if (cleanedUp) return;
3840
viewportPlugin.setViewportResizeMetrics({
3941
width: container.offsetWidth,
4042
height: container.offsetHeight,
@@ -58,9 +60,10 @@ export function useViewportRef() {
5860

5961
// Return cleanup function
6062
return () => {
63+
cleanedUp = true;
64+
resizeObserver.disconnect();
6165
viewportPlugin.registerBoundingRectProvider(null);
6266
container.removeEventListener('scroll', onScroll);
63-
resizeObserver.disconnect();
6467
unsubscribeScrollRequest();
6568
};
6669
};

0 commit comments

Comments
 (0)