@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,370 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRecyclerViewController = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var react_native_1 = require("react-native");
7
+ var adjustOffsetForRTL_1 = require("../utils/adjustOffsetForRTL");
8
+ var useUnmountFlag_1 = require("./useUnmountFlag");
9
+ /**
10
+ * Comprehensive hook that manages RecyclerView scrolling behavior and provides
11
+ * imperative methods for controlling the RecyclerView.
12
+ *
13
+ * This hook combines content offset management and scroll handling functionality:
14
+ * 1. Provides imperative methods for scrolling and measurement
15
+ * 2. Handles initial scroll position when the list first loads
16
+ * 3. Maintains visible content position during updates
17
+ * 4. Manages scroll anchors for chat-like applications
18
+ *
19
+ * @param recyclerViewManager - The RecyclerViewManager instance that handles core functionality
20
+ * @param ref - The ref to expose the imperative methods
21
+ * @param scrollViewRef - Reference to the scrollable container component
22
+ * @param scrollAnchorRef - Reference to the scroll anchor component
23
+ * @param props - The RecyclerViewProps containing configuration
24
+ */
25
+ function useRecyclerViewController(recyclerViewManager, ref, scrollViewRef, scrollAnchorRef, props) {
26
+ var _this = this;
27
+ var horizontal = props.horizontal, data = props.data;
28
+ var isUnmounted = (0, useUnmountFlag_1.useUnmountFlag)();
29
+ var _a = tslib_1.__read((0, react_1.useState)(0), 2), _ = _a[0], setRenderId = _a[1];
30
+ var pauseAdjustRef = (0, react_1.useRef)(false);
31
+ var initialScrollCompletedRef = (0, react_1.useRef)(false);
32
+ // Track the first visible item for maintaining scroll position
33
+ var firstVisibleItemKey = (0, react_1.useRef)(undefined);
34
+ var firstVisibleItemLayout = (0, react_1.useRef)(undefined);
35
+ var pendingScrollResolves = (0, react_1.useRef)([]);
36
+ var applyInitialScrollIndex = (0, react_1.useCallback)(function () {
37
+ var _a, _b, _c;
38
+ var initialScrollIndex = (_a = recyclerViewManager.getInitialScrollIndex()) !== null && _a !== void 0 ? _a : -1;
39
+ var dataLength = (_c = (_b = props.data) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0;
40
+ if (initialScrollIndex >= 0 &&
41
+ initialScrollIndex < dataLength &&
42
+ !initialScrollCompletedRef.current &&
43
+ recyclerViewManager.getIsFirstLayoutComplete()) {
44
+ // Use setTimeout to ensure that we keep trying to scroll on first few renders
45
+ setTimeout(function () {
46
+ initialScrollCompletedRef.current = true;
47
+ pauseAdjustRef.current = false;
48
+ }, 100);
49
+ pauseAdjustRef.current = true;
50
+ var offset_1 = horizontal
51
+ ? recyclerViewManager.getLayout(initialScrollIndex).x
52
+ : recyclerViewManager.getLayout(initialScrollIndex).y;
53
+ handlerMethods.scrollToOffset({
54
+ offset: offset_1,
55
+ animated: false,
56
+ });
57
+ setTimeout(function () {
58
+ handlerMethods.scrollToOffset({
59
+ offset: offset_1,
60
+ animated: false,
61
+ });
62
+ }, 0);
63
+ }
64
+ }, [recyclerViewManager, props.data]);
65
+ // Handle initial scroll position when the list first loads
66
+ // useOnLoad(recyclerViewManager, () => {
67
+ // });
68
+ /**
69
+ * Updates the scroll offset and returns a Promise that resolves
70
+ * when the update has been applied.
71
+ */
72
+ var updateScrollOffsetAsync = (0, react_1.useCallback)(function (offset) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
73
+ return tslib_1.__generator(this, function (_a) {
74
+ return [2 /*return*/, new Promise(function (resolve) {
75
+ recyclerViewManager.updateScrollOffset(offset);
76
+ // Add the resolve function to the queue
77
+ pendingScrollResolves.current.push(resolve);
78
+ setRenderId(function (prev) { return prev + 1; });
79
+ })];
80
+ });
81
+ }); }, [recyclerViewManager]);
82
+ /**
83
+ * Maintains the visible content position when the list updates.
84
+ * This is particularly useful for chat applications where we want to keep
85
+ * the user's current view position when new messages are added.
86
+ */
87
+ var applyContentOffset = (0, react_1.useCallback)(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
88
+ var resolves, currentIndexOfFirstVisibleItem, diff, firstVisibleIndex;
89
+ var _a, _b, _c, _d;
90
+ return tslib_1.__generator(this, function (_e) {
91
+ resolves = pendingScrollResolves.current;
92
+ pendingScrollResolves.current = [];
93
+ resolves.forEach(function (resolve) { return resolve(); });
94
+ if (!props.horizontal &&
95
+ recyclerViewManager.getIsFirstLayoutComplete() &&
96
+ props.keyExtractor &&
97
+ ((_a = props.maintainVisibleContentPosition) === null || _a === void 0 ? void 0 : _a.disabled) !== true) {
98
+ // If we have a tracked first visible item, maintain its position
99
+ if (firstVisibleItemKey.current) {
100
+ currentIndexOfFirstVisibleItem = recyclerViewManager
101
+ .getEngagedIndices()
102
+ .findValue(function (index) {
103
+ var _a;
104
+ return ((_a = props.keyExtractor) === null || _a === void 0 ? void 0 : _a.call(props, props.data[index], index)) ===
105
+ firstVisibleItemKey.current;
106
+ });
107
+ if (currentIndexOfFirstVisibleItem !== undefined) {
108
+ diff = recyclerViewManager.getLayout(currentIndexOfFirstVisibleItem).y -
109
+ firstVisibleItemLayout.current.y;
110
+ firstVisibleItemLayout.current = tslib_1.__assign({}, recyclerViewManager.getLayout(currentIndexOfFirstVisibleItem));
111
+ if (diff !== 0 && !pauseAdjustRef.current) {
112
+ //console.log("diff", diff, firstVisibleItemKey.current);
113
+ (_b = scrollAnchorRef.current) === null || _b === void 0 ? void 0 : _b.scrollBy(diff);
114
+ }
115
+ }
116
+ }
117
+ firstVisibleIndex = recyclerViewManager.getVisibleIndices().startIndex;
118
+ if (firstVisibleIndex !== undefined) {
119
+ firstVisibleItemKey.current =
120
+ (_d = (_c = props.keyExtractor) === null || _c === void 0 ? void 0 : _c.call(props, props.data[firstVisibleIndex], firstVisibleIndex)) !== null && _d !== void 0 ? _d : "0";
121
+ firstVisibleItemLayout.current = tslib_1.__assign({}, recyclerViewManager.getLayout(firstVisibleIndex));
122
+ }
123
+ }
124
+ return [2 /*return*/];
125
+ });
126
+ }); }, [props.data, props.keyExtractor, recyclerViewManager]);
127
+ var handlerMethods = (0, react_1.useMemo)(function () {
128
+ return {
129
+ props: props,
130
+ /**
131
+ * Scrolls the list to a specific offset position.
132
+ * Handles RTL layouts and first item offset adjustments.
133
+ */
134
+ scrollToOffset: function (_a) {
135
+ var offset = _a.offset, animated = _a.animated, _b = _a.skipFirstItemOffset, skipFirstItemOffset = _b === void 0 ? true : _b;
136
+ if (scrollViewRef.current) {
137
+ // Adjust offset for RTL layouts in horizontal mode
138
+ if (react_native_1.I18nManager.isRTL && horizontal) {
139
+ offset = (0, adjustOffsetForRTL_1.adjustOffsetForRTL)(offset, recyclerViewManager.getChildContainerDimensions().width, recyclerViewManager.getWindowSize().width);
140
+ }
141
+ // Calculate the final offset including first item offset if needed
142
+ var adjustedOffset = offset +
143
+ (skipFirstItemOffset ? 0 : recyclerViewManager.firstItemOffset);
144
+ var scrollTo_1 = horizontal
145
+ ? { x: adjustedOffset, y: 0 }
146
+ : { x: 0, y: adjustedOffset };
147
+ scrollViewRef.current.scrollTo(tslib_1.__assign(tslib_1.__assign({}, scrollTo_1), { animated: animated }));
148
+ }
149
+ },
150
+ // Expose native scroll view methods
151
+ flashScrollIndicators: function () {
152
+ scrollViewRef.current.flashScrollIndicators();
153
+ },
154
+ getNativeScrollRef: function () {
155
+ return scrollViewRef.current;
156
+ },
157
+ getScrollResponder: function () {
158
+ return scrollViewRef.current.getScrollResponder();
159
+ },
160
+ getScrollableNode: function () {
161
+ return scrollViewRef.current.getScrollableNode();
162
+ },
163
+ /**
164
+ * Scrolls to the end of the list.
165
+ */
166
+ scrollToEnd: function (_a) {
167
+ var _b = _a === void 0 ? {} : _a, animated = _b.animated;
168
+ return tslib_1.__awaiter(_this, void 0, void 0, function () {
169
+ return tslib_1.__generator(this, function (_c) {
170
+ switch (_c.label) {
171
+ case 0:
172
+ if (!(data && data.length > 0)) return [3 /*break*/, 2];
173
+ return [4 /*yield*/, handlerMethods.scrollToIndex({
174
+ index: data.length - 1,
175
+ animated: animated,
176
+ })];
177
+ case 1:
178
+ _c.sent();
179
+ _c.label = 2;
180
+ case 2:
181
+ scrollViewRef.current.scrollToEnd({ animated: animated });
182
+ return [2 /*return*/];
183
+ }
184
+ });
185
+ });
186
+ },
187
+ /**
188
+ * Scrolls to the beginning of the list.
189
+ */
190
+ scrollToTop: function (_a) {
191
+ var _b = _a === void 0 ? {} : _a, animated = _b.animated;
192
+ handlerMethods.scrollToOffset({
193
+ offset: 0,
194
+ animated: animated,
195
+ });
196
+ },
197
+ /**
198
+ * Scrolls to a specific index in the list.
199
+ * Supports viewPosition and viewOffset for precise positioning.
200
+ */
201
+ scrollToIndex: function (_a) {
202
+ var index = _a.index, animated = _a.animated, viewPosition = _a.viewPosition, viewOffset = _a.viewOffset;
203
+ return tslib_1.__awaiter(_this, void 0, void 0, function () {
204
+ var layout, lastScrollOffset, bufferForScroll, bufferForCompute, prevFinalOffset, finalOffset, attempts, MAX_ATTEMPTS, OFFSET_TOLERANCE, layout_1, offset, containerSize, itemSize, maxOffset;
205
+ return tslib_1.__generator(this, function (_b) {
206
+ switch (_b.label) {
207
+ case 0:
208
+ if (!(scrollViewRef.current && data && data.length > index)) return [3 /*break*/, 8];
209
+ pauseAdjustRef.current = true;
210
+ layout = recyclerViewManager.getLayout(index);
211
+ lastScrollOffset = recyclerViewManager.getLastScrollOffset();
212
+ bufferForScroll = horizontal
213
+ ? recyclerViewManager.getWindowSize().width
214
+ : recyclerViewManager.getWindowSize().height;
215
+ bufferForCompute = bufferForScroll * 2;
216
+ if (!layout) return [3 /*break*/, 7];
217
+ prevFinalOffset = Number.POSITIVE_INFINITY;
218
+ finalOffset = 0;
219
+ attempts = 0;
220
+ MAX_ATTEMPTS = 5;
221
+ OFFSET_TOLERANCE = 1;
222
+ _b.label = 1;
223
+ case 1:
224
+ layout_1 = recyclerViewManager.getLayout(index);
225
+ if (!layout_1 || isUnmounted.current)
226
+ return [3 /*break*/, 6];
227
+ offset = horizontal ? layout_1.x : layout_1.y;
228
+ finalOffset = offset;
229
+ // Apply viewPosition and viewOffset adjustments if provided
230
+ if (viewPosition !== undefined || viewOffset !== undefined) {
231
+ containerSize = horizontal
232
+ ? recyclerViewManager.getWindowSize().width
233
+ : recyclerViewManager.getWindowSize().height;
234
+ itemSize = horizontal ? layout_1.width : layout_1.height;
235
+ if (viewPosition !== undefined) {
236
+ // viewPosition: 0 = top, 0.5 = center, 1 = bottom
237
+ finalOffset =
238
+ offset - (containerSize - itemSize) * viewPosition;
239
+ }
240
+ if (viewOffset !== undefined) {
241
+ finalOffset += viewOffset;
242
+ }
243
+ }
244
+ // Check if offset has stabilized
245
+ if (Math.abs(prevFinalOffset - finalOffset) <= OFFSET_TOLERANCE) {
246
+ return [3 /*break*/, 6];
247
+ }
248
+ prevFinalOffset = finalOffset;
249
+ if (!animated) return [3 /*break*/, 3];
250
+ if (finalOffset > lastScrollOffset) {
251
+ lastScrollOffset = Math.max(finalOffset - bufferForCompute, lastScrollOffset);
252
+ }
253
+ else {
254
+ lastScrollOffset = Math.min(finalOffset + bufferForCompute, lastScrollOffset);
255
+ }
256
+ return [4 /*yield*/, updateScrollOffsetAsync(lastScrollOffset)];
257
+ case 2:
258
+ _b.sent();
259
+ _b.label = 3;
260
+ case 3: return [4 /*yield*/, updateScrollOffsetAsync(finalOffset)];
261
+ case 4:
262
+ _b.sent();
263
+ attempts++;
264
+ _b.label = 5;
265
+ case 5:
266
+ if (attempts < MAX_ATTEMPTS) return [3 /*break*/, 1];
267
+ _b.label = 6;
268
+ case 6:
269
+ if (animated) {
270
+ maxOffset = (horizontal
271
+ ? recyclerViewManager.getChildContainerDimensions().width
272
+ : recyclerViewManager.getChildContainerDimensions().height) -
273
+ (horizontal
274
+ ? recyclerViewManager.getWindowSize().width
275
+ : recyclerViewManager.getWindowSize().height);
276
+ if (finalOffset > maxOffset) {
277
+ finalOffset = maxOffset;
278
+ }
279
+ if (finalOffset > lastScrollOffset) {
280
+ lastScrollOffset = Math.max(finalOffset - bufferForScroll, lastScrollOffset);
281
+ }
282
+ else {
283
+ lastScrollOffset = Math.min(finalOffset + bufferForScroll, lastScrollOffset);
284
+ }
285
+ //We don't need to add firstItemOffset here as it will be added in scrollToOffset
286
+ handlerMethods.scrollToOffset({
287
+ offset: lastScrollOffset,
288
+ animated: false,
289
+ skipFirstItemOffset: false,
290
+ });
291
+ }
292
+ handlerMethods.scrollToOffset({
293
+ offset: finalOffset,
294
+ animated: animated,
295
+ skipFirstItemOffset: false,
296
+ });
297
+ _b.label = 7;
298
+ case 7:
299
+ setTimeout(function () {
300
+ pauseAdjustRef.current = false;
301
+ }, 200);
302
+ _b.label = 8;
303
+ case 8: return [2 /*return*/];
304
+ }
305
+ });
306
+ });
307
+ },
308
+ /**
309
+ * Scrolls to a specific item in the list.
310
+ * Finds the item's index and uses scrollToIndex internally.
311
+ */
312
+ scrollToItem: function (_a) {
313
+ var item = _a.item, animated = _a.animated, viewPosition = _a.viewPosition, viewOffset = _a.viewOffset;
314
+ if (scrollViewRef.current && data) {
315
+ // Find the index of the item in the data array
316
+ var index = Array.from(data).findIndex(function (dataItem) { return dataItem === item; });
317
+ if (index >= 0) {
318
+ handlerMethods.scrollToIndex({
319
+ index: index,
320
+ animated: animated,
321
+ viewPosition: viewPosition,
322
+ viewOffset: viewOffset,
323
+ });
324
+ }
325
+ }
326
+ },
327
+ // Utility methods for measuring header height / top padding
328
+ getFirstItemOffset: function () {
329
+ return recyclerViewManager.firstItemOffset;
330
+ },
331
+ getWindowSize: function () {
332
+ return recyclerViewManager.getWindowSize();
333
+ },
334
+ getLayout: function (index) {
335
+ return recyclerViewManager.getLayout(index);
336
+ },
337
+ getAbsoluteLastScrollOffset: function () {
338
+ return recyclerViewManager.getAbsoluteLastScrollOffset();
339
+ },
340
+ getChildContainerDimensions: function () {
341
+ return recyclerViewManager.getChildContainerDimensions();
342
+ },
343
+ recordInteraction: function () {
344
+ recyclerViewManager.recordInteraction();
345
+ },
346
+ getVisibleIndices: function () {
347
+ return recyclerViewManager.getVisibleIndices();
348
+ },
349
+ getFirstVisibleIndex: function () {
350
+ return recyclerViewManager.getVisibleIndices().startIndex;
351
+ },
352
+ recomputeViewableItems: function () {
353
+ recyclerViewManager.recomputeViewableItems();
354
+ },
355
+ /**
356
+ * Disables item recycling in preparation for layout animations.
357
+ */
358
+ prepareForLayoutAnimationRender: function () {
359
+ recyclerViewManager.disableRecycling = true;
360
+ },
361
+ };
362
+ }, [horizontal, data, recyclerViewManager]);
363
+ // Expose imperative methods through the ref
364
+ (0, react_1.useImperativeHandle)(ref, function () {
365
+ return tslib_1.__assign(tslib_1.__assign({}, scrollViewRef.current), handlerMethods);
366
+ }, [handlerMethods]);
367
+ return { applyContentOffset: applyContentOffset, applyInitialScrollIndex: applyInitialScrollIndex };
368
+ }
369
+ exports.useRecyclerViewController = useRecyclerViewController;
370
+ //# sourceMappingURL=useRecyclerViewController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecyclerViewController.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclerViewController.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { RecyclerViewProps } from "../RecyclerViewProps";
2
+ import { RecyclerViewManager } from "../RecyclerViewManager";
3
+ export declare const useRecyclerViewManager: <T>(props: RecyclerViewProps<T>) => {
4
+ recyclerViewManager: RecyclerViewManager<T>;
5
+ };
6
+ //# sourceMappingURL=useRecyclerViewManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecyclerViewManager.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclerViewManager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,eAAO,MAAM,sBAAsB;;CAwBlC,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRecyclerViewManager = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var RecyclerViewManager_1 = require("../RecyclerViewManager");
7
+ var useRecyclerViewManager = function (props) {
8
+ var _a = tslib_1.__read((0, react_1.useState)(function () { return new RecyclerViewManager_1.RecyclerViewManager(props); }), 1), recyclerViewManager = _a[0];
9
+ var data = props.data;
10
+ (0, react_1.useMemo)(function () {
11
+ recyclerViewManager.updateProps(props);
12
+ }, [props]);
13
+ /**
14
+ * When data changes, we need to process the data update before the render happens
15
+ */
16
+ (0, react_1.useMemo)(function () {
17
+ recyclerViewManager.processDataUpdate();
18
+ }, [data]);
19
+ (0, react_1.useEffect)(function () {
20
+ return function () {
21
+ recyclerViewManager.dispose();
22
+ };
23
+ }, []);
24
+ return { recyclerViewManager: recyclerViewManager };
25
+ };
26
+ exports.useRecyclerViewManager = useRecyclerViewManager;
27
+ //# sourceMappingURL=useRecyclerViewManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecyclerViewManager.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclerViewManager.ts"],"names":[],"mappings":";;;;AAAA,+BAAqD;AAGrD,8DAA6D;AAEtD,IAAM,sBAAsB,GAAG,UAAI,KAA2B;IAC7D,IAAA,KAAA,eAAwB,IAAA,gBAAQ,EACpC,cAAM,OAAA,IAAI,yCAAmB,CAAC,KAAK,CAAC,EAA9B,CAA8B,CACrC,IAAA,EAFM,mBAAmB,QAEzB,CAAC;IACM,IAAA,IAAI,GAAK,KAAK,KAAV,CAAW;IAEvB,IAAA,eAAO,EAAC;QACN,mBAAmB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAEZ;;OAEG;IACH,IAAA,eAAO,EAAC;QACN,mBAAmB,CAAC,iBAAiB,EAAE,CAAC;IAC1C,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,IAAA,iBAAS,EAAC;QACR,OAAO;YACL,mBAAmB,CAAC,OAAO,EAAE,CAAC;QAChC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,mBAAmB,qBAAA,EAAE,CAAC;AACjC,CAAC,CAAC;AAxBW,QAAA,sBAAsB,0BAwBjC"}
@@ -0,0 +1,16 @@
1
+ import { Dispatch, SetStateAction } from "react";
2
+ /**
3
+ * A custom hook that provides state management with automatic reset functionality.
4
+ * Similar to useState, but automatically resets the state when specified dependencies change.
5
+ * This is particularly useful for managing state that needs to be reset when certain props or values change when items are recycled.
6
+ * This also avoids another setState call on recycling and helps with performance.
7
+ *
8
+ * @param initialState - The initial state value or a function that returns the initial state
9
+ * @param deps - Array of dependencies that trigger a state reset when changed
10
+ * @param onReset - Optional callback function that is called when the state is reset
11
+ * @returns A tuple containing:
12
+ * - The current state value
13
+ * - A setState function that works like useState's setState
14
+ */
15
+ export declare function useRecyclingState<T>(initialState: T | (() => T), deps: React.DependencyList, onReset?: () => void): [T, Dispatch<SetStateAction<T>>];
16
+ //# sourceMappingURL=useRecyclingState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecyclingState.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclingState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAgC,MAAM,OAAO,CAAC;AAI/E;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EACjC,YAAY,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC3B,IAAI,EAAE,KAAK,CAAC,cAAc,EAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,GACnB,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAyClC"}
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useRecyclingState = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var useLayoutState_1 = require("./useLayoutState");
7
+ /**
8
+ * A custom hook that provides state management with automatic reset functionality.
9
+ * Similar to useState, but automatically resets the state when specified dependencies change.
10
+ * This is particularly useful for managing state that needs to be reset when certain props or values change when items are recycled.
11
+ * This also avoids another setState call on recycling and helps with performance.
12
+ *
13
+ * @param initialState - The initial state value or a function that returns the initial state
14
+ * @param deps - Array of dependencies that trigger a state reset when changed
15
+ * @param onReset - Optional callback function that is called when the state is reset
16
+ * @returns A tuple containing:
17
+ * - The current state value
18
+ * - A setState function that works like useState's setState
19
+ */
20
+ function useRecyclingState(initialState, deps, onReset) {
21
+ // Store the current state value in a ref to persist between renders
22
+ var valueStore = (0, react_1.useRef)();
23
+ // Use layoutState to trigger re-renders when state changes
24
+ var _a = tslib_1.__read((0, useLayoutState_1.useLayoutState)(0), 2), _ = _a[0], setCounter = _a[1];
25
+ // Reset state when dependencies change
26
+ (0, react_1.useMemo)(function () {
27
+ // Calculate initial value from function or direct value
28
+ var initialValue = typeof initialState === "function"
29
+ ? initialState()
30
+ : initialState;
31
+ valueStore.current = initialValue;
32
+ // Call onReset callback if provided
33
+ onReset === null || onReset === void 0 ? void 0 : onReset();
34
+ // eslint-disable-next-line react-hooks/exhaustive-deps
35
+ }, deps);
36
+ /**
37
+ * Proxy setState function that updates the stored value and triggers a re-render.
38
+ * Only triggers a re-render if the new value is different from the current value.
39
+ */
40
+ var setStateProxy = (0, react_1.useCallback)(function (newValue) {
41
+ // Calculate next state value from function or direct value
42
+ var nextState = typeof newValue === "function"
43
+ ? newValue(valueStore.current)
44
+ : newValue;
45
+ // Only update and trigger re-render if value has changed
46
+ if (nextState !== valueStore.current) {
47
+ valueStore.current = nextState;
48
+ setCounter(function (prev) { return prev + 1; });
49
+ }
50
+ }, [setCounter]);
51
+ return [valueStore.current, setStateProxy];
52
+ }
53
+ exports.useRecyclingState = useRecyclingState;
54
+ //# sourceMappingURL=useRecyclingState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRecyclingState.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useRecyclingState.ts"],"names":[],"mappings":";;;;AAAA,+BAA+E;AAE/E,mDAAkD;AAElD;;;;;;;;;;;;GAYG;AACH,SAAgB,iBAAiB,CAC/B,YAA2B,EAC3B,IAA0B,EAC1B,OAAoB;IAEpB,oEAAoE;IACpE,IAAM,UAAU,GAAG,IAAA,cAAM,GAAK,CAAC;IAC/B,2DAA2D;IACrD,IAAA,KAAA,eAAkB,IAAA,+BAAc,EAAC,CAAC,CAAC,IAAA,EAAlC,CAAC,QAAA,EAAE,UAAU,QAAqB,CAAC;IAE1C,uCAAuC;IACvC,IAAA,eAAO,EAAC;QACN,wDAAwD;QACxD,IAAM,YAAY,GAChB,OAAO,YAAY,KAAK,UAAU;YAChC,CAAC,CAAE,YAAwB,EAAE;YAC7B,CAAC,CAAC,YAAY,CAAC;QACnB,UAAU,CAAC,OAAO,GAAG,YAAY,CAAC;QAClC,oCAAoC;QACpC,OAAO,aAAP,OAAO,uBAAP,OAAO,EAAI,CAAC;QACZ,uDAAuD;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;IAET;;;OAGG;IACH,IAAM,aAAa,GAAG,IAAA,mBAAW,EAC/B,UAAC,QAAmC;QAClC,2DAA2D;QAC3D,IAAM,SAAS,GACb,OAAO,QAAQ,KAAK,UAAU;YAC5B,CAAC,CAAE,QAAgC,CAAC,UAAU,CAAC,OAAQ,CAAC;YACxD,CAAC,CAAC,QAAQ,CAAC;QAEf,yDAAyD;QACzD,IAAI,SAAS,KAAK,UAAU,CAAC,OAAO,EAAE;YACpC,UAAU,CAAC,OAAO,GAAG,SAAS,CAAC;YAC/B,UAAU,CAAC,UAAC,IAAI,IAAK,OAAA,IAAI,GAAG,CAAC,EAAR,CAAQ,CAAC,CAAC;SAChC;IACH,CAAC,EACD,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,OAAO,CAAC,UAAU,CAAC,OAAQ,EAAE,aAAa,CAAC,CAAC;AAC9C,CAAC;AA7CD,8CA6CC"}
@@ -0,0 +1,27 @@
1
+ import { Animated } from "react-native";
2
+ import { RecyclerViewProps } from "../RecyclerViewProps";
3
+ import React from "react";
4
+ /**
5
+ * Hook that manages secondary props and components for the RecyclerView.
6
+ * This hook handles the creation and management of:
7
+ * 1. Pull-to-refresh functionality
8
+ * 2. Header and footer components
9
+ * 3. Empty state component
10
+ * 4. Custom scroll component with animation support
11
+ *
12
+ * @param props - The RecyclerViewProps containing all configuration options
13
+ * @returns An object containing:
14
+ * - refreshControl: The pull-to-refresh control component
15
+ * - renderHeader: The header component renderer
16
+ * - renderFooter: The footer component renderer
17
+ * - renderEmpty: The empty state component renderer
18
+ * - CompatScrollView: The animated scroll component
19
+ */
20
+ export declare function useSecondaryProps<T>(props: RecyclerViewProps<T>): {
21
+ refreshControl: React.JSX.Element | undefined;
22
+ renderHeader: React.JSX.Element | null;
23
+ renderFooter: React.JSX.Element | null;
24
+ renderEmpty: React.ReactElement<any, string | React.JSXElementConstructor<any>> | null;
25
+ CompatScrollView: Animated.AnimatedComponent<Animated.AnimatedComponent<typeof import("react-native").ScrollView>>;
26
+ };
27
+ //# sourceMappingURL=useSecondaryProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSecondaryProps.d.ts","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useSecondaryProps.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;;;;;;EA8F/D"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSecondaryProps = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_native_1 = require("react-native");
6
+ var react_1 = require("react");
7
+ var componentUtils_1 = require("../utils/componentUtils");
8
+ var CompatView_1 = require("../components/CompatView");
9
+ var CompatScroller_1 = require("../components/CompatScroller");
10
+ var react_2 = tslib_1.__importDefault(require("react"));
11
+ /**
12
+ * Hook that manages secondary props and components for the RecyclerView.
13
+ * This hook handles the creation and management of:
14
+ * 1. Pull-to-refresh functionality
15
+ * 2. Header and footer components
16
+ * 3. Empty state component
17
+ * 4. Custom scroll component with animation support
18
+ *
19
+ * @param props - The RecyclerViewProps containing all configuration options
20
+ * @returns An object containing:
21
+ * - refreshControl: The pull-to-refresh control component
22
+ * - renderHeader: The header component renderer
23
+ * - renderFooter: The footer component renderer
24
+ * - renderEmpty: The empty state component renderer
25
+ * - CompatScrollView: The animated scroll component
26
+ */
27
+ function useSecondaryProps(props) {
28
+ var ListHeaderComponent = props.ListHeaderComponent, ListHeaderComponentStyle = props.ListHeaderComponentStyle, ListFooterComponent = props.ListFooterComponent, ListFooterComponentStyle = props.ListFooterComponentStyle, ListEmptyComponent = props.ListEmptyComponent, renderScrollComponent = props.renderScrollComponent, refreshing = props.refreshing, progressViewOffset = props.progressViewOffset, onRefresh = props.onRefresh, data = props.data;
29
+ /**
30
+ * Creates the refresh control component if onRefresh is provided.
31
+ */
32
+ var refreshControl = (0, react_1.useMemo)(function () {
33
+ if (onRefresh) {
34
+ return (react_2.default.createElement(react_native_1.RefreshControl, { refreshing: Boolean(refreshing), progressViewOffset: progressViewOffset, onRefresh: onRefresh }));
35
+ }
36
+ return undefined;
37
+ }, [onRefresh, refreshing, progressViewOffset]);
38
+ /**
39
+ * Creates the header component with optional styling.
40
+ */
41
+ var renderHeader = (0, react_1.useMemo)(function () {
42
+ if (!ListHeaderComponent) {
43
+ return null;
44
+ }
45
+ return (react_2.default.createElement(CompatView_1.CompatView, { style: ListHeaderComponentStyle }, (0, componentUtils_1.getValidComponent)(ListHeaderComponent)));
46
+ }, [ListHeaderComponent, ListHeaderComponentStyle]);
47
+ /**
48
+ * Creates the footer component with optional styling.
49
+ */
50
+ var renderFooter = (0, react_1.useMemo)(function () {
51
+ if (!ListFooterComponent) {
52
+ return null;
53
+ }
54
+ return (react_2.default.createElement(CompatView_1.CompatView, { style: ListFooterComponentStyle }, (0, componentUtils_1.getValidComponent)(ListFooterComponent)));
55
+ }, [ListFooterComponent, ListFooterComponentStyle]);
56
+ /**
57
+ * Creates the empty state component when there's no data.
58
+ * Only rendered when ListEmptyComponent is provided and data is empty.
59
+ */
60
+ var renderEmpty = (0, react_1.useMemo)(function () {
61
+ if (!ListEmptyComponent || (data && data.length > 0)) {
62
+ return null;
63
+ }
64
+ return (0, componentUtils_1.getValidComponent)(ListEmptyComponent);
65
+ }, [ListEmptyComponent, data]);
66
+ /**
67
+ * Creates an animated scroll component based on the provided renderScrollComponent.
68
+ * If no custom component is provided, uses the default CompatAnimatedScroller.
69
+ */
70
+ var CompatScrollView = (0, react_1.useMemo)(function () {
71
+ var scrollComponent = CompatScroller_1.CompatAnimatedScroller;
72
+ if (typeof renderScrollComponent === "function") {
73
+ // Create a forwarded ref wrapper for the custom scroll component
74
+ scrollComponent = react_2.default.forwardRef(function (props, ref) {
75
+ return renderScrollComponent(tslib_1.__assign(tslib_1.__assign({}, props), { ref: ref }));
76
+ });
77
+ }
78
+ else if (renderScrollComponent) {
79
+ scrollComponent = renderScrollComponent;
80
+ }
81
+ // Wrap the scroll component with Animated.createAnimatedComponent
82
+ return react_native_1.Animated.createAnimatedComponent(scrollComponent);
83
+ }, [renderScrollComponent]);
84
+ return {
85
+ refreshControl: refreshControl,
86
+ renderHeader: renderHeader,
87
+ renderFooter: renderFooter,
88
+ renderEmpty: renderEmpty,
89
+ CompatScrollView: CompatScrollView,
90
+ };
91
+ }
92
+ exports.useSecondaryProps = useSecondaryProps;
93
+ //# sourceMappingURL=useSecondaryProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSecondaryProps.js","sourceRoot":"","sources":["../../../src/recyclerview/hooks/useSecondaryProps.tsx"],"names":[],"mappings":"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"}