@shopify/flash-list 2.0.0-alpha.8 → 2.0.0-rc.1
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/README.md +38 -98
- package/dist/AnimatedFlashList.d.ts.map +1 -1
- package/dist/AnimatedFlashList.js +3 -3
- package/dist/AnimatedFlashList.js.map +1 -1
- package/dist/FlashList.d.ts +9 -0
- package/dist/FlashList.d.ts.map +1 -1
- package/dist/FlashList.js +20 -0
- package/dist/FlashList.js.map +1 -1
- package/dist/FlashListProps.d.ts +15 -8
- package/dist/FlashListProps.d.ts.map +1 -1
- package/dist/FlashListProps.js.map +1 -1
- package/dist/FlashListRef.d.ts +305 -0
- package/dist/FlashListRef.d.ts.map +1 -0
- package/dist/FlashListRef.js +3 -0
- package/dist/FlashListRef.js.map +1 -0
- package/dist/MasonryFlashList.js.map +1 -1
- package/dist/__tests__/RecyclerView.test.js +63 -28
- package/dist/__tests__/RecyclerView.test.js.map +1 -1
- package/dist/__tests__/RenderStackManager.test.d.ts +2 -0
- package/dist/__tests__/RenderStackManager.test.d.ts.map +1 -0
- package/dist/__tests__/RenderStackManager.test.js +486 -0
- package/dist/__tests__/RenderStackManager.test.js.map +1 -0
- package/dist/__tests__/helpers/createLayoutManager.d.ts.map +1 -1
- package/dist/__tests__/helpers/createLayoutManager.js +3 -4
- package/dist/__tests__/helpers/createLayoutManager.js.map +1 -1
- package/dist/__tests__/useUnmountAwareCallbacks.test.js +1 -1
- package/dist/__tests__/useUnmountAwareCallbacks.test.js.map +1 -1
- package/dist/benchmark/useFlatListBenchmark.js +8 -7
- package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
- package/dist/enableNewCore.d.ts.map +1 -1
- package/dist/enableNewCore.js +2 -1
- package/dist/enableNewCore.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/native/config/PlatformHelper.android.d.ts +2 -0
- package/dist/native/config/PlatformHelper.android.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.android.js +2 -0
- package/dist/native/config/PlatformHelper.android.js.map +1 -1
- package/dist/native/config/PlatformHelper.d.ts +2 -0
- package/dist/native/config/PlatformHelper.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.ios.d.ts +2 -0
- package/dist/native/config/PlatformHelper.ios.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.ios.js +2 -0
- package/dist/native/config/PlatformHelper.ios.js.map +1 -1
- package/dist/native/config/PlatformHelper.js +2 -0
- package/dist/native/config/PlatformHelper.js.map +1 -1
- package/dist/native/config/PlatformHelper.web.d.ts +2 -0
- package/dist/native/config/PlatformHelper.web.d.ts.map +1 -1
- package/dist/native/config/PlatformHelper.web.js +3 -1
- package/dist/native/config/PlatformHelper.web.js.map +1 -1
- package/dist/recyclerview/RecyclerView.d.ts +2 -1
- package/dist/recyclerview/RecyclerView.d.ts.map +1 -1
- package/dist/recyclerview/RecyclerView.js +64 -37
- package/dist/recyclerview/RecyclerView.js.map +1 -1
- package/dist/recyclerview/RecyclerViewContextProvider.d.ts +6 -5
- package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -1
- package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -1
- package/dist/recyclerview/RecyclerViewManager.d.ts +21 -7
- package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -1
- package/dist/recyclerview/RecyclerViewManager.js +105 -113
- package/dist/recyclerview/RecyclerViewManager.js.map +1 -1
- package/dist/recyclerview/RenderStackManager.d.ts +85 -0
- package/dist/recyclerview/RenderStackManager.d.ts.map +1 -0
- package/dist/recyclerview/RenderStackManager.js +324 -0
- package/dist/recyclerview/RenderStackManager.js.map +1 -0
- package/dist/recyclerview/ViewHolder.d.ts.map +1 -1
- package/dist/recyclerview/ViewHolder.js +5 -3
- package/dist/recyclerview/ViewHolder.js.map +1 -1
- package/dist/recyclerview/ViewHolderCollection.d.ts +3 -1
- package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -1
- package/dist/recyclerview/ViewHolderCollection.js +23 -8
- package/dist/recyclerview/ViewHolderCollection.js.map +1 -1
- package/dist/recyclerview/components/ScrollAnchor.d.ts +2 -1
- package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -1
- package/dist/recyclerview/components/ScrollAnchor.js +9 -4
- package/dist/recyclerview/components/ScrollAnchor.js.map +1 -1
- package/dist/recyclerview/components/StickyHeaders.d.ts +1 -1
- package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -1
- package/dist/recyclerview/components/StickyHeaders.js +40 -32
- package/dist/recyclerview/components/StickyHeaders.js.map +1 -1
- package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +45 -1
- package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -1
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js +79 -20
- package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -1
- package/dist/recyclerview/helpers/RenderTimeTracker.d.ts +10 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.d.ts.map +1 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.js +39 -0
- package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -0
- package/dist/recyclerview/helpers/VelocityTracker.d.ts +29 -0
- package/dist/recyclerview/helpers/VelocityTracker.d.ts.map +1 -0
- package/dist/recyclerview/helpers/VelocityTracker.js +70 -0
- package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -0
- package/dist/recyclerview/hooks/useBoundDetection.d.ts +1 -2
- package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useBoundDetection.js +19 -16
- package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -1
- package/dist/recyclerview/hooks/useMappingHelper.d.ts +1 -1
- package/dist/recyclerview/hooks/useMappingHelper.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useMappingHelper.js +1 -1
- package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -1
- package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useOnLoad.js +4 -6
- package/dist/recyclerview/hooks/useOnLoad.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +3 -48
- package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewController.js +179 -119
- package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +2 -0
- package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useRecyclerViewManager.js +10 -1
- package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -1
- package/dist/recyclerview/hooks/useSecondaryProps.js +1 -1
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts +10 -3
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts.map +1 -1
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +33 -4
- package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -1
- package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +6 -0
- package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -1
- package/dist/recyclerview/layout-managers/GridLayoutManager.js +27 -5
- package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/LayoutManager.d.ts +10 -16
- package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -1
- package/dist/recyclerview/layout-managers/LayoutManager.js +4 -14
- package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -1
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +2 -2
- package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -1
- package/dist/recyclerview/utils/measureLayout.d.ts +1 -29
- package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -1
- package/dist/recyclerview/utils/measureLayout.js +2 -4
- package/dist/recyclerview/utils/measureLayout.js.map +1 -1
- package/dist/recyclerview/utils/measureLayout.web.d.ts +29 -0
- package/dist/recyclerview/utils/measureLayout.web.d.ts.map +1 -0
- package/dist/recyclerview/utils/measureLayout.web.js +89 -0
- package/dist/recyclerview/utils/measureLayout.web.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/viewability/ViewToken.d.ts +2 -2
- package/dist/viewability/ViewToken.d.ts.map +1 -1
- package/dist/viewability/ViewabilityHelper.js +1 -1
- package/dist/viewability/ViewabilityHelper.js.map +1 -1
- package/dist/viewability/ViewabilityManager.d.ts.map +1 -1
- package/dist/viewability/ViewabilityManager.js +1 -2
- package/dist/viewability/ViewabilityManager.js.map +1 -1
- package/jestSetup.js +30 -11
- package/package.json +2 -1
- package/src/AnimatedFlashList.ts +3 -2
- package/src/FlashList.tsx +24 -0
- package/src/FlashListProps.ts +20 -8
- package/src/FlashListRef.ts +320 -0
- package/src/MasonryFlashList.tsx +2 -2
- package/src/__tests__/RecyclerView.test.tsx +84 -30
- package/src/__tests__/RenderStackManager.test.ts +575 -0
- package/src/__tests__/helpers/createLayoutManager.ts +2 -3
- package/src/__tests__/useUnmountAwareCallbacks.test.tsx +12 -12
- package/src/benchmark/useFlatListBenchmark.ts +2 -2
- package/src/enableNewCore.ts +3 -1
- package/src/index.ts +1 -0
- package/src/native/config/PlatformHelper.android.ts +2 -0
- package/src/native/config/PlatformHelper.ios.ts +2 -0
- package/src/native/config/PlatformHelper.ts +2 -0
- package/src/native/config/PlatformHelper.web.ts +3 -1
- package/src/recyclerview/RecyclerView.tsx +85 -43
- package/src/recyclerview/RecyclerViewContextProvider.ts +12 -6
- package/src/recyclerview/RecyclerViewManager.ts +123 -98
- package/src/recyclerview/RenderStackManager.ts +291 -0
- package/src/recyclerview/ViewHolder.tsx +5 -3
- package/src/recyclerview/ViewHolderCollection.tsx +33 -12
- package/src/recyclerview/components/ScrollAnchor.tsx +21 -8
- package/src/recyclerview/components/StickyHeaders.tsx +63 -44
- package/src/recyclerview/helpers/EngagedIndicesTracker.ts +120 -23
- package/src/recyclerview/helpers/RenderTimeTracker.ts +38 -0
- package/src/recyclerview/helpers/VelocityTracker.ts +77 -0
- package/src/recyclerview/hooks/useBoundDetection.ts +25 -18
- package/src/recyclerview/hooks/useMappingHelper.ts +1 -1
- package/src/recyclerview/hooks/useOnLoad.ts +4 -6
- package/src/recyclerview/hooks/useRecyclerViewController.tsx +204 -173
- package/src/recyclerview/hooks/useRecyclerViewManager.ts +11 -1
- package/src/recyclerview/hooks/useSecondaryProps.tsx +1 -1
- package/src/recyclerview/hooks/useUnmountAwareCallbacks.ts +39 -3
- package/src/recyclerview/layout-managers/GridLayoutManager.ts +30 -7
- package/src/recyclerview/layout-managers/LayoutManager.ts +12 -21
- package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +1 -1
- package/src/recyclerview/utils/measureLayout.ts +3 -3
- package/src/recyclerview/utils/measureLayout.web.ts +104 -0
- package/src/viewability/ViewToken.ts +2 -2
- package/src/viewability/ViewabilityHelper.ts +1 -1
- package/src/viewability/ViewabilityManager.ts +6 -3
- package/dist/__tests__/RecycleKeyManager.test.d.ts +0 -2
- package/dist/__tests__/RecycleKeyManager.test.d.ts.map +0 -1
- package/dist/__tests__/RecycleKeyManager.test.js +0 -210
- package/dist/__tests__/RecycleKeyManager.test.js.map +0 -1
- package/dist/recyclerview/RecycleKeyManager.d.ts +0 -82
- package/dist/recyclerview/RecycleKeyManager.d.ts.map +0 -1
- package/dist/recyclerview/RecycleKeyManager.js +0 -135
- package/dist/recyclerview/RecycleKeyManager.js.map +0 -1
- package/src/__tests__/RecycleKeyManager.test.ts +0 -254
- package/src/recyclerview/RecycleKeyManager.ts +0 -185
|
@@ -12,30 +12,52 @@ var ViewHolder_1 = require("../ViewHolder");
|
|
|
12
12
|
var CompatView_1 = require("./CompatView");
|
|
13
13
|
var StickyHeaders = function (_a) {
|
|
14
14
|
var stickyHeaderIndices = _a.stickyHeaderIndices, renderItem = _a.renderItem, stickyHeaderRef = _a.stickyHeaderRef, recyclerViewManager = _a.recyclerViewManager, scrollY = _a.scrollY, data = _a.data, extraData = _a.extraData;
|
|
15
|
-
var _b = tslib_1.__read((0, react_1.useState)({
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
var _b = tslib_1.__read((0, react_1.useState)({
|
|
16
|
+
currentStickyIndex: -1,
|
|
17
|
+
pushStartsAt: Number.MAX_SAFE_INTEGER,
|
|
18
|
+
}), 2), stickyHeaderState = _b[0], setStickyHeaderState = _b[1];
|
|
19
|
+
var currentStickyIndex = stickyHeaderState.currentStickyIndex, pushStartsAt = stickyHeaderState.pushStartsAt;
|
|
20
|
+
// sort indices and memoize compute
|
|
18
21
|
var sortedIndices = (0, react_1.useMemo)(function () {
|
|
19
22
|
return stickyHeaderIndices.sort(function (first, second) { return first - second; });
|
|
20
23
|
}, [stickyHeaderIndices]);
|
|
24
|
+
var legthInvalid = sortedIndices.length === 0 ||
|
|
25
|
+
recyclerViewManager.getDataLength() <=
|
|
26
|
+
sortedIndices[sortedIndices.length - 1];
|
|
21
27
|
var compute = (0, react_1.useCallback)(function () {
|
|
22
|
-
var _a, _b;
|
|
23
|
-
|
|
28
|
+
var _a, _b, _c, _d, _e, _f;
|
|
29
|
+
if (legthInvalid) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
var adjustedScrollOffset = recyclerViewManager.getLastScrollOffset();
|
|
24
33
|
// Binary search for current sticky index
|
|
25
|
-
var currentIndexInArray = findCurrentStickyIndex(sortedIndices,
|
|
34
|
+
var currentIndexInArray = findCurrentStickyIndex(sortedIndices, adjustedScrollOffset, function (index) { return recyclerViewManager.getLayout(index).y; });
|
|
26
35
|
var newStickyIndex = (_a = sortedIndices[currentIndexInArray]) !== null && _a !== void 0 ? _a : -1;
|
|
27
36
|
var newNextStickyIndex = (_b = sortedIndices[currentIndexInArray + 1]) !== null && _b !== void 0 ? _b : -1;
|
|
28
37
|
if (newNextStickyIndex > recyclerViewManager.getEngagedIndices().endIndex) {
|
|
29
38
|
newNextStickyIndex = -1;
|
|
30
39
|
}
|
|
40
|
+
// To make sure header offset is 0 in the interpolate compute
|
|
41
|
+
var newNextStickyY = newNextStickyIndex === -1
|
|
42
|
+
? Number.MAX_SAFE_INTEGER
|
|
43
|
+
: ((_d = (_c = recyclerViewManager.tryGetLayout(newNextStickyIndex)) === null || _c === void 0 ? void 0 : _c.y) !== null && _d !== void 0 ? _d : 0) +
|
|
44
|
+
recyclerViewManager.firstItemOffset;
|
|
45
|
+
var newCurrentStickyHeight = (_f = (_e = recyclerViewManager.tryGetLayout(newStickyIndex)) === null || _e === void 0 ? void 0 : _e.height) !== null && _f !== void 0 ? _f : 0;
|
|
46
|
+
var newPushStartsAt = newNextStickyY - newCurrentStickyHeight;
|
|
31
47
|
if (newStickyIndex !== currentStickyIndex ||
|
|
32
|
-
|
|
33
|
-
|
|
48
|
+
newPushStartsAt !== pushStartsAt) {
|
|
49
|
+
setStickyHeaderState({
|
|
34
50
|
currentStickyIndex: newStickyIndex,
|
|
35
|
-
|
|
51
|
+
pushStartsAt: newPushStartsAt,
|
|
36
52
|
});
|
|
37
53
|
}
|
|
38
|
-
}, [
|
|
54
|
+
}, [
|
|
55
|
+
legthInvalid,
|
|
56
|
+
recyclerViewManager,
|
|
57
|
+
sortedIndices,
|
|
58
|
+
currentStickyIndex,
|
|
59
|
+
pushStartsAt,
|
|
60
|
+
]);
|
|
39
61
|
(0, react_1.useEffect)(function () {
|
|
40
62
|
compute();
|
|
41
63
|
}, [compute]);
|
|
@@ -46,40 +68,26 @@ var StickyHeaders = function (_a) {
|
|
|
46
68
|
},
|
|
47
69
|
}); }, [compute]);
|
|
48
70
|
var refHolder = (0, react_1.useRef)(new Map()).current;
|
|
49
|
-
// Memoize translateY calculation
|
|
50
71
|
var translateY = (0, react_1.useMemo)(function () {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
inputRange: [0, Infinity],
|
|
54
|
-
outputRange: [0, 0],
|
|
55
|
-
extrapolate: "clamp",
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
var currentLayout = recyclerViewManager.getLayout(currentStickyIndex);
|
|
59
|
-
var nextLayout = recyclerViewManager.getLayout(nextStickyIndex);
|
|
60
|
-
var pushStartsAt = nextLayout.y - currentLayout.height;
|
|
72
|
+
var _a, _b;
|
|
73
|
+
var currentStickyHeight = (_b = (_a = recyclerViewManager.tryGetLayout(currentStickyIndex)) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : 0;
|
|
61
74
|
return scrollY.interpolate({
|
|
62
|
-
inputRange: [
|
|
63
|
-
|
|
64
|
-
nextLayout.y + recyclerViewManager.firstItemOffset,
|
|
65
|
-
],
|
|
66
|
-
outputRange: [0, -currentLayout.height],
|
|
75
|
+
inputRange: [pushStartsAt, pushStartsAt + currentStickyHeight],
|
|
76
|
+
outputRange: [0, -currentStickyHeight],
|
|
67
77
|
extrapolate: "clamp",
|
|
68
78
|
});
|
|
69
|
-
}, [
|
|
79
|
+
}, [recyclerViewManager, currentStickyIndex, scrollY, pushStartsAt]);
|
|
70
80
|
// Memoize header content
|
|
71
81
|
var headerContent = (0, react_1.useMemo)(function () {
|
|
72
|
-
if (currentStickyIndex === -1)
|
|
73
|
-
return null;
|
|
74
82
|
return (react_1.default.createElement(CompatView_1.CompatAnimatedView, { style: {
|
|
75
83
|
position: "absolute",
|
|
76
84
|
top: 0,
|
|
77
85
|
left: 0,
|
|
78
86
|
right: 0,
|
|
87
|
+
zIndex: 1,
|
|
79
88
|
transform: [{ translateY: translateY }],
|
|
80
|
-
} },
|
|
81
|
-
|
|
82
|
-
}, [currentStickyIndex, data, renderItem, extraData, refHolder, translateY]);
|
|
89
|
+
} }, currentStickyIndex !== -1 ? (react_1.default.createElement(ViewHolder_1.ViewHolder, { index: currentStickyIndex, item: data[currentStickyIndex], renderItem: renderItem, layout: { x: 0, y: 0, width: 0, height: 0 }, refHolder: refHolder, extraData: extraData, trailingItem: null, target: "StickyHeader" })) : null));
|
|
90
|
+
}, [translateY, currentStickyIndex, data, renderItem, refHolder, extraData]);
|
|
83
91
|
return headerContent;
|
|
84
92
|
};
|
|
85
93
|
exports.StickyHeaders = StickyHeaders;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StickyHeaders.js","sourceRoot":"","sources":["../../../src/recyclerview/components/StickyHeaders.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;;;;AAEH,qDAOe;AAKf,4CAA2C;AAE3C,2CAAkD;
|
|
1
|
+
{"version":3,"file":"StickyHeaders.js","sourceRoot":"","sources":["../../../src/recyclerview/components/StickyHeaders.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;;;;AAEH,qDAOe;AAKf,4CAA2C;AAE3C,2CAAkD;AAoC3C,IAAM,aAAa,GAAG,UAAS,EAQX;QAPzB,mBAAmB,yBAAA,EACnB,UAAU,gBAAA,EACV,eAAe,qBAAA,EACf,mBAAmB,yBAAA,EACnB,OAAO,aAAA,EACP,IAAI,UAAA,EACJ,SAAS,eAAA;IAEH,IAAA,KAAA,eAA4C,IAAA,gBAAQ,EACxD;QACE,kBAAkB,EAAE,CAAC,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC,gBAAgB;KACtC,CACF,IAAA,EALM,iBAAiB,QAAA,EAAE,oBAAoB,QAK7C,CAAC;IAEM,IAAA,kBAAkB,GAAmB,iBAAiB,mBAApC,EAAE,YAAY,GAAK,iBAAiB,aAAtB,CAAuB;IAE/D,mCAAmC;IACnC,IAAM,aAAa,GAAG,IAAA,eAAO,EAAC;QAC5B,OAAO,mBAAmB,CAAC,IAAI,CAAC,UAAC,KAAK,EAAE,MAAM,IAAK,OAAA,KAAK,GAAG,MAAM,EAAd,CAAc,CAAC,CAAC;IACrE,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAE1B,IAAM,YAAY,GAChB,aAAa,CAAC,MAAM,KAAK,CAAC;QAC1B,mBAAmB,CAAC,aAAa,EAAE;YACjC,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE5C,IAAM,OAAO,GAAG,IAAA,mBAAW,EAAC;;QAC1B,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QACD,IAAM,oBAAoB,GAAG,mBAAmB,CAAC,mBAAmB,EAAE,CAAC;QAEvE,yCAAyC;QACzC,IAAM,mBAAmB,GAAG,sBAAsB,CAChD,aAAa,EACb,oBAAoB,EACpB,UAAC,KAAK,IAAK,OAAA,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAtC,CAAsC,CAClD,CAAC;QAEF,IAAM,cAAc,GAAG,MAAA,aAAa,CAAC,mBAAmB,CAAC,mCAAI,CAAC,CAAC,CAAC;QAChE,IAAI,kBAAkB,GAAG,MAAA,aAAa,CAAC,mBAAmB,GAAG,CAAC,CAAC,mCAAI,CAAC,CAAC,CAAC;QAEtE,IAAI,kBAAkB,GAAG,mBAAmB,CAAC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,CAAC;YAC1E,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC1B,CAAC;QAED,6DAA6D;QAC7D,IAAM,cAAc,GAClB,kBAAkB,KAAK,CAAC,CAAC;YACvB,CAAC,CAAC,MAAM,CAAC,gBAAgB;YACzB,CAAC,CAAC,CAAC,MAAA,MAAA,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAAC,0CAAE,CAAC,mCAAI,CAAC,CAAC;gBAC9D,mBAAmB,CAAC,eAAe,CAAC;QAC1C,IAAM,sBAAsB,GAC1B,MAAA,MAAA,mBAAmB,CAAC,YAAY,CAAC,cAAc,CAAC,0CAAE,MAAM,mCAAI,CAAC,CAAC;QAEhE,IAAM,eAAe,GAAG,cAAc,GAAG,sBAAsB,CAAC;QAEhE,IACE,cAAc,KAAK,kBAAkB;YACrC,eAAe,KAAK,YAAY,EAChC,CAAC;YACD,oBAAoB,CAAC;gBACnB,kBAAkB,EAAE,cAAc;gBAClC,YAAY,EAAE,eAAe;aAC9B,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EAAE;QACD,YAAY;QACZ,mBAAmB;QACnB,aAAa;QACb,kBAAkB;QAClB,YAAY;KACb,CAAC,CAAC;IAEH,IAAA,iBAAS,EAAC;QACR,OAAO,EAAE,CAAC;IACZ,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,uDAAuD;IACvD,IAAA,2BAAmB,EACjB,eAAe,EACf,cAAM,OAAA,CAAC;QACL,iBAAiB,EAAE;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC,EAJI,CAIJ,EACF,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAM,SAAS,GAAG,IAAA,cAAM,EAAC,IAAI,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC;IAE5C,IAAM,UAAU,GAAG,IAAA,eAAO,EAAC;;QACzB,IAAM,mBAAmB,GACvB,MAAA,MAAA,mBAAmB,CAAC,YAAY,CAAC,kBAAkB,CAAC,0CAAE,MAAM,mCAAI,CAAC,CAAC;QAEpE,OAAO,OAAO,CAAC,WAAW,CAAC;YACzB,UAAU,EAAE,CAAC,YAAY,EAAE,YAAY,GAAG,mBAAmB,CAAC;YAC9D,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC;YACtC,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;IAErE,yBAAyB;IACzB,IAAM,aAAa,GAAG,IAAA,eAAO,EAAC;QAC5B,OAAO,CACL,8BAAC,+BAAkB,IACjB,KAAK,EAAE;gBACL,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC;gBACN,IAAI,EAAE,CAAC;gBACP,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC,EAAE,UAAU,YAAA,EAAE,CAAC;aAC5B,IAEA,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAC3B,8BAAC,uBAAU,IACT,KAAK,EAAE,kBAAkB,EACzB,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAC9B,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAC3C,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,IAAI,EAClB,MAAM,EAAC,cAAc,GACrB,CACH,CAAC,CAAC,CAAC,IAAI,CACW,CACtB,CAAC;IACJ,CAAC,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAE7E,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAtIW,QAAA,aAAa,iBAsIxB;AAEF;;;;;;GAMG;AACH,SAAS,sBAAsB,CAC7B,aAAuB,EACvB,aAAqB,EACrB,IAA+B;IAE/B,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,IAAI,KAAK,GAAG,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAC;IAEhB,OAAO,IAAI,IAAI,KAAK,EAAE,CAAC;QACrB,IAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1C,IAAI,QAAQ,IAAI,aAAa,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,CAAC;YACb,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -3,6 +3,8 @@ import { ConsecutiveNumbers } from "./ConsecutiveNumbers";
|
|
|
3
3
|
export interface RVEngagedIndicesTracker {
|
|
4
4
|
scrollOffset: number;
|
|
5
5
|
drawDistance: number;
|
|
6
|
+
enableOffsetProjection: boolean;
|
|
7
|
+
averageRenderTime: number;
|
|
6
8
|
/**
|
|
7
9
|
* Updates the scroll offset and calculates which items should be rendered (engaged indices).
|
|
8
10
|
* @param offset - The new scroll offset position
|
|
@@ -11,9 +13,27 @@ export interface RVEngagedIndicesTracker {
|
|
|
11
13
|
* @returns New engaged indices if changed, undefined if no change
|
|
12
14
|
*/
|
|
13
15
|
updateScrollOffset: (offset: number, velocity: Velocity | null | undefined, layoutManager: RVLayoutManager) => ConsecutiveNumbers | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* Returns the currently engaged (rendered) indices.
|
|
18
|
+
* This includes both visible items and buffer items.
|
|
19
|
+
* @returns The last computed set of engaged indices
|
|
20
|
+
*/
|
|
14
21
|
getEngagedIndices: () => ConsecutiveNumbers;
|
|
22
|
+
/**
|
|
23
|
+
* Computes the visible indices in the viewport.
|
|
24
|
+
* @param layoutManager - Layout manager to fetch item positions and dimensions
|
|
25
|
+
* @returns Indices of items currently visible in the viewport
|
|
26
|
+
*/
|
|
15
27
|
computeVisibleIndices: (layoutManager: RVLayoutManager) => ConsecutiveNumbers;
|
|
28
|
+
/**
|
|
29
|
+
* Sets the scroll direction for velocity history tracking.
|
|
30
|
+
* @param scrollDirection - The direction of scrolling ("forward" or "backward")
|
|
31
|
+
*/
|
|
16
32
|
setScrollDirection: (scrollDirection: "forward" | "backward") => void;
|
|
33
|
+
/**
|
|
34
|
+
* Resets the velocity history based on the current scroll direction.
|
|
35
|
+
*/
|
|
36
|
+
resetVelocityHistory: () => void;
|
|
17
37
|
}
|
|
18
38
|
export interface Velocity {
|
|
19
39
|
x: number;
|
|
@@ -22,6 +42,9 @@ export interface Velocity {
|
|
|
22
42
|
export declare class RVEngagedIndicesTrackerImpl implements RVEngagedIndicesTracker {
|
|
23
43
|
scrollOffset: number;
|
|
24
44
|
drawDistance: number;
|
|
45
|
+
enableOffsetProjection: boolean;
|
|
46
|
+
averageRenderTime: number;
|
|
47
|
+
private forceDisableOffsetProjection;
|
|
25
48
|
private engagedIndices;
|
|
26
49
|
private smallMultiplier;
|
|
27
50
|
private largeMultiplier;
|
|
@@ -36,13 +59,29 @@ export declare class RVEngagedIndicesTrackerImpl implements RVEngagedIndicesTrac
|
|
|
36
59
|
* 4. Returns new indices that need to be rendered
|
|
37
60
|
*/
|
|
38
61
|
updateScrollOffset(offset: number, velocity: Velocity | null | undefined, layoutManager: RVLayoutManager): ConsecutiveNumbers | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* Updates the velocity history with a new velocity value.
|
|
64
|
+
* @param velocity - Current scroll velocity component (x or y)
|
|
65
|
+
*/
|
|
66
|
+
private updateVelocityHistory;
|
|
39
67
|
/**
|
|
40
68
|
* Determines scroll direction by analyzing recent velocity history.
|
|
41
69
|
* Uses a majority voting system on the last 5 velocity values.
|
|
42
|
-
* @param velocity - Current scroll velocity component (x or y)
|
|
43
70
|
* @returns true if scrolling backward (negative direction), false otherwise
|
|
44
71
|
*/
|
|
45
72
|
private isScrollingBackward;
|
|
73
|
+
/**
|
|
74
|
+
* Calculates the median velocity based on velocity history
|
|
75
|
+
* Medina works better agains outliers
|
|
76
|
+
* @returns Median velocity over the recent history
|
|
77
|
+
*/
|
|
78
|
+
private getMedianVelocity;
|
|
79
|
+
/**
|
|
80
|
+
* Projects the next scroll offset based on median velocity
|
|
81
|
+
* @param timeMs Time in milliseconds to predict ahead
|
|
82
|
+
* @returns Projected scroll offset
|
|
83
|
+
*/
|
|
84
|
+
private getProjectedScrollOffset;
|
|
46
85
|
/**
|
|
47
86
|
* Calculates which items are currently visible in the viewport.
|
|
48
87
|
* Unlike getEngagedIndices, this doesn't include buffer items.
|
|
@@ -57,5 +96,10 @@ export declare class RVEngagedIndicesTrackerImpl implements RVEngagedIndicesTrac
|
|
|
57
96
|
*/
|
|
58
97
|
getEngagedIndices(): ConsecutiveNumbers;
|
|
59
98
|
setScrollDirection(scrollDirection: "forward" | "backward"): void;
|
|
99
|
+
/**
|
|
100
|
+
* Resets the velocity history based on the current scroll direction.
|
|
101
|
+
* This ensures that the velocity history is always in sync with the current scroll direction.
|
|
102
|
+
*/
|
|
103
|
+
resetVelocityHistory(): void;
|
|
60
104
|
}
|
|
61
105
|
//# sourceMappingURL=EngagedIndicesTracker.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EngagedIndicesTracker.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EngagedIndicesTracker.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IAEtC,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;IAErB,sBAAsB,EAAE,OAAO,CAAC;IAEhC,iBAAiB,EAAE,MAAM,CAAC;IAE1B;;;;;;OAMG;IACH,kBAAkB,EAAE,CAClB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACrC,aAAa,EAAE,eAAe,KAC3B,kBAAkB,GAAG,SAAS,CAAC;IAEpC;;;;OAIG;IACH,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;IAE5C;;;;OAIG;IACH,qBAAqB,EAAE,CAAC,aAAa,EAAE,eAAe,KAAK,kBAAkB,CAAC;IAE9E;;;OAGG;IACH,kBAAkB,EAAE,CAAC,eAAe,EAAE,SAAS,GAAG,UAAU,KAAK,IAAI,CAAC;IAEtE;;OAEG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,qBAAa,2BAA4B,YAAW,uBAAuB;IAElE,YAAY,SAAK;IAEjB,YAAY,SAAsC;IAGlD,sBAAsB,UAAQ;IAG9B,iBAAiB,SAAM;IAG9B,OAAO,CAAC,4BAA4B,CAAS;IAG7C,OAAO,CAAC,cAAc,CAA4B;IAGlD,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,eAAe,CAAO;IAG9B,OAAO,CAAC,eAAe,CAAyB;IAChD,OAAO,CAAC,aAAa,CAAK;IAE1B;;;;;;;OAOG;IACH,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,GAAG,IAAI,GAAG,SAAS,EACrC,aAAa,EAAE,eAAe,GAC7B,kBAAkB,GAAG,SAAS;IAuFjC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAK7B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAiBzB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAOhC;;;;;OAKG;IACH,qBAAqB,CAAC,aAAa,EAAE,eAAe,GAAG,kBAAkB;IAiBzE;;;;OAIG;IACH,iBAAiB,IAAI,kBAAkB;IAIvC,kBAAkB,CAAC,eAAe,EAAE,SAAS,GAAG,UAAU;IAU1D;;;OAGG;IACH,oBAAoB;CAOrB"}
|
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RVEngagedIndicesTrackerImpl = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var PlatformHelper_1 = require("../../native/config/PlatformHelper");
|
|
4
6
|
var ConsecutiveNumbers_1 = require("./ConsecutiveNumbers");
|
|
5
7
|
var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
6
8
|
function RVEngagedIndicesTrackerImpl() {
|
|
7
9
|
// Current scroll position of the list
|
|
8
10
|
this.scrollOffset = 0;
|
|
9
11
|
// Distance to pre-render items before and after the visible viewport (in pixels)
|
|
10
|
-
this.drawDistance =
|
|
12
|
+
this.drawDistance = PlatformHelper_1.PlatformConfig.defaultDrawDistance;
|
|
13
|
+
// Whether to use offset projection to predict the next scroll offset
|
|
14
|
+
this.enableOffsetProjection = true;
|
|
15
|
+
// Average render time of the list
|
|
16
|
+
this.averageRenderTime = 16;
|
|
17
|
+
// Internal override to disable offset projection
|
|
18
|
+
this.forceDisableOffsetProjection = false;
|
|
11
19
|
// Currently rendered item indices (including buffer items)
|
|
12
20
|
this.engagedIndices = ConsecutiveNumbers_1.ConsecutiveNumbers.EMPTY;
|
|
13
21
|
// Buffer distribution multipliers for scroll direction optimization
|
|
14
|
-
this.smallMultiplier = 0.
|
|
15
|
-
this.largeMultiplier = 0.
|
|
22
|
+
this.smallMultiplier = 0.3; // Used for buffer in the opposite direction of scroll
|
|
23
|
+
this.largeMultiplier = 0.7; // Used for buffer in the direction of scroll
|
|
16
24
|
// Circular buffer to track recent scroll velocities for direction detection
|
|
17
|
-
this.velocityHistory = [
|
|
25
|
+
this.velocityHistory = [0, 0, 0, -0.1, -0.1];
|
|
18
26
|
this.velocityIndex = 0;
|
|
19
27
|
}
|
|
20
28
|
/**
|
|
@@ -31,14 +39,21 @@ var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
|
31
39
|
// STEP 1: Determine the currently visible viewport
|
|
32
40
|
var windowSize = layoutManager.getWindowsSize();
|
|
33
41
|
var isHorizontal = layoutManager.isHorizontal();
|
|
34
|
-
|
|
42
|
+
// Update velocity history
|
|
43
|
+
if (velocity) {
|
|
44
|
+
this.updateVelocityHistory(isHorizontal ? velocity.x : velocity.y);
|
|
45
|
+
}
|
|
46
|
+
// Determine scroll direction to optimize buffer distribution
|
|
47
|
+
var isScrollingBackward = this.isScrollingBackward();
|
|
48
|
+
var viewportStart = this.enableOffsetProjection && !this.forceDisableOffsetProjection
|
|
49
|
+
? this.getProjectedScrollOffset(offset, this.averageRenderTime)
|
|
50
|
+
: offset;
|
|
51
|
+
// console.log("timeMs", this.averageRenderTime, offset, viewportStart);
|
|
35
52
|
var viewportSize = isHorizontal ? windowSize.width : windowSize.height;
|
|
36
53
|
var viewportEnd = viewportStart + viewportSize;
|
|
37
54
|
// STEP 2: Determine buffer size and distribution
|
|
38
55
|
// The total extra space where items will be pre-rendered
|
|
39
56
|
var totalBuffer = this.drawDistance * 2;
|
|
40
|
-
// Determine scroll direction to optimize buffer distribution
|
|
41
|
-
var isScrollingBackward = this.isScrollingBackward(isHorizontal ? velocity === null || velocity === void 0 ? void 0 : velocity.x : velocity === null || velocity === void 0 ? void 0 : velocity.y);
|
|
42
57
|
// Distribute more buffer in the direction of scrolling
|
|
43
58
|
// When scrolling forward: more buffer after viewport
|
|
44
59
|
// When scrolling backward: more buffer before viewport
|
|
@@ -71,9 +86,12 @@ var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
|
71
86
|
}
|
|
72
87
|
// STEP 5: Get and return the new engaged indices
|
|
73
88
|
var newEngagedIndices = layoutManager.getVisibleLayouts(extendedStart, extendedEnd);
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
89
|
+
// console.log(
|
|
90
|
+
// "newEngagedIndices",
|
|
91
|
+
// newEngagedIndices,
|
|
92
|
+
// this.scrollOffset,
|
|
93
|
+
// viewportStart
|
|
94
|
+
// );
|
|
77
95
|
// Only return new indices if they've changed
|
|
78
96
|
var oldEngagedIndices = this.engagedIndices;
|
|
79
97
|
this.engagedIndices = newEngagedIndices;
|
|
@@ -81,19 +99,20 @@ var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
|
81
99
|
? undefined
|
|
82
100
|
: newEngagedIndices;
|
|
83
101
|
};
|
|
102
|
+
/**
|
|
103
|
+
* Updates the velocity history with a new velocity value.
|
|
104
|
+
* @param velocity - Current scroll velocity component (x or y)
|
|
105
|
+
*/
|
|
106
|
+
RVEngagedIndicesTrackerImpl.prototype.updateVelocityHistory = function (velocity) {
|
|
107
|
+
this.velocityHistory[this.velocityIndex] = velocity;
|
|
108
|
+
this.velocityIndex = (this.velocityIndex + 1) % this.velocityHistory.length;
|
|
109
|
+
};
|
|
84
110
|
/**
|
|
85
111
|
* Determines scroll direction by analyzing recent velocity history.
|
|
86
112
|
* Uses a majority voting system on the last 5 velocity values.
|
|
87
|
-
* @param velocity - Current scroll velocity component (x or y)
|
|
88
113
|
* @returns true if scrolling backward (negative direction), false otherwise
|
|
89
114
|
*/
|
|
90
|
-
RVEngagedIndicesTrackerImpl.prototype.isScrollingBackward = function (
|
|
91
|
-
// update velocity history
|
|
92
|
-
if (velocity) {
|
|
93
|
-
this.velocityHistory[this.velocityIndex] = velocity;
|
|
94
|
-
this.velocityIndex =
|
|
95
|
-
(this.velocityIndex + 1) % this.velocityHistory.length;
|
|
96
|
-
}
|
|
115
|
+
RVEngagedIndicesTrackerImpl.prototype.isScrollingBackward = function () {
|
|
97
116
|
// should decide based on whether we have more positive or negative values, use for loop
|
|
98
117
|
var positiveCount = 0;
|
|
99
118
|
var negativeCount = 0;
|
|
@@ -108,6 +127,34 @@ var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
|
108
127
|
}
|
|
109
128
|
return positiveCount < negativeCount;
|
|
110
129
|
};
|
|
130
|
+
/**
|
|
131
|
+
* Calculates the median velocity based on velocity history
|
|
132
|
+
* Medina works better agains outliers
|
|
133
|
+
* @returns Median velocity over the recent history
|
|
134
|
+
*/
|
|
135
|
+
RVEngagedIndicesTrackerImpl.prototype.getMedianVelocity = function () {
|
|
136
|
+
// Make a copy of velocity history and sort it
|
|
137
|
+
var sortedVelocities = tslib_1.__spreadArray([], tslib_1.__read(this.velocityHistory), false).sort(function (valueA, valueB) { return valueA - valueB; });
|
|
138
|
+
var length = sortedVelocities.length;
|
|
139
|
+
// If length is odd, return the middle element
|
|
140
|
+
if (length % 2 === 1) {
|
|
141
|
+
return sortedVelocities[Math.floor(length / 2)];
|
|
142
|
+
}
|
|
143
|
+
// If length is even, return the average of the two middle elements
|
|
144
|
+
var midIndex = length / 2;
|
|
145
|
+
return (sortedVelocities[midIndex - 1] + sortedVelocities[midIndex]) / 2;
|
|
146
|
+
};
|
|
147
|
+
/**
|
|
148
|
+
* Projects the next scroll offset based on median velocity
|
|
149
|
+
* @param timeMs Time in milliseconds to predict ahead
|
|
150
|
+
* @returns Projected scroll offset
|
|
151
|
+
*/
|
|
152
|
+
RVEngagedIndicesTrackerImpl.prototype.getProjectedScrollOffset = function (offset, timeMs) {
|
|
153
|
+
var medianVelocity = this.getMedianVelocity();
|
|
154
|
+
// Convert time from ms to seconds for velocity calculation
|
|
155
|
+
// Predict next position: current position + (velocity * time)
|
|
156
|
+
return offset + medianVelocity * timeMs;
|
|
157
|
+
};
|
|
111
158
|
/**
|
|
112
159
|
* Calculates which items are currently visible in the viewport.
|
|
113
160
|
* Unlike getEngagedIndices, this doesn't include buffer items.
|
|
@@ -135,14 +182,26 @@ var RVEngagedIndicesTrackerImpl = /** @class */ (function () {
|
|
|
135
182
|
};
|
|
136
183
|
RVEngagedIndicesTrackerImpl.prototype.setScrollDirection = function (scrollDirection) {
|
|
137
184
|
if (scrollDirection === "forward") {
|
|
138
|
-
this.velocityHistory = [
|
|
185
|
+
this.velocityHistory = [0, 0, 0, 0.1, 0.1];
|
|
139
186
|
this.velocityIndex = 0;
|
|
140
187
|
}
|
|
141
188
|
else {
|
|
142
|
-
this.velocityHistory = [
|
|
189
|
+
this.velocityHistory = [0, 0, 0, -0.1, -0.1];
|
|
143
190
|
this.velocityIndex = 0;
|
|
144
191
|
}
|
|
145
192
|
};
|
|
193
|
+
/**
|
|
194
|
+
* Resets the velocity history based on the current scroll direction.
|
|
195
|
+
* This ensures that the velocity history is always in sync with the current scroll direction.
|
|
196
|
+
*/
|
|
197
|
+
RVEngagedIndicesTrackerImpl.prototype.resetVelocityHistory = function () {
|
|
198
|
+
if (this.isScrollingBackward()) {
|
|
199
|
+
this.setScrollDirection("backward");
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
this.setScrollDirection("forward");
|
|
203
|
+
}
|
|
204
|
+
};
|
|
146
205
|
return RVEngagedIndicesTrackerImpl;
|
|
147
206
|
}());
|
|
148
207
|
exports.RVEngagedIndicesTrackerImpl = RVEngagedIndicesTrackerImpl;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EngagedIndicesTracker.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EngagedIndicesTracker.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare class RenderTimeTracker {
|
|
2
|
+
private renderTimeAvgWindow;
|
|
3
|
+
private lastTimerStartedAt;
|
|
4
|
+
private maxRenderTime;
|
|
5
|
+
private defaultRenderTime;
|
|
6
|
+
startTracking(): void;
|
|
7
|
+
markRenderComplete(): void;
|
|
8
|
+
getAverageRenderTime(): number;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=RenderTimeTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderTimeTracker.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/helpers/RenderTimeTracker.ts"],"names":[],"mappings":"AAGA,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,mBAAmB,CAAwB;IACnD,OAAO,CAAC,kBAAkB,CAAM;IAChC,OAAO,CAAC,aAAa,CAAM;IAC3B,OAAO,CAAC,iBAAiB,CAAM;IAE/B,aAAa;IASb,kBAAkB;IAUlB,oBAAoB;CASrB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RenderTimeTracker = void 0;
|
|
4
|
+
var PlatformHelper_1 = require("../../native/config/PlatformHelper");
|
|
5
|
+
var AverageWindow_1 = require("../../utils/AverageWindow");
|
|
6
|
+
var RenderTimeTracker = /** @class */ (function () {
|
|
7
|
+
function RenderTimeTracker() {
|
|
8
|
+
this.renderTimeAvgWindow = new AverageWindow_1.AverageWindow(5);
|
|
9
|
+
this.lastTimerStartedAt = -1;
|
|
10
|
+
this.maxRenderTime = 32; // TODO: Improve this even more
|
|
11
|
+
this.defaultRenderTime = 16;
|
|
12
|
+
}
|
|
13
|
+
RenderTimeTracker.prototype.startTracking = function () {
|
|
14
|
+
if (!PlatformHelper_1.PlatformConfig.trackAverageRenderTimeForOffsetProjection) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
if (this.lastTimerStartedAt === -1) {
|
|
18
|
+
this.lastTimerStartedAt = Date.now();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
RenderTimeTracker.prototype.markRenderComplete = function () {
|
|
22
|
+
if (!PlatformHelper_1.PlatformConfig.trackAverageRenderTimeForOffsetProjection) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (this.lastTimerStartedAt !== -1) {
|
|
26
|
+
this.renderTimeAvgWindow.addValue(Date.now() - this.lastTimerStartedAt);
|
|
27
|
+
this.lastTimerStartedAt = -1;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
RenderTimeTracker.prototype.getAverageRenderTime = function () {
|
|
31
|
+
if (!PlatformHelper_1.PlatformConfig.trackAverageRenderTimeForOffsetProjection) {
|
|
32
|
+
return this.defaultRenderTime;
|
|
33
|
+
}
|
|
34
|
+
return Math.min(this.maxRenderTime, Math.max(Math.round(this.renderTimeAvgWindow.currentValue), 16));
|
|
35
|
+
};
|
|
36
|
+
return RenderTimeTracker;
|
|
37
|
+
}());
|
|
38
|
+
exports.RenderTimeTracker = RenderTimeTracker;
|
|
39
|
+
//# sourceMappingURL=RenderTimeTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RenderTimeTracker.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/RenderTimeTracker.ts"],"names":[],"mappings":";;;AAAA,qEAAoE;AACpE,2DAA0D;AAE1D;IAAA;QACU,wBAAmB,GAAG,IAAI,6BAAa,CAAC,CAAC,CAAC,CAAC;QAC3C,uBAAkB,GAAG,CAAC,CAAC,CAAC;QACxB,kBAAa,GAAG,EAAE,CAAC,CAAC,+BAA+B;QACnD,sBAAiB,GAAG,EAAE,CAAC;IA8BjC,CAAC;IA5BC,yCAAa,GAAb;QACE,IAAI,CAAC,+BAAc,CAAC,yCAAyC,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAED,8CAAkB,GAAlB;QACE,IAAI,CAAC,+BAAc,CAAC,yCAAyC,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,kBAAkB,KAAK,CAAC,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC;YACxE,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,gDAAoB,GAApB;QACE,IAAI,CAAC,+BAAc,CAAC,yCAAyC,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CACb,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC,CAChE,CAAC;IACJ,CAAC;IACH,wBAAC;AAAD,CAAC,AAlCD,IAkCC;AAlCY,8CAAiB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks and calculates velocity for scroll/drag movements
|
|
3
|
+
* Used to determine momentum scrolling behavior
|
|
4
|
+
*/
|
|
5
|
+
export declare class VelocityTracker<T> {
|
|
6
|
+
/** Timestamp of the last velocity update */
|
|
7
|
+
private lastUpdateTime;
|
|
8
|
+
/** Current velocity vector with x and y components */
|
|
9
|
+
private velocity;
|
|
10
|
+
/** Reference to the momentum end timeout */
|
|
11
|
+
private timeoutId;
|
|
12
|
+
/**
|
|
13
|
+
* Calculates velocity based on position change over time
|
|
14
|
+
* @param newOffset Current position value
|
|
15
|
+
* @param oldOffset Previous position value
|
|
16
|
+
* @param isHorizontal Whether movement is horizontal (true) or vertical (false)
|
|
17
|
+
* @param isRTL Whether layout direction is right-to-left
|
|
18
|
+
* @param callback Function to call with velocity updates and momentum end signal
|
|
19
|
+
*/
|
|
20
|
+
computeVelocity(newOffset: number, oldOffset: number, isHorizontal: boolean, callback: (velocity: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
}, isMomentumEnd: boolean) => void): void;
|
|
24
|
+
/**
|
|
25
|
+
* Cleans up resources by clearing any pending timeout
|
|
26
|
+
*/
|
|
27
|
+
cleanUp(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=VelocityTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VelocityTracker.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/helpers/VelocityTracker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAe,CAAC,CAAC;IAC5B,4CAA4C;IAC5C,OAAO,CAAC,cAAc,CAAc;IACpC,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAkB;IAElC,4CAA4C;IAC5C,OAAO,CAAC,SAAS,CAA+B;IAEhD;;;;;;;OAOG;IACH,eAAe,CACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,OAAO,EACrB,QAAQ,EAAE,CACR,QAAQ,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAClC,aAAa,EAAE,OAAO,KACnB,IAAI;IAuCX;;OAEG;IACH,OAAO;CAMR"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.VelocityTracker = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Tracks and calculates velocity for scroll/drag movements
|
|
6
|
+
* Used to determine momentum scrolling behavior
|
|
7
|
+
*/
|
|
8
|
+
var VelocityTracker = /** @class */ (function () {
|
|
9
|
+
function VelocityTracker() {
|
|
10
|
+
/** Timestamp of the last velocity update */
|
|
11
|
+
this.lastUpdateTime = Date.now();
|
|
12
|
+
/** Current velocity vector with x and y components */
|
|
13
|
+
this.velocity = { x: 0, y: 0 };
|
|
14
|
+
/** Reference to the momentum end timeout */
|
|
15
|
+
this.timeoutId = null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Calculates velocity based on position change over time
|
|
19
|
+
* @param newOffset Current position value
|
|
20
|
+
* @param oldOffset Previous position value
|
|
21
|
+
* @param isHorizontal Whether movement is horizontal (true) or vertical (false)
|
|
22
|
+
* @param isRTL Whether layout direction is right-to-left
|
|
23
|
+
* @param callback Function to call with velocity updates and momentum end signal
|
|
24
|
+
*/
|
|
25
|
+
VelocityTracker.prototype.computeVelocity = function (newOffset, oldOffset, isHorizontal, callback) {
|
|
26
|
+
var _this = this;
|
|
27
|
+
// Clear any pending momentum end timeout
|
|
28
|
+
this.cleanUp();
|
|
29
|
+
// Calculate time since last update
|
|
30
|
+
var currentTime = Date.now();
|
|
31
|
+
var timeSinceLastUpdate = Math.max(1, currentTime - this.lastUpdateTime);
|
|
32
|
+
// Calculate velocity as distance/time
|
|
33
|
+
var newVelocity = (newOffset - oldOffset) / timeSinceLastUpdate;
|
|
34
|
+
// console.log(
|
|
35
|
+
// "newVelocity",
|
|
36
|
+
// newOffset,
|
|
37
|
+
// oldOffset,
|
|
38
|
+
// currentTime,
|
|
39
|
+
// this.lastUpdateTime,
|
|
40
|
+
// timeSinceLastUpdate,
|
|
41
|
+
// newVelocity
|
|
42
|
+
// );
|
|
43
|
+
this.lastUpdateTime = currentTime;
|
|
44
|
+
// Apply velocity to the correct axis
|
|
45
|
+
this.velocity.x = isHorizontal ? newVelocity : 0;
|
|
46
|
+
this.velocity.y = isHorizontal ? 0 : newVelocity;
|
|
47
|
+
// Trigger callback with current velocity
|
|
48
|
+
callback(this.velocity, false);
|
|
49
|
+
// Set timeout to signal momentum end after 100ms of no updates
|
|
50
|
+
this.timeoutId = setTimeout(function () {
|
|
51
|
+
_this.cleanUp();
|
|
52
|
+
_this.lastUpdateTime = Date.now();
|
|
53
|
+
_this.velocity.x = 0;
|
|
54
|
+
_this.velocity.y = 0;
|
|
55
|
+
callback(_this.velocity, true);
|
|
56
|
+
}, 100);
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Cleans up resources by clearing any pending timeout
|
|
60
|
+
*/
|
|
61
|
+
VelocityTracker.prototype.cleanUp = function () {
|
|
62
|
+
if (this.timeoutId !== null) {
|
|
63
|
+
clearTimeout(this.timeoutId);
|
|
64
|
+
this.timeoutId = null;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
return VelocityTracker;
|
|
68
|
+
}());
|
|
69
|
+
exports.VelocityTracker = VelocityTracker;
|
|
70
|
+
//# sourceMappingURL=VelocityTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VelocityTracker.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/VelocityTracker.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH;IAAA;QACE,4CAA4C;QACpC,mBAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACpC,sDAAsD;QAC9C,aAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAElC,4CAA4C;QACpC,cAAS,GAA0B,IAAI,CAAC;IAiElD,CAAC;IA/DC;;;;;;;OAOG;IACH,yCAAe,GAAf,UACE,SAAiB,EACjB,SAAiB,EACjB,YAAqB,EACrB,QAGS;QAPX,iBA4CC;QAnCC,yCAAyC;QACzC,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,mCAAmC;QACnC,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC/B,IAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAE3E,sCAAsC;QACtC,IAAM,WAAW,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,mBAAmB,CAAC;QAElE,eAAe;QACf,mBAAmB;QACnB,eAAe;QACf,eAAe;QACf,iBAAiB;QACjB,yBAAyB;QACzB,yBAAyB;QACzB,gBAAgB;QAChB,KAAK;QACL,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC;QAElC,qCAAqC;QACrC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAEjD,yCAAyC;QACzC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE/B,+DAA+D;QAC/D,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC;YAC1B,KAAI,CAAC,OAAO,EAAE,CAAC;YACf,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACjC,KAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,KAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;YACpB,QAAQ,CAAC,KAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC,EAAE,GAAG,CAAC,CAAC;IACV,CAAC;IAED;;OAEG;IACH,iCAAO,GAAP;QACE,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;YAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;IACH,CAAC;IACH,sBAAC;AAAD,CAAC,AAxED,IAwEC;AAxEY,0CAAe"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { RecyclerViewManager } from "../RecyclerViewManager";
|
|
2
|
-
import { RecyclerViewProps } from "../RecyclerViewProps";
|
|
3
2
|
import { CompatScroller } from "../components/CompatScroller";
|
|
4
3
|
/**
|
|
5
4
|
* Hook to detect when the scroll position reaches near the start or end of the list
|
|
@@ -12,7 +11,7 @@ import { CompatScroller } from "../components/CompatScroller";
|
|
|
12
11
|
* @param props - The RecyclerViewProps containing configuration and callbacks
|
|
13
12
|
* @param scrollViewRef - Reference to the scrollable container component
|
|
14
13
|
*/
|
|
15
|
-
export declare function useBoundDetection<T>(recyclerViewManager: RecyclerViewManager<T>,
|
|
14
|
+
export declare function useBoundDetection<T>(recyclerViewManager: RecyclerViewManager<T>, scrollViewRef: React.RefObject<CompatScroller>): {
|
|
16
15
|
checkBounds: () => void;
|
|
17
16
|
};
|
|
18
17
|
//# sourceMappingURL=useBoundDetection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useBoundDetection.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useBoundDetection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"useBoundDetection.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useBoundDetection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAI9D;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC3C,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC;;EAiH/C"}
|