@shopify/flash-list 1.8.0 → 2.0.0-alpha.2

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.
Files changed (170) hide show
  1. package/README.md +147 -26
  2. package/dist/FlashListProps.d.ts +65 -2
  3. package/dist/FlashListProps.d.ts.map +1 -1
  4. package/dist/__tests__/AverageWindow.test.js +35 -0
  5. package/dist/__tests__/AverageWindow.test.js.map +1 -1
  6. package/dist/enableNewCore.d.ts +3 -0
  7. package/dist/enableNewCore.d.ts.map +1 -0
  8. package/dist/enableNewCore.js +25 -0
  9. package/dist/enableNewCore.js.map +1 -0
  10. package/dist/index.d.ts +5 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +28 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/recyclerview/RecycleKeyManager.d.ts +82 -0
  15. package/dist/recyclerview/RecycleKeyManager.d.ts.map +1 -0
  16. package/dist/recyclerview/RecycleKeyManager.js +135 -0
  17. package/dist/recyclerview/RecycleKeyManager.js.map +1 -0
  18. package/dist/recyclerview/RecyclerView.d.ts +12 -0
  19. package/dist/recyclerview/RecyclerView.d.ts.map +1 -0
  20. package/dist/recyclerview/RecyclerView.js +283 -0
  21. package/dist/recyclerview/RecyclerView.js.map +1 -0
  22. package/dist/recyclerview/RecyclerViewContextProvider.d.ts +12 -0
  23. package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -0
  24. package/dist/recyclerview/RecyclerViewContextProvider.js +11 -0
  25. package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -0
  26. package/dist/recyclerview/RecyclerViewManager.d.ts +52 -0
  27. package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -0
  28. package/dist/recyclerview/RecyclerViewManager.js +323 -0
  29. package/dist/recyclerview/RecyclerViewManager.js.map +1 -0
  30. package/dist/recyclerview/RecyclerViewProps.d.ts +9 -0
  31. package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -0
  32. package/dist/recyclerview/RecyclerViewProps.js +3 -0
  33. package/dist/recyclerview/RecyclerViewProps.js.map +1 -0
  34. package/dist/recyclerview/ViewHolder.d.ts +45 -0
  35. package/dist/recyclerview/ViewHolder.d.ts.map +1 -0
  36. package/dist/recyclerview/ViewHolder.js +96 -0
  37. package/dist/recyclerview/ViewHolder.js.map +1 -0
  38. package/dist/recyclerview/ViewHolderCollection.d.ts +57 -0
  39. package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -0
  40. package/dist/recyclerview/ViewHolderCollection.js +75 -0
  41. package/dist/recyclerview/ViewHolderCollection.js.map +1 -0
  42. package/dist/recyclerview/components/CompatScroller.d.ts +7 -0
  43. package/dist/recyclerview/components/CompatScroller.d.ts.map +1 -0
  44. package/dist/recyclerview/components/CompatScroller.js +8 -0
  45. package/dist/recyclerview/components/CompatScroller.js.map +1 -0
  46. package/dist/recyclerview/components/CompatView.d.ts +7 -0
  47. package/dist/recyclerview/components/CompatView.d.ts.map +1 -0
  48. package/dist/recyclerview/components/CompatView.js +8 -0
  49. package/dist/recyclerview/components/CompatView.js.map +1 -0
  50. package/dist/recyclerview/components/ScrollAnchor.d.ts +28 -0
  51. package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -0
  52. package/dist/recyclerview/components/ScrollAnchor.js +35 -0
  53. package/dist/recyclerview/components/ScrollAnchor.js.map +1 -0
  54. package/dist/recyclerview/components/StickyHeaders.d.ts +38 -0
  55. package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -0
  56. package/dist/recyclerview/components/StickyHeaders.js +119 -0
  57. package/dist/recyclerview/components/StickyHeaders.js.map +1 -0
  58. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts +51 -0
  59. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts.map +1 -0
  60. package/dist/recyclerview/helpers/ConsecutiveNumbers.js +122 -0
  61. package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -0
  62. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +59 -0
  63. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -0
  64. package/dist/recyclerview/helpers/EngagedIndicesTracker.js +138 -0
  65. package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -0
  66. package/dist/recyclerview/hooks/useBoundDetection.d.ts +19 -0
  67. package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -0
  68. package/dist/recyclerview/hooks/useBoundDetection.js +103 -0
  69. package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -0
  70. package/dist/recyclerview/hooks/useLayoutState.d.ts +12 -0
  71. package/dist/recyclerview/hooks/useLayoutState.d.ts.map +1 -0
  72. package/dist/recyclerview/hooks/useLayoutState.js +43 -0
  73. package/dist/recyclerview/hooks/useLayoutState.js.map +1 -0
  74. package/dist/recyclerview/hooks/useOnLoad.d.ts +25 -0
  75. package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -0
  76. package/dist/recyclerview/hooks/useOnLoad.js +73 -0
  77. package/dist/recyclerview/hooks/useOnLoad.js.map +1 -0
  78. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +72 -0
  79. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -0
  80. package/dist/recyclerview/hooks/useRecyclerViewController.js +370 -0
  81. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -0
  82. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +6 -0
  83. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -0
  84. package/dist/recyclerview/hooks/useRecyclerViewManager.js +27 -0
  85. package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -0
  86. package/dist/recyclerview/hooks/useRecyclingState.d.ts +16 -0
  87. package/dist/recyclerview/hooks/useRecyclingState.d.ts.map +1 -0
  88. package/dist/recyclerview/hooks/useRecyclingState.js +54 -0
  89. package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -0
  90. package/dist/recyclerview/hooks/useSecondaryProps.d.ts +27 -0
  91. package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -0
  92. package/dist/recyclerview/hooks/useSecondaryProps.js +93 -0
  93. package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -0
  94. package/dist/recyclerview/hooks/useUnmountFlag.d.ts +11 -0
  95. package/dist/recyclerview/hooks/useUnmountFlag.d.ts.map +1 -0
  96. package/dist/recyclerview/hooks/useUnmountFlag.js +28 -0
  97. package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -0
  98. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +65 -0
  99. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -0
  100. package/dist/recyclerview/layout-managers/GridLayoutManager.js +204 -0
  101. package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -0
  102. package/dist/recyclerview/layout-managers/LayoutManager.d.ts +281 -0
  103. package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -0
  104. package/dist/recyclerview/layout-managers/LayoutManager.js +250 -0
  105. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -0
  106. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts +52 -0
  107. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts.map +1 -0
  108. package/dist/recyclerview/layout-managers/LinearLayoutManager.js +191 -0
  109. package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -0
  110. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts +73 -0
  111. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts.map +1 -0
  112. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +274 -0
  113. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -0
  114. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts +12 -0
  115. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts.map +1 -0
  116. package/dist/recyclerview/utils/adjustOffsetForRTL.js +18 -0
  117. package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -0
  118. package/dist/recyclerview/utils/componentUtils.d.ts +19 -0
  119. package/dist/recyclerview/utils/componentUtils.d.ts.map +1 -0
  120. package/dist/recyclerview/utils/componentUtils.js +32 -0
  121. package/dist/recyclerview/utils/componentUtils.js.map +1 -0
  122. package/dist/recyclerview/utils/findVisibleIndex.d.ts +24 -0
  123. package/dist/recyclerview/utils/findVisibleIndex.d.ts.map +1 -0
  124. package/dist/recyclerview/utils/findVisibleIndex.js +82 -0
  125. package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -0
  126. package/dist/recyclerview/utils/measureLayout.d.ts +56 -0
  127. package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -0
  128. package/dist/recyclerview/utils/measureLayout.js +77 -0
  129. package/dist/recyclerview/utils/measureLayout.js.map +1 -0
  130. package/dist/tsconfig.tsbuildinfo +1 -1
  131. package/dist/utils/AverageWindow.d.ts +13 -0
  132. package/dist/utils/AverageWindow.d.ts.map +1 -1
  133. package/dist/utils/AverageWindow.js +30 -1
  134. package/dist/utils/AverageWindow.js.map +1 -1
  135. package/package.json +1 -1
  136. package/src/FlashListProps.ts +73 -2
  137. package/src/__tests__/AverageWindow.test.ts +49 -1
  138. package/src/enableNewCore.ts +22 -0
  139. package/src/index.ts +21 -0
  140. package/src/recyclerview/RecycleKeyManager.ts +185 -0
  141. package/src/recyclerview/RecyclerView.tsx +500 -0
  142. package/src/recyclerview/RecyclerViewContextProvider.ts +19 -0
  143. package/src/recyclerview/RecyclerViewManager.ts +379 -0
  144. package/src/recyclerview/RecyclerViewProps.ts +10 -0
  145. package/src/recyclerview/ViewHolder.tsx +173 -0
  146. package/src/recyclerview/ViewHolderCollection.tsx +164 -0
  147. package/src/recyclerview/components/CompatScroller.ts +9 -0
  148. package/src/recyclerview/components/CompatView.ts +9 -0
  149. package/src/recyclerview/components/ScrollAnchor.tsx +53 -0
  150. package/src/recyclerview/components/StickyHeaders.tsx +210 -0
  151. package/src/recyclerview/helpers/ConsecutiveNumbers.ts +120 -0
  152. package/src/recyclerview/helpers/EngagedIndicesTracker.ts +191 -0
  153. package/src/recyclerview/hooks/useBoundDetection.ts +127 -0
  154. package/src/recyclerview/hooks/useLayoutState.ts +46 -0
  155. package/src/recyclerview/hooks/useOnLoad.ts +78 -0
  156. package/src/recyclerview/hooks/useRecyclerViewController.tsx +487 -0
  157. package/src/recyclerview/hooks/useRecyclerViewManager.ts +30 -0
  158. package/src/recyclerview/hooks/useRecyclingState.ts +63 -0
  159. package/src/recyclerview/hooks/useSecondaryProps.tsx +119 -0
  160. package/src/recyclerview/hooks/useUnmountFlag.ts +26 -0
  161. package/src/recyclerview/layout-managers/GridLayoutManager.ts +215 -0
  162. package/src/recyclerview/layout-managers/LayoutManager.ts +493 -0
  163. package/src/recyclerview/layout-managers/LinearLayoutManager.ts +167 -0
  164. package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +302 -0
  165. package/src/recyclerview/utils/adjustOffsetForRTL.ts +17 -0
  166. package/src/recyclerview/utils/componentUtils.ts +28 -0
  167. package/src/recyclerview/utils/findVisibleIndex.ts +94 -0
  168. package/src/recyclerview/utils/measureLayout.ts +89 -0
  169. package/src/utils/AverageWindow.ts +33 -0
  170. package/src/viewability/ViewToken.ts +1 -1
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * ViewHolderCollection is a container component that manages multiple ViewHolder instances.
4
+ * It handles the rendering of a collection of list items, manages layout updates,
5
+ * and coordinates with the RecyclerView context for layout changes.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ViewHolderCollection = void 0;
9
+ var tslib_1 = require("tslib");
10
+ var react_1 = tslib_1.__importStar(require("react"));
11
+ var ViewHolder_1 = require("./ViewHolder");
12
+ var CompatView_1 = require("./components/CompatView");
13
+ var RecyclerViewContextProvider_1 = require("./RecyclerViewContextProvider");
14
+ /**
15
+ * ViewHolderCollection component that manages the rendering of multiple ViewHolder instances
16
+ * and handles layout updates for the entire collection
17
+ * @template TItem - The type of items in the data array
18
+ */
19
+ var ViewHolderCollection = function (props) {
20
+ var data = props.data, renderStack = props.renderStack, getLayout = props.getLayout, refHolder = props.refHolder, onSizeChanged = props.onSizeChanged, renderItem = props.renderItem, extraData = props.extraData, viewHolderCollectionRef = props.viewHolderCollectionRef, getChildContainerLayout = props.getChildContainerLayout, onCommitLayoutEffect = props.onCommitLayoutEffect, CellRendererComponent = props.CellRendererComponent, ItemSeparatorComponent = props.ItemSeparatorComponent, onCommitEffect = props.onCommitEffect, horizontal = props.horizontal;
21
+ var _a = tslib_1.__read(react_1.default.useState(0), 2), renderId = _a[0], setRenderId = _a[1];
22
+ var containerLayout = getChildContainerLayout();
23
+ // TODO: guard againt precision issues
24
+ var fixedContainerSize = horizontal
25
+ ? containerLayout === null || containerLayout === void 0 ? void 0 : containerLayout.height
26
+ : containerLayout === null || containerLayout === void 0 ? void 0 : containerLayout.width;
27
+ var recyclerViewContext = (0, RecyclerViewContextProvider_1.useRecyclerViewContext)();
28
+ (0, react_1.useLayoutEffect)(function () {
29
+ if (renderId > 0) {
30
+ // console.log(
31
+ // "parent layout trigger due to child container size change",
32
+ // fixedContainerSize
33
+ // );
34
+ recyclerViewContext === null || recyclerViewContext === void 0 ? void 0 : recyclerViewContext.layout();
35
+ }
36
+ }, [fixedContainerSize]);
37
+ (0, react_1.useLayoutEffect)(function () {
38
+ if (renderId > 0) {
39
+ onCommitLayoutEffect === null || onCommitLayoutEffect === void 0 ? void 0 : onCommitLayoutEffect();
40
+ }
41
+ }, [renderId]);
42
+ (0, react_1.useEffect)(function () {
43
+ if (renderId > 0) {
44
+ onCommitEffect === null || onCommitEffect === void 0 ? void 0 : onCommitEffect();
45
+ }
46
+ }, [renderId]);
47
+ // Expose forceUpdate through ref
48
+ (0, react_1.useImperativeHandle)(viewHolderCollectionRef, function () { return ({
49
+ commitLayout: function () {
50
+ // This will trigger a re-render of the component
51
+ setRenderId(function (prev) { return prev + 1; });
52
+ },
53
+ }); });
54
+ var hasData = data && data.length > 0;
55
+ var containerStyle = {
56
+ width: horizontal ? containerLayout === null || containerLayout === void 0 ? void 0 : containerLayout.width : undefined,
57
+ height: containerLayout === null || containerLayout === void 0 ? void 0 : containerLayout.height,
58
+ };
59
+ return (react_1.default.createElement(CompatView_1.CompatView
60
+ // TODO: Take care of web scroll bar here
61
+ , {
62
+ // TODO: Take care of web scroll bar here
63
+ style: hasData && containerStyle }, containerLayout &&
64
+ hasData &&
65
+ Array.from(renderStack, function (_a) {
66
+ var _b = tslib_1.__read(_a, 2), index = _b[0], reactKey = _b[1];
67
+ var item = data[index];
68
+ var trailingItem = ItemSeparatorComponent
69
+ ? data[index + 1]
70
+ : undefined;
71
+ return (react_1.default.createElement(ViewHolder_1.ViewHolder, { key: reactKey, index: index, item: item, trailingItem: trailingItem, layout: tslib_1.__assign({}, getLayout(index)), refHolder: refHolder, onSizeChanged: onSizeChanged, target: "Cell", renderItem: renderItem, extraData: extraData, CellRendererComponent: CellRendererComponent, ItemSeparatorComponent: ItemSeparatorComponent, horizontal: horizontal }));
72
+ })));
73
+ };
74
+ exports.ViewHolderCollection = ViewHolderCollection;
75
+ //# sourceMappingURL=ViewHolderCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ViewHolderCollection.js","sourceRoot":"","sources":["../../src/recyclerview/ViewHolderCollection.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { ScrollView, Animated } from "react-native";
2
+ declare const AnimatedScrollView: Animated.AnimatedComponent<typeof ScrollView>;
3
+ /** Regular scroll view component */
4
+ export { ScrollView as CompatScroller };
5
+ /** Animated scroll view component for smooth scrolling animations */
6
+ export { AnimatedScrollView as CompatAnimatedScroller };
7
+ //# sourceMappingURL=CompatScroller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompatScroller.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/components/CompatScroller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEpD,QAAA,MAAM,kBAAkB,+CAAsB,CAAC;AAE/C,oCAAoC;AACpC,OAAO,EAAE,UAAU,IAAI,cAAc,EAAE,CAAC;AAExC,qEAAqE;AACrE,OAAO,EAAE,kBAAkB,IAAI,sBAAsB,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompatAnimatedScroller = exports.CompatScroller = void 0;
4
+ var react_native_1 = require("react-native");
5
+ Object.defineProperty(exports, "CompatScroller", { enumerable: true, get: function () { return react_native_1.ScrollView; } });
6
+ var AnimatedScrollView = react_native_1.Animated.ScrollView;
7
+ exports.CompatAnimatedScroller = AnimatedScrollView;
8
+ //# sourceMappingURL=CompatScroller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompatScroller.js","sourceRoot":"","sources":["../../../src/recyclerview/components/CompatScroller.ts"],"names":[],"mappings":";;;AAAA,6CAAoD;AAK7B,+FALd,yBAAU,OAKkB;AAHrC,IAAM,kBAAkB,GAAG,uBAAQ,CAAC,UAAU,CAAC;AAMhB,oDAAsB"}
@@ -0,0 +1,7 @@
1
+ import { View, Animated } from "react-native";
2
+ /** Regular view component */
3
+ export { View as CompatView };
4
+ declare const AnimatedView: Animated.AnimatedComponent<typeof View>;
5
+ /** Animated view component for smooth animations */
6
+ export { AnimatedView as CompatAnimatedView };
7
+ //# sourceMappingURL=CompatView.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompatView.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/components/CompatView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE9C,6BAA6B;AAC7B,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,CAAC;AAE9B,QAAA,MAAM,YAAY,yCAAgB,CAAC;AAEnC,oDAAoD;AACpD,OAAO,EAAE,YAAY,IAAI,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompatAnimatedView = exports.CompatView = void 0;
4
+ var react_native_1 = require("react-native");
5
+ Object.defineProperty(exports, "CompatView", { enumerable: true, get: function () { return react_native_1.View; } });
6
+ var AnimatedView = react_native_1.Animated.View;
7
+ exports.CompatAnimatedView = AnimatedView;
8
+ //# sourceMappingURL=CompatView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompatView.js","sourceRoot":"","sources":["../../../src/recyclerview/components/CompatView.ts"],"names":[],"mappings":";;;AAAA,6CAA8C;AAG7B,2FAHR,mBAAI,OAGc;AAE3B,IAAM,YAAY,GAAG,uBAAQ,CAAC,IAAI,CAAC;AAGV,0CAAkB"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ScrollAnchor component provides a mechanism to programmatically scroll
3
+ * the list by manipulating an invisible anchor element's position.
4
+ * This helps us use ScrollView's maintainVisibleContentPosition property
5
+ * to adjust the scroll position of the list as the size of content changes without any glitches.
6
+ */
7
+ import React from "react";
8
+ /**
9
+ * Props for the ScrollAnchor component
10
+ */
11
+ export interface ScrollAnchorProps {
12
+ /** Ref to access scroll anchor methods */
13
+ scrollAnchorRef: React.Ref<ScrollAnchorRef>;
14
+ }
15
+ /**
16
+ * Ref interface for ScrollAnchor component
17
+ */
18
+ export interface ScrollAnchorRef {
19
+ /** Scrolls the list by the specified offset */
20
+ scrollBy: (offset: number) => void;
21
+ }
22
+ /**
23
+ * ScrollAnchor component that provides programmatic scrolling capabilities using maintainVisibleContentPosition property
24
+ * @param props - Component props
25
+ * @returns An invisible anchor element used for scrolling
26
+ */
27
+ export declare function ScrollAnchor({ scrollAnchorRef }: ScrollAnchorProps): React.JSX.Element;
28
+ //# sourceMappingURL=ScrollAnchor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollAnchor.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/components/ScrollAnchor.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,eAAe,EAAE,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;CAC7C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,EAAE,eAAe,EAAE,EAAE,iBAAiB,qBAoBlE"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ /**
3
+ * ScrollAnchor component provides a mechanism to programmatically scroll
4
+ * the list by manipulating an invisible anchor element's position.
5
+ * This helps us use ScrollView's maintainVisibleContentPosition property
6
+ * to adjust the scroll position of the list as the size of content changes without any glitches.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ScrollAnchor = void 0;
10
+ var tslib_1 = require("tslib");
11
+ var react_1 = require("react");
12
+ var CompatView_1 = require("./CompatView");
13
+ var react_2 = tslib_1.__importDefault(require("react"));
14
+ /**
15
+ * ScrollAnchor component that provides programmatic scrolling capabilities using maintainVisibleContentPosition property
16
+ * @param props - Component props
17
+ * @returns An invisible anchor element used for scrolling
18
+ */
19
+ function ScrollAnchor(_a) {
20
+ var scrollAnchorRef = _a.scrollAnchorRef;
21
+ var _b = tslib_1.__read((0, react_1.useState)(1000000), 2), scrollOffset = _b[0], setScrollOffset = _b[1]; //TODO: Fix this value
22
+ // Expose scrollBy method through ref
23
+ (0, react_1.useImperativeHandle)(scrollAnchorRef, function () { return ({
24
+ scrollBy: function (offset) {
25
+ setScrollOffset(function (prev) { return prev + offset; });
26
+ },
27
+ }); });
28
+ // Create an invisible anchor element that can be positioned
29
+ var anchor = (0, react_1.useMemo)(function () {
30
+ return (react_2.default.createElement(CompatView_1.CompatView, { style: { position: "absolute", height: 0, top: scrollOffset } }));
31
+ }, [scrollOffset]);
32
+ return anchor;
33
+ }
34
+ exports.ScrollAnchor = ScrollAnchor;
35
+ //# sourceMappingURL=ScrollAnchor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollAnchor.js","sourceRoot":"","sources":["../../../src/recyclerview/components/ScrollAnchor.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;AAEH,+BAA+D;AAC/D,2CAA0C;AAC1C,wDAA0B;AAkB1B;;;;GAIG;AACH,SAAgB,YAAY,CAAC,EAAsC;QAApC,eAAe,qBAAA;IACtC,IAAA,KAAA,eAAkC,IAAA,gBAAQ,EAAC,OAAO,CAAC,IAAA,EAAlD,YAAY,QAAA,EAAE,eAAe,QAAqB,CAAC,CAAC,sBAAsB;IAEjF,qCAAqC;IACrC,IAAA,2BAAmB,EAAC,eAAe,EAAE,cAAM,OAAA,CAAC;QAC1C,QAAQ,EAAE,UAAC,MAAc;YACvB,eAAe,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,GAAG,MAAM,EAAb,CAAa,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC,EAJyC,CAIzC,CAAC,CAAC;IAEJ,4DAA4D;IAC5D,IAAM,MAAM,GAAG,IAAA,eAAO,EAAC;QACrB,OAAO,CACL,8BAAC,uBAAU,IACT,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,EAAE,GAC7D,CACH,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,OAAO,MAAM,CAAC;AAChB,CAAC;AApBD,oCAoBC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * StickyHeaders component manages the sticky header behavior in a FlashList.
3
+ * It handles the animation and positioning of headers that should remain fixed
4
+ * at the top of the list while scrolling.
5
+ */
6
+ import React from "react";
7
+ import { Animated, NativeScrollEvent } from "react-native";
8
+ import { FlashListProps } from "../..";
9
+ import { RecyclerViewManager } from "../RecyclerViewManager";
10
+ /**
11
+ * Props for the StickyHeaders component
12
+ * @template TItem - The type of items in the list
13
+ */
14
+ export interface StickyHeaderProps<TItem> {
15
+ /** Array of indices that should have sticky headers */
16
+ stickyHeaderIndices: number[];
17
+ /** The data array being rendered */
18
+ data: readonly TItem[];
19
+ /** Animated value tracking scroll position */
20
+ scrollY: Animated.Value;
21
+ /** Function to render each item */
22
+ renderItem: FlashListProps<TItem>["renderItem"];
23
+ /** Ref to access sticky header methods */
24
+ stickyHeaderRef: React.RefObject<StickyHeaderRef>;
25
+ /** Manager for recycler view operations */
26
+ recyclerViewManager: RecyclerViewManager<TItem>;
27
+ /** Additional data to trigger re-renders */
28
+ extraData: FlashListProps<TItem>["extraData"];
29
+ }
30
+ /**
31
+ * Ref interface for StickyHeaders component
32
+ */
33
+ export interface StickyHeaderRef {
34
+ /** Reports scroll events to update sticky header positions */
35
+ reportScrollEvent: (event: NativeScrollEvent) => void;
36
+ }
37
+ export declare const StickyHeaders: <TItem>({ stickyHeaderIndices, renderItem, stickyHeaderRef, recyclerViewManager, scrollY, data, extraData, }: StickyHeaderProps<TItem>) => React.JSX.Element | null;
38
+ //# sourceMappingURL=StickyHeaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StickyHeaders.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/components/StickyHeaders.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAON,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,KAAK;IACtC,uDAAuD;IACvD,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,oCAAoC;IACpC,IAAI,EAAE,SAAS,KAAK,EAAE,CAAC;IACvB,8CAA8C;IAC9C,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;IACxB,mCAAmC;IACnC,UAAU,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC;IAChD,0CAA0C;IAC1C,eAAe,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAClD,2CAA2C;IAC3C,mBAAmB,EAAE,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAChD,4CAA4C;IAC5C,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACvD;AAED,eAAO,MAAM,aAAa,qKAiIzB,CAAC"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ /**
3
+ * StickyHeaders component manages the sticky header behavior in a FlashList.
4
+ * It handles the animation and positioning of headers that should remain fixed
5
+ * at the top of the list while scrolling.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.StickyHeaders = void 0;
9
+ var tslib_1 = require("tslib");
10
+ var react_1 = tslib_1.__importStar(require("react"));
11
+ var CompatView_1 = require("./CompatView");
12
+ var ViewHolder_1 = require("../ViewHolder");
13
+ var StickyHeaders = function (_a) {
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)({ currentStickyIndex: -1, nextStickyIndex: -1 }), 2), stickyIndices = _b[0], setStickyIndices = _b[1];
16
+ var currentStickyIndex = stickyIndices.currentStickyIndex, nextStickyIndex = stickyIndices.nextStickyIndex;
17
+ var hasLayout = recyclerViewManager.hasLayout();
18
+ // Memoize sorted indices based on their Y positions
19
+ var sortedIndices = (0, react_1.useMemo)(function () {
20
+ if (!hasLayout) {
21
+ return [];
22
+ }
23
+ return stickyHeaderIndices.sort(function (a, b) { return a - b; });
24
+ }, [stickyHeaderIndices, recyclerViewManager, hasLayout]);
25
+ var compute = (0, react_1.useCallback)(function () {
26
+ var _a, _b;
27
+ var adjustedValue = recyclerViewManager.getLastScrollOffset();
28
+ // Binary search for current sticky index
29
+ var currentIndexInArray = findCurrentStickyIndex(sortedIndices, adjustedValue, function (index) { return recyclerViewManager.getLayout(index).y; });
30
+ var newStickyIndex = (_a = sortedIndices[currentIndexInArray]) !== null && _a !== void 0 ? _a : -1;
31
+ var newNextStickyIndex = (_b = sortedIndices[currentIndexInArray + 1]) !== null && _b !== void 0 ? _b : -1;
32
+ if (newNextStickyIndex > recyclerViewManager.getEngagedIndices().endIndex) {
33
+ newNextStickyIndex = -1;
34
+ }
35
+ if (newStickyIndex !== currentStickyIndex ||
36
+ newNextStickyIndex !== nextStickyIndex) {
37
+ setStickyIndices({
38
+ currentStickyIndex: newStickyIndex,
39
+ nextStickyIndex: newNextStickyIndex,
40
+ });
41
+ }
42
+ }, [currentStickyIndex, nextStickyIndex, recyclerViewManager, sortedIndices]);
43
+ (0, react_1.useEffect)(function () {
44
+ compute();
45
+ }, [compute]);
46
+ // Optimized scroll handler using binary search pattern
47
+ (0, react_1.useImperativeHandle)(stickyHeaderRef, function () { return ({
48
+ reportScrollEvent: function () {
49
+ compute();
50
+ },
51
+ }); }, [
52
+ stickyHeaderIndices,
53
+ recyclerViewManager,
54
+ currentStickyIndex,
55
+ nextStickyIndex,
56
+ ]);
57
+ var refHolder = (0, react_1.useRef)(new Map()).current;
58
+ // Memoize translateY calculation
59
+ var translateY = (0, react_1.useMemo)(function () {
60
+ if (currentStickyIndex === -1 || nextStickyIndex === -1) {
61
+ return scrollY.interpolate({
62
+ inputRange: [0, Infinity],
63
+ outputRange: [0, 0],
64
+ extrapolate: "clamp",
65
+ });
66
+ }
67
+ var currentLayout = recyclerViewManager.getLayout(currentStickyIndex);
68
+ var nextLayout = recyclerViewManager.getLayout(nextStickyIndex);
69
+ var pushStartsAt = nextLayout.y - currentLayout.height;
70
+ return scrollY.interpolate({
71
+ inputRange: [
72
+ pushStartsAt + recyclerViewManager.firstItemOffset,
73
+ nextLayout.y + recyclerViewManager.firstItemOffset,
74
+ ],
75
+ outputRange: [0, -currentLayout.height],
76
+ extrapolate: "clamp",
77
+ });
78
+ }, [currentStickyIndex, nextStickyIndex, recyclerViewManager, scrollY]);
79
+ // Memoize header content
80
+ var headerContent = (0, react_1.useMemo)(function () {
81
+ if (currentStickyIndex === -1)
82
+ return null;
83
+ return (react_1.default.createElement(CompatView_1.CompatAnimatedView, { style: {
84
+ position: "absolute",
85
+ top: 0,
86
+ left: 0,
87
+ right: 0,
88
+ transform: [{ translateY: translateY }],
89
+ } },
90
+ 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" })));
91
+ }, [currentStickyIndex, data, renderItem, extraData, refHolder, translateY]);
92
+ return headerContent;
93
+ };
94
+ exports.StickyHeaders = StickyHeaders;
95
+ /**
96
+ * Binary search utility to find the current sticky header index based on scroll position
97
+ * @param sortedIndices - Array of indices sorted by Y position
98
+ * @param adjustedValue - Current scroll position
99
+ * @param getY - Function to get Y position for an index
100
+ * @returns Index of the current sticky header
101
+ */
102
+ function findCurrentStickyIndex(sortedIndices, adjustedValue, getY) {
103
+ var left = 0;
104
+ var right = sortedIndices.length - 1;
105
+ var result = -1;
106
+ while (left <= right) {
107
+ var mid = Math.floor((left + right) / 2);
108
+ var currentY = getY(sortedIndices[mid]);
109
+ if (currentY <= adjustedValue) {
110
+ result = mid;
111
+ left = mid + 1;
112
+ }
113
+ else {
114
+ right = mid - 1;
115
+ }
116
+ }
117
+ return result;
118
+ }
119
+ //# sourceMappingURL=StickyHeaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StickyHeaders.js","sourceRoot":"","sources":["../../../src/recyclerview/components/StickyHeaders.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * A simple wrapper for consecutive integer arrays
3
+ * Only stores start and end indices for faster computation as numbers are consecutive.
4
+ */
5
+ export declare class ConsecutiveNumbers {
6
+ readonly startIndex: number;
7
+ readonly endIndex: number;
8
+ constructor(startIndex: number, endIndex: number);
9
+ static readonly EMPTY: ConsecutiveNumbers;
10
+ /**
11
+ * Get the length of the array
12
+ */
13
+ get length(): number;
14
+ /**
15
+ * Get element at specified index
16
+ */
17
+ at(index: number): number;
18
+ /**
19
+ * Check if two consecutive numbers are equal
20
+ */
21
+ equals(other: ConsecutiveNumbers): boolean;
22
+ /**
23
+ * Converts the consecutive range to an actual array
24
+ * @returns An array containing all consecutive numbers
25
+ */
26
+ toArray(): number[];
27
+ /**
28
+ * Check if array includes a value
29
+ */
30
+ includes(value: number): boolean;
31
+ /**
32
+ * Get index of a value in the consecutive range
33
+ */
34
+ indexOf(value: number): number;
35
+ findValue(predicate: (value: number, index: number, array: ConsecutiveNumbers) => boolean | undefined): number | undefined;
36
+ /**
37
+ * Tests whether all elements in the consecutive range pass the provided test function
38
+ * @param predicate A function that tests each element
39
+ * @returns true if all elements pass the test; otherwise, false
40
+ */
41
+ every(predicate: (value: number, index: number, array: ConsecutiveNumbers) => boolean | undefined): boolean;
42
+ /**
43
+ * Get a slice of the consecutive array
44
+ */
45
+ slice(start?: number, end?: number): ConsecutiveNumbers;
46
+ /**
47
+ * Implement iterator to enable for...of
48
+ */
49
+ [Symbol.iterator](): Generator<number, void, unknown>;
50
+ }
51
+ //# sourceMappingURL=ConsecutiveNumbers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsecutiveNumbers.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/helpers/ConsecutiveNumbers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,kBAAkB;aAEX,UAAU,EAAE,MAAM;aAClB,QAAQ,EAAE,MAAM;gBADhB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM;IAGlC,MAAM,CAAC,QAAQ,CAAC,KAAK,qBAAiC;IAEtD;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIzB;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO;IAM1C;;;OAGG;IACH,OAAO,IAAI,MAAM,EAAE;IAWnB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAI9B,SAAS,CACP,SAAS,EAAE,CACT,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,kBAAkB,KACtB,OAAO,GAAG,SAAS,GACvB,MAAM,GAAG,SAAS;IAUrB;;;;OAIG;IACH,KAAK,CACH,SAAS,EAAE,CACT,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,kBAAkB,KACtB,OAAO,GAAG,SAAS,GACvB,OAAO;IAUV;;OAEG;IACH,KAAK,CAAC,KAAK,SAAI,EAAE,GAAG,SAAc,GAAG,kBAAkB;IAOvD;;OAEG;IACF,CAAC,MAAM,CAAC,QAAQ,CAAC;CAKnB"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConsecutiveNumbers = void 0;
4
+ var tslib_1 = require("tslib");
5
+ /**
6
+ * A simple wrapper for consecutive integer arrays
7
+ * Only stores start and end indices for faster computation as numbers are consecutive.
8
+ */
9
+ var ConsecutiveNumbers = /** @class */ (function () {
10
+ function ConsecutiveNumbers(startIndex, endIndex) {
11
+ this.startIndex = startIndex;
12
+ this.endIndex = endIndex;
13
+ }
14
+ Object.defineProperty(ConsecutiveNumbers.prototype, "length", {
15
+ /**
16
+ * Get the length of the array
17
+ */
18
+ get: function () {
19
+ return Math.max(0, this.endIndex - this.startIndex + 1);
20
+ },
21
+ enumerable: false,
22
+ configurable: true
23
+ });
24
+ /**
25
+ * Get element at specified index
26
+ */
27
+ ConsecutiveNumbers.prototype.at = function (index) {
28
+ return this.startIndex + index;
29
+ };
30
+ /**
31
+ * Check if two consecutive numbers are equal
32
+ */
33
+ ConsecutiveNumbers.prototype.equals = function (other) {
34
+ return (this.startIndex === other.startIndex && this.endIndex === other.endIndex);
35
+ };
36
+ /**
37
+ * Converts the consecutive range to an actual array
38
+ * @returns An array containing all consecutive numbers
39
+ */
40
+ ConsecutiveNumbers.prototype.toArray = function () {
41
+ if (this.length === 0) {
42
+ return [];
43
+ }
44
+ var array = new Array(this.length);
45
+ for (var i = 0; i < this.length; i++) {
46
+ array[i] = this.startIndex + i;
47
+ }
48
+ return array;
49
+ };
50
+ /**
51
+ * Check if array includes a value
52
+ */
53
+ ConsecutiveNumbers.prototype.includes = function (value) {
54
+ return value >= this.startIndex && value <= this.endIndex;
55
+ };
56
+ /**
57
+ * Get index of a value in the consecutive range
58
+ */
59
+ ConsecutiveNumbers.prototype.indexOf = function (value) {
60
+ return this.includes(value) ? value - this.startIndex : -1;
61
+ };
62
+ ConsecutiveNumbers.prototype.findValue = function (predicate) {
63
+ for (var i = 0; i < this.length; i++) {
64
+ var value = this.startIndex + i;
65
+ if (predicate(value, i, this)) {
66
+ return value;
67
+ }
68
+ }
69
+ return undefined;
70
+ };
71
+ /**
72
+ * Tests whether all elements in the consecutive range pass the provided test function
73
+ * @param predicate A function that tests each element
74
+ * @returns true if all elements pass the test; otherwise, false
75
+ */
76
+ ConsecutiveNumbers.prototype.every = function (predicate) {
77
+ for (var i = 0; i < this.length; i++) {
78
+ var value = this.startIndex + i;
79
+ if (!predicate(value, i, this)) {
80
+ return false;
81
+ }
82
+ }
83
+ return true;
84
+ };
85
+ /**
86
+ * Get a slice of the consecutive array
87
+ */
88
+ ConsecutiveNumbers.prototype.slice = function (start, end) {
89
+ if (start === void 0) { start = 0; }
90
+ if (end === void 0) { end = this.length; }
91
+ var newStart = this.startIndex + start;
92
+ var newEnd = this.startIndex + Math.min(end, this.length) - 1;
93
+ return new ConsecutiveNumbers(newStart, Math.max(newStart - 1, newEnd));
94
+ };
95
+ /**
96
+ * Implement iterator to enable for...of
97
+ */
98
+ ConsecutiveNumbers.prototype[Symbol.iterator] = function () {
99
+ var i;
100
+ return tslib_1.__generator(this, function (_a) {
101
+ switch (_a.label) {
102
+ case 0:
103
+ i = this.startIndex;
104
+ _a.label = 1;
105
+ case 1:
106
+ if (!(i <= this.endIndex)) return [3 /*break*/, 4];
107
+ return [4 /*yield*/, i];
108
+ case 2:
109
+ _a.sent();
110
+ _a.label = 3;
111
+ case 3:
112
+ i++;
113
+ return [3 /*break*/, 1];
114
+ case 4: return [2 /*return*/];
115
+ }
116
+ });
117
+ };
118
+ ConsecutiveNumbers.EMPTY = new ConsecutiveNumbers(0, -1);
119
+ return ConsecutiveNumbers;
120
+ }());
121
+ exports.ConsecutiveNumbers = ConsecutiveNumbers;
122
+ //# sourceMappingURL=ConsecutiveNumbers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConsecutiveNumbers.js","sourceRoot":"","sources":["../../../src/recyclerview/helpers/ConsecutiveNumbers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { ConsecutiveNumbers } from "./ConsecutiveNumbers";
2
+ import { RVLayoutManager } from "../layout-managers/LayoutManager";
3
+ export interface RVEngagedIndicesTracker {
4
+ scrollOffset: number;
5
+ drawDistance: number;
6
+ /**
7
+ * Updates the scroll offset and calculates which items should be rendered (engaged indices).
8
+ * @param offset - The new scroll offset position
9
+ * @param velocity - Current scroll velocity to optimize buffer distribution
10
+ * @param layoutManager - Layout manager to fetch item positions and dimensions
11
+ * @returns New engaged indices if changed, undefined if no change
12
+ */
13
+ updateScrollOffset: (offset: number, velocity: Velocity | null | undefined, layoutManager: RVLayoutManager) => ConsecutiveNumbers | undefined;
14
+ getEngagedIndices: () => ConsecutiveNumbers;
15
+ computeVisibleIndices: (layoutManager: RVLayoutManager) => ConsecutiveNumbers;
16
+ }
17
+ export interface Velocity {
18
+ x: number;
19
+ y: number;
20
+ }
21
+ export declare class RVEngagedIndicesTrackerImpl implements RVEngagedIndicesTracker {
22
+ scrollOffset: number;
23
+ drawDistance: number;
24
+ private engagedIndices;
25
+ private smallMultiplier;
26
+ private largeMultiplier;
27
+ private velocityHistory;
28
+ private velocityIndex;
29
+ /**
30
+ * Updates scroll position and determines which items should be rendered.
31
+ * Implements a smart buffer system that:
32
+ * 1. Calculates the visible viewport
33
+ * 2. Determines optimal buffer distribution based on scroll direction
34
+ * 3. Adjusts buffer sizes at list boundaries
35
+ * 4. Returns new indices that need to be rendered
36
+ */
37
+ updateScrollOffset(offset: number, velocity: Velocity | null | undefined, layoutManager: RVLayoutManager): ConsecutiveNumbers | undefined;
38
+ /**
39
+ * Determines scroll direction by analyzing recent velocity history.
40
+ * Uses a majority voting system on the last 5 velocity values.
41
+ * @param velocity - Current scroll velocity component (x or y)
42
+ * @returns true if scrolling backward (negative direction), false otherwise
43
+ */
44
+ private isScrollingBackward;
45
+ /**
46
+ * Calculates which items are currently visible in the viewport.
47
+ * Unlike getEngagedIndices, this doesn't include buffer items.
48
+ * @param layoutManager - Layout manager to fetch item positions
49
+ * @returns Indices of items currently visible in the viewport
50
+ */
51
+ computeVisibleIndices(layoutManager: RVLayoutManager): ConsecutiveNumbers;
52
+ /**
53
+ * Returns the currently engaged (rendered) indices.
54
+ * This includes both visible items and buffer items.
55
+ * @returns The last computed set of engaged indices
56
+ */
57
+ getEngagedIndices(): ConsecutiveNumbers;
58
+ }
59
+ //# sourceMappingURL=EngagedIndicesTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EngagedIndicesTracker.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/helpers/EngagedIndicesTracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAEnE,MAAM,WAAW,uBAAuB;IAEtC,YAAY,EAAE,MAAM,CAAC;IAErB,YAAY,EAAE,MAAM,CAAC;IAErB;;;;;;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;IACpC,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;IAC5C,qBAAqB,EAAE,CAAC,aAAa,EAAE,eAAe,KAAK,kBAAkB,CAAC;CAC/E;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,EAAE,MAAM,CAAO;IAElC,OAAO,CAAC,cAAc,CAA4B;IAGlD,OAAO,CAAC,eAAe,CAAO;IAC9B,OAAO,CAAC,eAAe,CAAO;IAG9B,OAAO,CAAC,eAAe,CAAwB;IAC/C,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;IA2EjC;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;;;OAKG;IACH,qBAAqB,CAAC,aAAa,EAAE,eAAe,GAAG,kBAAkB;IAiBzE;;;;OAIG;IACH,iBAAiB,IAAI,kBAAkB;CAGxC"}