Prevent cached session remeasurements and remove logs

This commit is contained in:
Shantur Rathore
2025-12-09 16:18:10 +00:00
parent 8204143810
commit 82ff1916b7
4 changed files with 89 additions and 53 deletions

View File

@@ -98,6 +98,7 @@ interface VirtualItemProps {
placeholderClass?: string
virtualizationEnabled?: Accessor<boolean>
forceVisible?: Accessor<boolean>
suspendMeasurements?: Accessor<boolean>
onMeasured?: () => void
id?: string
}
@@ -138,10 +139,12 @@ export default function VirtualItem(props: VirtualItemProps) {
if (!virtualizationEnabled()) return false
return !isIntersecting()
})
const measurementsSuspended = () => Boolean(props.suspendMeasurements?.())
let wrapperRef: HTMLDivElement | undefined
let contentRef: HTMLDivElement | undefined
let resizeObserver: ResizeObserver | undefined
let intersectionCleanup: (() => void) | undefined
@@ -176,23 +179,27 @@ export default function VirtualItem(props: VirtualItemProps) {
}
function updateMeasuredHeight() {
if (!contentRef) return
if (!contentRef || measurementsSuspended()) return
const next = contentRef.offsetHeight
if (next === measuredHeight()) return
persistMeasurement(next)
}
function setupResizeObserver() {
if (!contentRef) return
if (!contentRef || measurementsSuspended()) return
cleanupResizeObserver()
if (typeof ResizeObserver === "undefined") {
updateMeasuredHeight()
return
}
resizeObserver = new ResizeObserver(() => updateMeasuredHeight())
resizeObserver = new ResizeObserver(() => {
if (measurementsSuspended()) return
updateMeasuredHeight()
})
resizeObserver.observe(contentRef)
}
function refreshIntersectionObserver(targetRoot: Element | Document | null) {
cleanupIntersectionObserver()
if (!wrapperRef) {
@@ -219,7 +226,7 @@ export default function VirtualItem(props: VirtualItemProps) {
contentRef = element ?? undefined
if (contentRef) {
queueMicrotask(() => {
if (shouldHideContent()) return
if (shouldHideContent() || measurementsSuspended()) return
updateMeasuredHeight()
setupResizeObserver()
})
@@ -227,10 +234,10 @@ export default function VirtualItem(props: VirtualItemProps) {
cleanupResizeObserver()
}
}
createEffect(() => {
if (shouldHideContent()) {
if (shouldHideContent() || measurementsSuspended()) {
cleanupResizeObserver()
} else if (contentRef) {
queueMicrotask(() => {
@@ -239,6 +246,7 @@ export default function VirtualItem(props: VirtualItemProps) {
})
}
})
createEffect(() => {
const key = props.cacheKey