@shopify/flash-list 2.0.4-alpha.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnimatedFlashList.js +4 -6
- package/dist/AnimatedFlashList.js.map +1 -1
- package/dist/FlashList.js +1 -5
- package/dist/FlashList.js.map +1 -1
- package/dist/FlashListProps.d.ts +41 -1
- package/dist/FlashListProps.d.ts.map +1 -1
- package/dist/FlashListProps.js +1 -4
- package/dist/FlashListProps.js.map +1 -1
- package/dist/FlashListRef.js +1 -2
- package/dist/benchmark/AutoScrollHelper.js +22 -30
- package/dist/benchmark/AutoScrollHelper.js.map +1 -1
- package/dist/benchmark/JSFPSMonitor.js +27 -33
- package/dist/benchmark/JSFPSMonitor.js.map +1 -1
- package/dist/benchmark/roundToDecimalPlaces.js +2 -5
- package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
- package/dist/benchmark/useBenchmark.d.ts +9 -1
- package/dist/benchmark/useBenchmark.d.ts.map +1 -1
- package/dist/benchmark/useBenchmark.js +86 -95
- package/dist/benchmark/useBenchmark.js.map +1 -1
- package/dist/benchmark/useDataMultiplier.js +6 -10
- package/dist/benchmark/useDataMultiplier.js.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.d.ts +4 -1
- package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.js +73 -81
- package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
- package/dist/errors/ErrorMessages.js +1 -4
- package/dist/errors/ErrorMessages.js.map +1 -1
- package/dist/errors/WarningMessages.js +1 -4
- package/dist/errors/WarningMessages.js.map +1 -1
- package/dist/index.js +17 -35
- package/dist/index.js.map +1 -1
- package/dist/isNewArch.js +6 -9
- package/dist/isNewArch.js.map +1 -1
- package/dist/native/config/PlatformHelper.android.js +2 -5
- package/dist/native/config/PlatformHelper.android.js.map +1 -1
- package/dist/native/config/PlatformHelper.ios.js +2 -5
- package/dist/native/config/PlatformHelper.ios.js.map +1 -1
- package/dist/native/config/PlatformHelper.js +2 -5
- package/dist/native/config/PlatformHelper.js.map +1 -1
- package/dist/native/config/PlatformHelper.web.js +2 -5
- package/dist/native/config/PlatformHelper.web.js.map +1 -1
- package/dist/recyclerview/LayoutCommitObserver.js +20 -24
- package/dist/recyclerview/LayoutCommitObserver.js.map +1 -1
- package/dist/recyclerview/RecyclerView.d.ts.map +1 -1
- package/dist/recyclerview/RecyclerView.js +134 -111
- package/dist/recyclerview/RecyclerView.js.map +1 -1
- package/dist/recyclerview/RecyclerViewContextProvider.js +7 -12
- package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -1
- package/dist/recyclerview/RecyclerViewManager.js +138 -167
- package/dist/recyclerview/RecyclerViewManager.js.map +1 -1
- package/dist/recyclerview/RecyclerViewProps.js +1 -2
- package/dist/recyclerview/RenderStackManager.js +97 -188
- package/dist/recyclerview/RenderStackManager.js.map +1 -1
- package/dist/recyclerview/ViewHolder.d.ts +2 -0
- package/dist/recyclerview/ViewHolder.d.ts.map +1 -1
- package/dist/recyclerview/ViewHolder.js +19 -21
- package/dist/recyclerview/ViewHolder.js.map +1 -1
- package/dist/recyclerview/ViewHolderCollection.d.ts +4 -0
- package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -1
- package/dist/recyclerview/ViewHolderCollection.js +26 -30
- package/dist/recyclerview/ViewHolderCollection.js.map +1 -1
- package/dist/recyclerview/components/CompatScroller.js +6 -7
- package/dist/recyclerview/components/CompatScroller.js.map +1 -1
- package/dist/recyclerview/components/CompatView.js +6 -7
- package/dist/recyclerview/components/CompatView.js.map +1 -1
- package/dist/recyclerview/components/ScrollAnchor.js +10 -15
- package/dist/recyclerview/components/ScrollAnchor.js.map +1 -1
- package/dist/recyclerview/components/StickyHeaders.d.ts +5 -1
- package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -1
- package/dist/recyclerview/components/StickyHeaders.js +77 -51
- package/dist/recyclerview/components/StickyHeaders.js.map +1 -1
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js +39 -66
- package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -1
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js +57 -63
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -1
- package/dist/recyclerview/helpers/RenderTimeTracker.js +19 -24
- package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -1
- package/dist/recyclerview/helpers/VelocityTracker.js +16 -22
- package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -1
- package/dist/recyclerview/hooks/useBoundDetection.js +37 -40
- package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -1
- package/dist/recyclerview/hooks/useLayoutState.js +9 -15
- package/dist/recyclerview/hooks/useLayoutState.js.map +1 -1
- package/dist/recyclerview/hooks/useMappingHelper.js +6 -10
- package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -1
- package/dist/recyclerview/hooks/useOnLoad.js +16 -22
- package/dist/recyclerview/hooks/useOnLoad.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewController.js +169 -188
- package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewManager.js +12 -17
- package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclingState.js +10 -14
- package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -1
- package/dist/recyclerview/hooks/useSecondaryProps.d.ts +2 -0
- package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useSecondaryProps.js +39 -30
- package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -1
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +17 -22
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -1
- package/dist/recyclerview/hooks/useUnmountFlag.js +5 -9
- package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -1
- package/dist/recyclerview/layout-managers/GridLayoutManager.js +61 -80
- package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/LayoutManager.js +83 -123
- package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js +51 -91
- package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +77 -96
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -1
- package/dist/recyclerview/utils/adjustOffsetForRTL.js +1 -4
- package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -1
- package/dist/recyclerview/utils/componentUtils.js +4 -9
- package/dist/recyclerview/utils/componentUtils.js.map +1 -1
- package/dist/recyclerview/utils/findVisibleIndex.js +9 -13
- package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -1
- package/dist/recyclerview/utils/measureLayout.js +12 -20
- package/dist/recyclerview/utils/measureLayout.js.map +1 -1
- package/dist/recyclerview/utils/measureLayout.web.js +15 -23
- package/dist/recyclerview/utils/measureLayout.web.js.map +1 -1
- package/dist/recyclerview/viewability/ViewToken.js +1 -2
- package/dist/recyclerview/viewability/ViewabilityHelper.js +34 -41
- package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -1
- package/dist/recyclerview/viewability/ViewabilityManager.js +48 -61
- package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/AverageWindow.js +28 -39
- package/dist/utils/AverageWindow.js.map +1 -1
- package/package.json +4 -6
- package/src/FlashListProps.ts +51 -1
- package/src/benchmark/useBenchmark.ts +47 -4
- package/src/benchmark/useFlatListBenchmark.ts +38 -5
- package/src/recyclerview/RecyclerView.tsx +42 -8
- package/src/recyclerview/ViewHolder.tsx +6 -1
- package/src/recyclerview/ViewHolderCollection.tsx +10 -0
- package/src/recyclerview/components/StickyHeaders.tsx +54 -13
- package/src/recyclerview/hooks/useRecyclerViewController.tsx +7 -4
- package/src/recyclerview/hooks/useSecondaryProps.tsx +23 -0
- package/dist/__tests__/AverageWindow.test.d.ts +0 -2
- package/dist/__tests__/AverageWindow.test.d.ts.map +0 -1
- package/dist/__tests__/AverageWindow.test.js +0 -104
- package/dist/__tests__/AverageWindow.test.js.map +0 -1
- package/dist/__tests__/ConsecutiveNumbers.test.d.ts +0 -2
- package/dist/__tests__/ConsecutiveNumbers.test.d.ts.map +0 -1
- package/dist/__tests__/ConsecutiveNumbers.test.js +0 -224
- package/dist/__tests__/ConsecutiveNumbers.test.js.map +0 -1
- package/dist/__tests__/GridLayoutManager.test.d.ts +0 -2
- package/dist/__tests__/GridLayoutManager.test.d.ts.map +0 -1
- package/dist/__tests__/GridLayoutManager.test.js +0 -69
- package/dist/__tests__/GridLayoutManager.test.js.map +0 -1
- package/dist/__tests__/LayoutCommitObserver.test.d.ts +0 -2
- package/dist/__tests__/LayoutCommitObserver.test.d.ts.map +0 -1
- package/dist/__tests__/LayoutCommitObserver.test.js +0 -37
- package/dist/__tests__/LayoutCommitObserver.test.js.map +0 -1
- package/dist/__tests__/LinearLayoutManager.test.d.ts +0 -2
- package/dist/__tests__/LinearLayoutManager.test.d.ts.map +0 -1
- package/dist/__tests__/LinearLayoutManager.test.js +0 -140
- package/dist/__tests__/LinearLayoutManager.test.js.map +0 -1
- package/dist/__tests__/MasonryLayoutManager.test.d.ts +0 -2
- package/dist/__tests__/MasonryLayoutManager.test.d.ts.map +0 -1
- package/dist/__tests__/MasonryLayoutManager.test.js +0 -148
- package/dist/__tests__/MasonryLayoutManager.test.js.map +0 -1
- package/dist/__tests__/RecyclerView.test.d.ts +0 -2
- package/dist/__tests__/RecyclerView.test.d.ts.map +0 -1
- package/dist/__tests__/RecyclerView.test.js +0 -103
- package/dist/__tests__/RecyclerView.test.js.map +0 -1
- package/dist/__tests__/RecyclerViewManager.test.d.ts +0 -2
- package/dist/__tests__/RecyclerViewManager.test.d.ts.map +0 -1
- package/dist/__tests__/RecyclerViewManager.test.js +0 -56
- package/dist/__tests__/RecyclerViewManager.test.js.map +0 -1
- package/dist/__tests__/RenderStackManager.test.d.ts +0 -2
- package/dist/__tests__/RenderStackManager.test.d.ts.map +0 -1
- package/dist/__tests__/RenderStackManager.test.js +0 -485
- package/dist/__tests__/RenderStackManager.test.js.map +0 -1
- package/dist/__tests__/ViewabilityHelper.test.d.ts +0 -2
- package/dist/__tests__/ViewabilityHelper.test.d.ts.map +0 -1
- package/dist/__tests__/ViewabilityHelper.test.js +0 -186
- package/dist/__tests__/ViewabilityHelper.test.js.map +0 -1
- package/dist/__tests__/findVisibleIndex.test.d.ts +0 -2
- package/dist/__tests__/findVisibleIndex.test.d.ts.map +0 -1
- package/dist/__tests__/findVisibleIndex.test.js +0 -259
- package/dist/__tests__/findVisibleIndex.test.js.map +0 -1
- package/dist/__tests__/helpers/createLayoutManager.d.ts +0 -34
- package/dist/__tests__/helpers/createLayoutManager.d.ts.map +0 -1
- package/dist/__tests__/helpers/createLayoutManager.js +0 -110
- package/dist/__tests__/helpers/createLayoutManager.js.map +0 -1
- package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts +0 -2
- package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts.map +0 -1
- package/dist/__tests__/useUnmountAwareCallbacks.test.js +0 -185
- package/dist/__tests__/useUnmountAwareCallbacks.test.js.map +0 -1
- package/src/__tests__/AverageWindow.test.ts +0 -128
- package/src/__tests__/ConsecutiveNumbers.test.ts +0 -232
- package/src/__tests__/GridLayoutManager.test.ts +0 -113
- package/src/__tests__/LayoutCommitObserver.test.tsx +0 -63
- package/src/__tests__/LinearLayoutManager.test.ts +0 -227
- package/src/__tests__/MasonryLayoutManager.test.ts +0 -202
- package/src/__tests__/RecyclerView.test.tsx +0 -144
- package/src/__tests__/RecyclerViewManager.test.ts +0 -74
- package/src/__tests__/RenderStackManager.test.ts +0 -574
- package/src/__tests__/ViewabilityHelper.test.ts +0 -282
- package/src/__tests__/findVisibleIndex.test.ts +0 -369
- package/src/__tests__/helpers/createLayoutManager.ts +0 -141
- package/src/__tests__/useUnmountAwareCallbacks.test.tsx +0 -285
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.adjustOffsetForRTL = adjustOffsetForRTL;
|
|
4
1
|
/**
|
|
5
2
|
* Adjusts the scroll offset for Right-to-Left (RTL) layouts.
|
|
6
3
|
* offset it flipped when RTL is enabled.
|
|
@@ -11,7 +8,7 @@ exports.adjustOffsetForRTL = adjustOffsetForRTL;
|
|
|
11
8
|
* @param windowSize - The size of the visible window/viewport
|
|
12
9
|
* @returns The adjusted offset for RTL layout
|
|
13
10
|
*/
|
|
14
|
-
function adjustOffsetForRTL(offset, contentSize, windowSize) {
|
|
11
|
+
export function adjustOffsetForRTL(offset, contentSize, windowSize) {
|
|
15
12
|
return contentSize - offset - windowSize;
|
|
16
13
|
}
|
|
17
14
|
//# sourceMappingURL=adjustOffsetForRTL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adjustOffsetForRTL.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/adjustOffsetForRTL.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adjustOffsetForRTL.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/adjustOffsetForRTL.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,WAAmB,EACnB,UAAkB;IAElB,OAAO,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;AAC3C,CAAC"}
|
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getValidComponent = void 0;
|
|
4
|
-
var tslib_1 = require("tslib");
|
|
5
|
-
var react_1 = tslib_1.__importDefault(require("react"));
|
|
1
|
+
import React from "react";
|
|
6
2
|
/**
|
|
7
3
|
* Helper function to handle both React components and React elements.
|
|
8
4
|
* This utility ensures proper rendering of components whether they are passed as
|
|
@@ -19,14 +15,13 @@ var react_1 = tslib_1.__importDefault(require("react"));
|
|
|
19
15
|
* // With a pre-rendered element
|
|
20
16
|
* getValidComponent(<MyComponent />)
|
|
21
17
|
*/
|
|
22
|
-
|
|
23
|
-
if (
|
|
18
|
+
export const getValidComponent = (component) => {
|
|
19
|
+
if (React.isValidElement(component)) {
|
|
24
20
|
return component;
|
|
25
21
|
}
|
|
26
22
|
else if (typeof component === "function") {
|
|
27
|
-
return
|
|
23
|
+
return React.createElement(component);
|
|
28
24
|
}
|
|
29
25
|
return null;
|
|
30
26
|
};
|
|
31
|
-
exports.getValidComponent = getValidComponent;
|
|
32
27
|
//# sourceMappingURL=componentUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentUtils.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/componentUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"componentUtils.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/componentUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,SAAsE,EAC3C,EAAE;IAC7B,IAAI,KAAK,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,SAAS,CAAC;IACnB,CAAC;SAAM,IAAI,OAAO,SAAS,KAAK,UAAU,EAAE,CAAC;QAC3C,OAAO,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.findFirstVisibleIndex = findFirstVisibleIndex;
|
|
4
|
-
exports.findLastVisibleIndex = findLastVisibleIndex;
|
|
5
1
|
/**
|
|
6
2
|
* A helper function to perform binary search for the first or last visible index.
|
|
7
3
|
* This function efficiently finds items that are visible within a viewport by using
|
|
@@ -18,15 +14,15 @@ exports.findLastVisibleIndex = findLastVisibleIndex;
|
|
|
18
14
|
* The function assumes the layouts array is pre-sorted by the relevant dimension (x or y).
|
|
19
15
|
*/
|
|
20
16
|
function binarySearchVisibleIndex(layouts, threshold, isSortedByX, findFirst) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
let left = 0;
|
|
18
|
+
let right = layouts.length - 1;
|
|
19
|
+
let visibleIndex = -1;
|
|
24
20
|
while (left <= right) {
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
const mid = Math.floor((left + right) / 2);
|
|
22
|
+
const layout = layouts[mid];
|
|
27
23
|
// Check visibility based on the sorting criteria
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
const position = isSortedByX ? layout.x : layout.y;
|
|
25
|
+
const size = isSortedByX ? layout.width : layout.height;
|
|
30
26
|
if (findFirst) {
|
|
31
27
|
// Logic for finding the first visible index
|
|
32
28
|
if (position >= threshold || position + size > threshold) {
|
|
@@ -61,7 +57,7 @@ function binarySearchVisibleIndex(layouts, threshold, isSortedByX, findFirst) {
|
|
|
61
57
|
* @param isSortedByX - A boolean indicating if the array is sorted by x (true) or y (false)
|
|
62
58
|
* @returns The index of the first visible layout or -1 if none are visible
|
|
63
59
|
*/
|
|
64
|
-
function findFirstVisibleIndex(layouts, threshold, isSortedByX) {
|
|
60
|
+
export function findFirstVisibleIndex(layouts, threshold, isSortedByX) {
|
|
65
61
|
return binarySearchVisibleIndex(layouts, threshold, isSortedByX, true);
|
|
66
62
|
}
|
|
67
63
|
/**
|
|
@@ -74,7 +70,7 @@ function findFirstVisibleIndex(layouts, threshold, isSortedByX) {
|
|
|
74
70
|
* @param isSortedByX - A boolean indicating if the array is sorted by x (true) or y (false)
|
|
75
71
|
* @returns The index of the last visible layout or -1 if none are visible
|
|
76
72
|
*/
|
|
77
|
-
function findLastVisibleIndex(layouts, threshold, isSortedByX) {
|
|
73
|
+
export function findLastVisibleIndex(layouts, threshold, isSortedByX) {
|
|
78
74
|
return binarySearchVisibleIndex(layouts, threshold, isSortedByX, false);
|
|
79
75
|
}
|
|
80
76
|
//# sourceMappingURL=findVisibleIndex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"findVisibleIndex.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/findVisibleIndex.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"findVisibleIndex.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/findVisibleIndex.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,SAAS,wBAAwB,CAC/B,OAAmB,EACnB,SAAiB,EACjB,WAAoB,EACpB,SAAkB;IAElB,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;IAEtB,OAAO,IAAI,IAAI,KAAK,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAE5B,iDAAiD;QACjD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAExD,IAAI,SAAS,EAAE,CAAC;YACd,4CAA4C;YAC5C,IAAI,QAAQ,IAAI,SAAS,IAAI,QAAQ,GAAG,IAAI,GAAG,SAAS,EAAE,CAAC;gBACzD,mFAAmF;gBACnF,YAAY,GAAG,GAAG,CAAC;gBACnB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,6CAA6C;gBAC7C,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;YACjB,CAAC;QACH,CAAC;aAAM,IAAI,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,kFAAkF;YAClF,YAAY,GAAG,GAAG,CAAC;YACnB,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,4CAA4C;YAC5C,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC;AACtB,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAmB,EACnB,SAAiB,EACjB,WAAoB;IAEpB,OAAO,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAmB,EACnB,SAAiB,EACjB,WAAoB;IAEpB,OAAO,wBAAwB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC;AAC1E,CAAC"}
|
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.areDimensionsNotEqual = areDimensionsNotEqual;
|
|
4
|
-
exports.areDimensionsEqual = areDimensionsEqual;
|
|
5
|
-
exports.roundOffPixel = roundOffPixel;
|
|
6
|
-
exports.measureParentSize = measureParentSize;
|
|
7
|
-
exports.measureFirstChildLayout = measureFirstChildLayout;
|
|
8
|
-
exports.measureItemLayout = measureItemLayout;
|
|
9
|
-
var react_native_1 = require("react-native");
|
|
1
|
+
import { PixelRatio } from "react-native";
|
|
10
2
|
/**
|
|
11
3
|
* Measures the layout of a view relative to itselft.
|
|
12
4
|
* Using measure wasn't returing accurate values but this workaround does.
|
|
@@ -31,8 +23,8 @@ function measureLayout(view, oldLayout) {
|
|
|
31
23
|
* @returns An object containing x, y, width, and height measurements
|
|
32
24
|
*/
|
|
33
25
|
function measureLayoutRelative(view, relativeTo, oldLayout) {
|
|
34
|
-
|
|
35
|
-
view.measureLayout(relativeTo,
|
|
26
|
+
const layout = { x: 0, y: 0, width: 0, height: 0 };
|
|
27
|
+
view.measureLayout(relativeTo, (x, y, width, height) => {
|
|
36
28
|
layout.x = x;
|
|
37
29
|
layout.y = y;
|
|
38
30
|
layout.width = roundOffPixel(width);
|
|
@@ -56,7 +48,7 @@ function measureLayoutRelative(view, relativeTo, oldLayout) {
|
|
|
56
48
|
* @param value2 - Second dimension value to compare
|
|
57
49
|
* @returns true if the values are significantly different, false otherwise
|
|
58
50
|
*/
|
|
59
|
-
function areDimensionsNotEqual(value1, value2) {
|
|
51
|
+
export function areDimensionsNotEqual(value1, value2) {
|
|
60
52
|
return !areDimensionsEqual(value1, value2);
|
|
61
53
|
}
|
|
62
54
|
/**
|
|
@@ -67,12 +59,12 @@ function areDimensionsNotEqual(value1, value2) {
|
|
|
67
59
|
* @param value2 - Second dimension value to compare
|
|
68
60
|
* @returns true if the values are approximately equal, false otherwise
|
|
69
61
|
*/
|
|
70
|
-
function areDimensionsEqual(value1, value2) {
|
|
71
|
-
return (Math.abs(
|
|
72
|
-
|
|
62
|
+
export function areDimensionsEqual(value1, value2) {
|
|
63
|
+
return (Math.abs(PixelRatio.getPixelSizeForLayoutSize(value1) -
|
|
64
|
+
PixelRatio.getPixelSizeForLayoutSize(value2)) <= 1);
|
|
73
65
|
}
|
|
74
|
-
function roundOffPixel(value) {
|
|
75
|
-
return
|
|
66
|
+
export function roundOffPixel(value) {
|
|
67
|
+
return PixelRatio.roundToNearestPixel(value);
|
|
76
68
|
}
|
|
77
69
|
/**
|
|
78
70
|
* Specific method for easier mocking
|
|
@@ -81,7 +73,7 @@ function roundOffPixel(value) {
|
|
|
81
73
|
* @param view - The React Native View component to measure
|
|
82
74
|
* @returns An object containing x, y, width, and height measurements
|
|
83
75
|
*/
|
|
84
|
-
function measureParentSize(view) {
|
|
76
|
+
export function measureParentSize(view) {
|
|
85
77
|
return measureLayout(view, undefined);
|
|
86
78
|
}
|
|
87
79
|
/**
|
|
@@ -91,7 +83,7 @@ function measureParentSize(view) {
|
|
|
91
83
|
* @param parentView
|
|
92
84
|
* @returns
|
|
93
85
|
*/
|
|
94
|
-
function measureFirstChildLayout(childContainerView, parentView) {
|
|
86
|
+
export function measureFirstChildLayout(childContainerView, parentView) {
|
|
95
87
|
return measureLayoutRelative(childContainerView, parentView, undefined);
|
|
96
88
|
}
|
|
97
89
|
/**
|
|
@@ -101,7 +93,7 @@ function measureFirstChildLayout(childContainerView, parentView) {
|
|
|
101
93
|
* @param oldLayout
|
|
102
94
|
* @returns
|
|
103
95
|
*/
|
|
104
|
-
function measureItemLayout(item, oldLayout) {
|
|
96
|
+
export function measureItemLayout(item, oldLayout) {
|
|
105
97
|
return measureLayout(item, oldLayout);
|
|
106
98
|
}
|
|
107
99
|
//# sourceMappingURL=measureLayout.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measureLayout.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/measureLayout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"measureLayout.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/measureLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,cAAc,CAAC;AAShD;;;;;;;GAOG;AACH,SAAS,aAAa,CAAC,IAAU,EAAE,SAA6B;IAC9D,wDAAwD;IACxD,8CAA8C;IAC9C,gDAAgD;IAChD,iBAAiB;IACjB,OAAO,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,qBAAqB,CAC5B,IAAU,EACV,UAAgB,EAChB,SAA6B;IAE7B,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACnD,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACrD,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,CAAC,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QACjC,CAAC;QACD,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,MAAc;IAClE,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,OAAO,CACL,IAAI,CAAC,GAAG,CACN,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC;QAC1C,UAAU,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAC/C,IAAI,CAAC,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,UAAU,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,OAAO,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,kBAAwB,EACxB,UAAgB;IAEhB,OAAO,qBAAqB,CAAC,kBAAkB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;AAC1E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAU,EACV,SAA6B;IAE7B,OAAO,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -1,47 +1,39 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.areDimensionsNotEqual = areDimensionsNotEqual;
|
|
4
|
-
exports.areDimensionsEqual = areDimensionsEqual;
|
|
5
|
-
exports.roundOffPixel = roundOffPixel;
|
|
6
|
-
exports.measureParentSize = measureParentSize;
|
|
7
|
-
exports.measureFirstChildLayout = measureFirstChildLayout;
|
|
8
|
-
exports.measureItemLayout = measureItemLayout;
|
|
9
1
|
/**
|
|
10
2
|
* Gets scroll offsets from up to 3 parent elements
|
|
11
3
|
*/
|
|
12
4
|
function getScrollOffsets(element, stopAt) {
|
|
13
5
|
var _a, _b;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
6
|
+
let scrollX = 0;
|
|
7
|
+
let scrollY = 0;
|
|
8
|
+
let currentElement = element;
|
|
17
9
|
// Only check up to 3 parent elements
|
|
18
10
|
while (currentElement && currentElement !== stopAt) {
|
|
19
|
-
|
|
11
|
+
const htmlElement = currentElement;
|
|
20
12
|
scrollX += (_a = htmlElement.scrollLeft) !== null && _a !== void 0 ? _a : 0;
|
|
21
13
|
scrollY += (_b = htmlElement.scrollTop) !== null && _b !== void 0 ? _b : 0;
|
|
22
14
|
currentElement = currentElement.parentElement;
|
|
23
15
|
}
|
|
24
|
-
return { scrollX
|
|
16
|
+
return { scrollX, scrollY };
|
|
25
17
|
}
|
|
26
18
|
/**
|
|
27
19
|
* Checks if two dimension values are not equal, with a small tolerance.
|
|
28
20
|
*/
|
|
29
|
-
function areDimensionsNotEqual(value1, value2) {
|
|
21
|
+
export function areDimensionsNotEqual(value1, value2) {
|
|
30
22
|
return !areDimensionsEqual(value1, value2);
|
|
31
23
|
}
|
|
32
24
|
/**
|
|
33
25
|
* Checks if two dimension values are equal, with a small tolerance.
|
|
34
26
|
*/
|
|
35
|
-
function areDimensionsEqual(value1, value2) {
|
|
27
|
+
export function areDimensionsEqual(value1, value2) {
|
|
36
28
|
return Math.abs(value1 - value2) <= 1;
|
|
37
29
|
}
|
|
38
|
-
function roundOffPixel(value) {
|
|
30
|
+
export function roundOffPixel(value) {
|
|
39
31
|
return value;
|
|
40
32
|
}
|
|
41
33
|
/**
|
|
42
34
|
* Measures the layout of parent of RecyclerView
|
|
43
35
|
*/
|
|
44
|
-
function measureParentSize(view) {
|
|
36
|
+
export function measureParentSize(view) {
|
|
45
37
|
return {
|
|
46
38
|
x: 0,
|
|
47
39
|
y: 0,
|
|
@@ -52,11 +44,11 @@ function measureParentSize(view) {
|
|
|
52
44
|
/**
|
|
53
45
|
* Measures the layout of child container of RecyclerView
|
|
54
46
|
*/
|
|
55
|
-
function measureFirstChildLayout(childContainerView, parentView) {
|
|
56
|
-
|
|
57
|
-
|
|
47
|
+
export function measureFirstChildLayout(childContainerView, parentView) {
|
|
48
|
+
const childRect = childContainerView.getBoundingClientRect();
|
|
49
|
+
const parentRect = parentView.getBoundingClientRect();
|
|
58
50
|
// Get scroll offsets for child container (max 3 parents)
|
|
59
|
-
|
|
51
|
+
const scrollOffsets = getScrollOffsets(childContainerView, parentView);
|
|
60
52
|
return {
|
|
61
53
|
x: childRect.left - parentRect.left + scrollOffsets.scrollX,
|
|
62
54
|
y: childRect.top - parentRect.top + scrollOffsets.scrollY,
|
|
@@ -67,8 +59,8 @@ function measureFirstChildLayout(childContainerView, parentView) {
|
|
|
67
59
|
/**
|
|
68
60
|
* Measures the layout of items of RecyclerView
|
|
69
61
|
*/
|
|
70
|
-
function measureItemLayout(item, oldLayout) {
|
|
71
|
-
|
|
62
|
+
export function measureItemLayout(item, oldLayout) {
|
|
63
|
+
const layout = {
|
|
72
64
|
x: 0,
|
|
73
65
|
y: 0,
|
|
74
66
|
width: item.clientWidth,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measureLayout.web.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/measureLayout.web.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"measureLayout.web.js","sourceRoot":"","sources":["../../../src/recyclerview/utils/measureLayout.web.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAgB,EAAE,MAAe;;IACzD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,cAAc,GAAmB,OAAO,CAAC;IAE7C,qCAAqC;IACrC,OAAO,cAAc,IAAI,cAAc,KAAK,MAAM,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,cAA6B,CAAC;QAClD,OAAO,IAAI,MAAA,WAAW,CAAC,UAAU,mCAAI,CAAC,CAAC;QACvC,OAAO,IAAI,MAAA,WAAW,CAAC,SAAS,mCAAI,CAAC,CAAC;QACtC,cAAc,GAAG,cAAc,CAAC,aAAa,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,MAAc;IAClE,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,MAAc;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC7C,OAAO;QACL,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,KAAK,EAAE,IAAI,CAAC,WAAW;QACvB,MAAM,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,kBAA2B,EAC3B,UAAmB;IAEnB,MAAM,SAAS,GAAG,kBAAkB,CAAC,qBAAqB,EAAE,CAAC;IAC7D,MAAM,UAAU,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC;IAEtD,yDAAyD;IACzD,MAAM,aAAa,GAAG,gBAAgB,CAAC,kBAAkB,EAAE,UAAU,CAAC,CAAC;IAEvE,OAAO;QACL,CAAC,EAAE,SAAS,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,GAAG,aAAa,CAAC,OAAO;QAC3D,CAAC,EAAE,SAAS,CAAC,GAAG,GAAG,UAAU,CAAC,GAAG,GAAG,aAAa,CAAC,OAAO;QACzD,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC;QACrC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC;KACxC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAa,EACb,SAA6B;IAE7B,MAAM,MAAM,GAAG;QACb,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,CAAC;QACJ,KAAK,EAAE,IAAI,CAAC,WAAW;QACvB,MAAM,EAAE,IAAI,CAAC,YAAY;KAC1B,CAAC;IAEF,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;QACjC,CAAC;QACD,IAAI,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;YACxD,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var ErrorMessages_1 = require("../../errors/ErrorMessages");
|
|
1
|
+
import { ErrorMessages } from "../../errors/ErrorMessages";
|
|
4
2
|
/**
|
|
5
3
|
* Helper class for computing viewable items based on the passed `viewabilityConfig`.
|
|
6
4
|
* Note methods in this class will be invoked on every scroll and should be optimized for performance.
|
|
7
5
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
class ViewabilityHelper {
|
|
7
|
+
constructor(viewabilityConfig, viewableIndicesChanged) {
|
|
10
8
|
/**
|
|
11
9
|
* Viewable indices regardless of the viewability config
|
|
12
10
|
*/
|
|
@@ -18,12 +16,11 @@ var ViewabilityHelper = /** @class */ (function () {
|
|
|
18
16
|
this.viewabilityConfig = viewabilityConfig;
|
|
19
17
|
this.viewableIndicesChanged = viewableIndicesChanged;
|
|
20
18
|
}
|
|
21
|
-
|
|
19
|
+
dispose() {
|
|
22
20
|
// Clean up on dismount
|
|
23
21
|
this.timers.forEach(clearTimeout);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
var _this = this;
|
|
22
|
+
}
|
|
23
|
+
updateViewableItems(horizontal, scrollOffset, listSize, getLayout, viewableIndices) {
|
|
27
24
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
28
25
|
if (viewableIndices !== undefined) {
|
|
29
26
|
this.possiblyViewableIndices = viewableIndices;
|
|
@@ -32,55 +29,52 @@ var ViewabilityHelper = /** @class */ (function () {
|
|
|
32
29
|
((_b = this.viewabilityConfig) === null || _b === void 0 ? void 0 : _b.itemVisiblePercentThreshold) !== undefined &&
|
|
33
30
|
((_c = this.viewabilityConfig) === null || _c === void 0 ? void 0 : _c.viewAreaCoveragePercentThreshold) !== null &&
|
|
34
31
|
((_d = this.viewabilityConfig) === null || _d === void 0 ? void 0 : _d.viewAreaCoveragePercentThreshold) !== undefined) {
|
|
35
|
-
throw new Error(
|
|
32
|
+
throw new Error(ErrorMessages.multipleViewabilityThresholdTypesNotSupported);
|
|
36
33
|
}
|
|
37
34
|
if (((_f = (_e = this.viewabilityConfig) === null || _e === void 0 ? void 0 : _e.waitForInteraction) !== null && _f !== void 0 ? _f : false) &&
|
|
38
35
|
!this.hasInteracted) {
|
|
39
36
|
return;
|
|
40
37
|
}
|
|
41
|
-
|
|
38
|
+
const newViewableIndices = this.possiblyViewableIndices.filter((index) => {
|
|
42
39
|
var _a, _b;
|
|
43
|
-
return
|
|
40
|
+
return this.isItemViewable(index, horizontal, scrollOffset, listSize, (_a = this.viewabilityConfig) === null || _a === void 0 ? void 0 : _a.viewAreaCoveragePercentThreshold, (_b = this.viewabilityConfig) === null || _b === void 0 ? void 0 : _b.itemVisiblePercentThreshold, getLayout);
|
|
44
41
|
});
|
|
45
42
|
this.viewableIndices = newViewableIndices;
|
|
46
|
-
|
|
43
|
+
const minimumViewTime = (_h = (_g = this.viewabilityConfig) === null || _g === void 0 ? void 0 : _g.minimumViewTime) !== null && _h !== void 0 ? _h : 250;
|
|
47
44
|
// Setting default to 250. Default of 0 can impact performance when user scrolls fast.
|
|
48
45
|
if (minimumViewTime > 0) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
const timeoutId = setTimeout(() => {
|
|
47
|
+
this.timers.delete(timeoutId);
|
|
48
|
+
this.checkViewableIndicesChanges(newViewableIndices);
|
|
52
49
|
}, minimumViewTime);
|
|
53
|
-
this.timers.add(
|
|
50
|
+
this.timers.add(timeoutId);
|
|
54
51
|
}
|
|
55
52
|
else {
|
|
56
53
|
this.checkViewableIndicesChanges(newViewableIndices);
|
|
57
54
|
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
var _this = this;
|
|
55
|
+
}
|
|
56
|
+
checkViewableIndicesChanges(newViewableIndices) {
|
|
61
57
|
// Check if all viewable indices are still available (applicable if minimumViewTime > 0)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
var newlyVisibleItems = currentlyNewViewableIndices.filter(function (index) { return !_this.lastReportedViewableIndices.includes(index); });
|
|
66
|
-
var newlyNonvisibleItems = this.lastReportedViewableIndices.filter(function (index) { return !currentlyNewViewableIndices.includes(index); });
|
|
58
|
+
const currentlyNewViewableIndices = newViewableIndices.filter((index) => this.viewableIndices.includes(index));
|
|
59
|
+
const newlyVisibleItems = currentlyNewViewableIndices.filter((index) => !this.lastReportedViewableIndices.includes(index));
|
|
60
|
+
const newlyNonvisibleItems = this.lastReportedViewableIndices.filter((index) => !currentlyNewViewableIndices.includes(index));
|
|
67
61
|
if (newlyVisibleItems.length > 0 || newlyNonvisibleItems.length > 0) {
|
|
68
62
|
this.lastReportedViewableIndices = currentlyNewViewableIndices;
|
|
69
63
|
this.viewableIndicesChanged(currentlyNewViewableIndices, newlyVisibleItems, newlyNonvisibleItems);
|
|
70
64
|
}
|
|
71
|
-
}
|
|
72
|
-
|
|
65
|
+
}
|
|
66
|
+
clearLastReportedViewableIndices() {
|
|
73
67
|
this.lastReportedViewableIndices = [];
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
|
|
68
|
+
}
|
|
69
|
+
isItemViewable(index, horizontal, scrollOffset, listSize, viewAreaCoveragePercentThreshold, itemVisiblePercentThreshold, getLayout) {
|
|
70
|
+
const itemLayout = getLayout(index);
|
|
77
71
|
if (itemLayout === undefined) {
|
|
78
72
|
return false;
|
|
79
73
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
74
|
+
const itemTop = (horizontal ? itemLayout.x : itemLayout.y) - scrollOffset;
|
|
75
|
+
const itemSize = horizontal ? itemLayout.width : itemLayout.height;
|
|
76
|
+
const listMainSize = horizontal ? listSize.width : listSize.height;
|
|
77
|
+
const pixelsVisible = Math.min(itemTop + itemSize, listMainSize) - Math.max(itemTop, 0);
|
|
84
78
|
// Always consider item fully viewable if it is fully visible, regardless of the `viewAreaCoveragePercentThreshold`
|
|
85
79
|
if (pixelsVisible === itemSize) {
|
|
86
80
|
return true;
|
|
@@ -89,17 +83,16 @@ var ViewabilityHelper = /** @class */ (function () {
|
|
|
89
83
|
if (pixelsVisible === 0) {
|
|
90
84
|
return false;
|
|
91
85
|
}
|
|
92
|
-
|
|
86
|
+
const viewAreaMode = viewAreaCoveragePercentThreshold !== null &&
|
|
93
87
|
viewAreaCoveragePercentThreshold !== undefined;
|
|
94
|
-
|
|
88
|
+
const percent = viewAreaMode
|
|
95
89
|
? pixelsVisible / listMainSize
|
|
96
90
|
: pixelsVisible / itemSize;
|
|
97
|
-
|
|
91
|
+
const viewableAreaPercentThreshold = viewAreaMode
|
|
98
92
|
? viewAreaCoveragePercentThreshold * 0.01
|
|
99
93
|
: (itemVisiblePercentThreshold !== null && itemVisiblePercentThreshold !== void 0 ? itemVisiblePercentThreshold : 0) * 0.01;
|
|
100
94
|
return percent >= viewableAreaPercentThreshold;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
exports.default = ViewabilityHelper;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
export default ViewabilityHelper;
|
|
105
98
|
//# sourceMappingURL=ViewabilityHelper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ViewabilityHelper.js","sourceRoot":"","sources":["../../../src/recyclerview/viewability/ViewabilityHelper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ViewabilityHelper.js","sourceRoot":"","sources":["../../../src/recyclerview/viewability/ViewabilityHelper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,107 +1,94 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
var tslib_1 = require("tslib");
|
|
4
|
-
var ViewabilityHelper_1 = tslib_1.__importDefault(require("./ViewabilityHelper"));
|
|
1
|
+
import ViewabilityHelper from "./ViewabilityHelper";
|
|
5
2
|
/**
|
|
6
3
|
* Manager for viewability tracking. It holds multiple viewability callback pairs and keeps them updated.
|
|
7
4
|
*/
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var _this = this;
|
|
5
|
+
export default class ViewabilityManager {
|
|
6
|
+
constructor(rvManager) {
|
|
11
7
|
var _a;
|
|
12
8
|
this.viewabilityHelpers = [];
|
|
13
9
|
this.hasInteracted = false;
|
|
14
|
-
this.dispose =
|
|
15
|
-
|
|
16
|
-
return viewabilityHelper.dispose();
|
|
17
|
-
});
|
|
10
|
+
this.dispose = () => {
|
|
11
|
+
this.viewabilityHelpers.forEach((viewabilityHelper) => viewabilityHelper.dispose());
|
|
18
12
|
};
|
|
19
|
-
this.onVisibleIndicesChanged =
|
|
20
|
-
|
|
13
|
+
this.onVisibleIndicesChanged = (all) => {
|
|
14
|
+
this.updateViewableItems(all);
|
|
21
15
|
};
|
|
22
|
-
this.recordInteraction =
|
|
23
|
-
if (
|
|
16
|
+
this.recordInteraction = () => {
|
|
17
|
+
if (this.hasInteracted) {
|
|
24
18
|
return;
|
|
25
19
|
}
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
this.hasInteracted = true;
|
|
21
|
+
this.viewabilityHelpers.forEach((viewabilityHelper) => {
|
|
28
22
|
viewabilityHelper.hasInteracted = true;
|
|
29
23
|
});
|
|
30
|
-
|
|
24
|
+
this.updateViewableItems();
|
|
31
25
|
};
|
|
32
|
-
this.updateViewableItems =
|
|
26
|
+
this.updateViewableItems = (newViewableIndices) => {
|
|
33
27
|
var _a;
|
|
34
|
-
|
|
35
|
-
if (listSize === undefined || !
|
|
28
|
+
const listSize = this.rvManager.getWindowSize();
|
|
29
|
+
if (listSize === undefined || !this.shouldListenToVisibleIndices) {
|
|
36
30
|
return;
|
|
37
31
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
const scrollOffset = ((_a = this.rvManager.getAbsoluteLastScrollOffset()) !== null && _a !== void 0 ? _a : 0) -
|
|
33
|
+
this.rvManager.firstItemOffset;
|
|
34
|
+
this.viewabilityHelpers.forEach((viewabilityHelper) => {
|
|
41
35
|
var _a;
|
|
42
|
-
viewabilityHelper.updateViewableItems((_a =
|
|
36
|
+
viewabilityHelper.updateViewableItems((_a = this.rvManager.props.horizontal) !== null && _a !== void 0 ? _a : false, scrollOffset, listSize, (index) => this.rvManager.getLayout(index), newViewableIndices);
|
|
43
37
|
});
|
|
44
38
|
};
|
|
45
|
-
this.recomputeViewableItems =
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
});
|
|
49
|
-
_this.updateViewableItems();
|
|
39
|
+
this.recomputeViewableItems = () => {
|
|
40
|
+
this.viewabilityHelpers.forEach((viewabilityHelper) => viewabilityHelper.clearLastReportedViewableIndices());
|
|
41
|
+
this.updateViewableItems();
|
|
50
42
|
};
|
|
51
43
|
/**
|
|
52
44
|
* Creates a new `ViewabilityHelper` instance with `onViewableItemsChanged` callback and `ViewabilityConfig`
|
|
53
45
|
* @returns `ViewabilityHelper` instance
|
|
54
46
|
*/
|
|
55
|
-
this.createViewabilityHelper =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
47
|
+
this.createViewabilityHelper = (viewabilityConfig, onViewableItemsChanged) => {
|
|
48
|
+
const mapViewToken = (index, isViewable) => {
|
|
49
|
+
const item = this.rvManager.props.data[index];
|
|
50
|
+
const key = item === undefined || this.rvManager.props.keyExtractor === undefined
|
|
59
51
|
? index.toString()
|
|
60
|
-
:
|
|
52
|
+
: this.rvManager.props.keyExtractor(item, index);
|
|
61
53
|
return {
|
|
62
|
-
index
|
|
63
|
-
isViewable
|
|
64
|
-
item
|
|
65
|
-
key
|
|
54
|
+
index,
|
|
55
|
+
isViewable,
|
|
56
|
+
item,
|
|
57
|
+
key,
|
|
66
58
|
timestamp: Date.now(),
|
|
67
59
|
};
|
|
68
60
|
};
|
|
69
|
-
return new
|
|
61
|
+
return new ViewabilityHelper(viewabilityConfig, (indices, newlyVisibleIndices, newlyNonvisibleIndices) => {
|
|
70
62
|
onViewableItemsChanged === null || onViewableItemsChanged === void 0 ? void 0 : onViewableItemsChanged({
|
|
71
|
-
viewableItems: indices.map(
|
|
72
|
-
changed:
|
|
73
|
-
|
|
74
|
-
|
|
63
|
+
viewableItems: indices.map((index) => mapViewToken(index, true)),
|
|
64
|
+
changed: [
|
|
65
|
+
...newlyVisibleIndices.map((index) => mapViewToken(index, true)),
|
|
66
|
+
...newlyNonvisibleIndices.map((index) => mapViewToken(index, false)),
|
|
67
|
+
],
|
|
75
68
|
});
|
|
76
69
|
});
|
|
77
70
|
};
|
|
78
71
|
this.rvManager = rvManager;
|
|
79
72
|
if (rvManager.props.onViewableItemsChanged !== null &&
|
|
80
73
|
rvManager.props.onViewableItemsChanged !== undefined) {
|
|
81
|
-
this.viewabilityHelpers.push(this.createViewabilityHelper(rvManager.props.viewabilityConfig,
|
|
74
|
+
this.viewabilityHelpers.push(this.createViewabilityHelper(rvManager.props.viewabilityConfig, (info) => {
|
|
82
75
|
var _a, _b;
|
|
83
76
|
(_b = (_a = rvManager.props).onViewableItemsChanged) === null || _b === void 0 ? void 0 : _b.call(_a, info);
|
|
84
77
|
}));
|
|
85
78
|
}
|
|
86
|
-
((_a = rvManager.props.viewabilityConfigCallbackPairs) !== null && _a !== void 0 ? _a : []).forEach(
|
|
87
|
-
|
|
79
|
+
((_a = rvManager.props.viewabilityConfigCallbackPairs) !== null && _a !== void 0 ? _a : []).forEach((pair, index) => {
|
|
80
|
+
this.viewabilityHelpers.push(this.createViewabilityHelper(pair.viewabilityConfig, (info) => {
|
|
88
81
|
var _a, _b;
|
|
89
|
-
|
|
82
|
+
const callback = (_b = (_a = rvManager.props.viewabilityConfigCallbackPairs) === null || _a === void 0 ? void 0 : _a[index]) === null || _b === void 0 ? void 0 : _b.onViewableItemsChanged;
|
|
90
83
|
callback === null || callback === void 0 ? void 0 : callback(info);
|
|
91
84
|
}));
|
|
92
85
|
});
|
|
93
86
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
enumerable: false,
|
|
102
|
-
configurable: true
|
|
103
|
-
});
|
|
104
|
-
return ViewabilityManager;
|
|
105
|
-
}());
|
|
106
|
-
exports.default = ViewabilityManager;
|
|
87
|
+
/**
|
|
88
|
+
* @returns true if the viewability manager has any viewability callback pairs registered.
|
|
89
|
+
*/
|
|
90
|
+
get shouldListenToVisibleIndices() {
|
|
91
|
+
return this.viewabilityHelpers.length > 0;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
107
94
|
//# sourceMappingURL=ViewabilityManager.js.map
|