From fe284e5f882f817a32c1e6859c839e19d74fe060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?avery=20=E2=9C=BF?= Date: Thu, 4 Apr 2024 23:06:02 -0700 Subject: [PATCH] fix topViewabilityInset --- src/viewability/ViewabilityHelper.ts | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/viewability/ViewabilityHelper.ts b/src/viewability/ViewabilityHelper.ts index e976f159a..6e704da1e 100644 --- a/src/viewability/ViewabilityHelper.ts +++ b/src/viewability/ViewabilityHelper.ts @@ -140,28 +140,30 @@ class ViewabilityHelper { return false; } const itemTop = (horizontal ? itemLayout.x : itemLayout.y) - scrollOffset; - const itemSize = horizontal ? itemLayout.width : itemLayout.height; - const listMainSize = horizontal - ? listSize.width - topViewabilityInset - bottomViewabilityInset - : listSize.height - topViewabilityInset - bottomViewabilityInset; - const pixelsVisible = - Math.min(itemTop + itemSize, listMainSize + topViewabilityInset) - - Math.max(itemTop, 0); + const itemEnd = + itemTop + (horizontal ? itemLayout.width : itemLayout.height); + const listStart = topViewabilityInset; + const listEnd = + (horizontal ? listSize.width : listSize.height) - bottomViewabilityInset; + const visibleStart = Math.max(itemTop, listStart); + const visibleEnd = Math.min(itemEnd, listEnd); + const pixelsVisible = Math.max(0, visibleEnd - visibleStart); // Always consider item fully viewable if it is fully visible, regardless of the `viewAreaCoveragePercentThreshold` // Account for floating point imprecision. + const itemSize = horizontal ? itemLayout.width : itemLayout.height; if (Math.abs(pixelsVisible - itemSize) <= 0.001) { return true; } // Skip checking item if it's not visible at all - if (pixelsVisible === 0) { + if (pixelsVisible <= 0) { return false; } const viewAreaMode = viewAreaCoveragePercentThreshold !== null && viewAreaCoveragePercentThreshold !== undefined; const percent = viewAreaMode - ? pixelsVisible / (listMainSize + topViewabilityInset) + ? pixelsVisible / (listEnd - listStart) : pixelsVisible / itemSize; const viewableAreaPercentThreshold = viewAreaMode ? viewAreaCoveragePercentThreshold * 0.01