fix(message-scroller): avoid ResizeObserver loop error by coalescing resize handling into rAF (#11085)

Co-authored-by: shadcn <m@shadcn.com>
This commit is contained in:
Erick
2026-07-07 12:37:08 +07:00
committed by GitHub
parent d8ace420ba
commit 628e427231
2 changed files with 31 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
---
"@shadcn/react": patch
---
Fix MessageScroller firing "ResizeObserver loop completed with undelivered notifications" during streamed content growth by coalescing ResizeObserver callbacks into requestAnimationFrame.

View File

@@ -183,11 +183,22 @@ function MessageScrollerViewport({
return
}
const observer = new ResizeObserver(handleResize)
// Coalesce into rAF: handleResize mutates the spacer inside the observed
// content, and resizing an observed element during delivery fires
// "ResizeObserver loop completed with undelivered notifications".
let frame = 0
const observer = new ResizeObserver(() => {
window.cancelAnimationFrame(frame)
frame = window.requestAnimationFrame(handleResize)
})
observer.observe(viewport)
return () => observer.disconnect()
return () => {
window.cancelAnimationFrame(frame)
observer.disconnect()
}
}, [handleResize, viewportRef])
return (
@@ -261,11 +272,22 @@ function MessageScrollerContent({
return
}
const observer = new ResizeObserver(handleResize)
// Coalesce into rAF: handleResize mutates the spacer inside this observed
// element, and resizing an observed element during delivery fires
// "ResizeObserver loop completed with undelivered notifications".
let frame = 0
const observer = new ResizeObserver(() => {
window.cancelAnimationFrame(frame)
frame = window.requestAnimationFrame(handleResize)
})
observer.observe(content)
return () => observer.disconnect()
return () => {
window.cancelAnimationFrame(frame)
observer.disconnect()
}
}, [handleResize])
return (