@tamagui/react-native-web-lite 1.116.2 → 1.116.4

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 (202) hide show
  1. package/dist/cjs/Batchinator/index.cjs +68 -0
  2. package/dist/cjs/Batchinator/index.js +57 -0
  3. package/dist/cjs/Batchinator/index.js.map +6 -0
  4. package/dist/cjs/Batchinator/index.native.js +92 -0
  5. package/dist/cjs/Batchinator/index.native.js.map +6 -0
  6. package/dist/cjs/FlatList.cjs +196 -0
  7. package/dist/cjs/FlatList.js +193 -0
  8. package/dist/cjs/FlatList.js.map +6 -0
  9. package/dist/cjs/FlatList.native.js +256 -0
  10. package/dist/cjs/FlatList.native.js.map +6 -0
  11. package/dist/cjs/InteractionManager/TaskQueue.cjs +88 -0
  12. package/dist/cjs/InteractionManager/TaskQueue.js +76 -0
  13. package/dist/cjs/InteractionManager/TaskQueue.js.map +6 -0
  14. package/dist/cjs/InteractionManager/TaskQueue.native.js +134 -0
  15. package/dist/cjs/InteractionManager/TaskQueue.native.js.map +6 -0
  16. package/dist/cjs/InteractionManager/index.cjs +114 -0
  17. package/dist/cjs/InteractionManager/index.js +95 -0
  18. package/dist/cjs/InteractionManager/index.js.map +6 -0
  19. package/dist/cjs/InteractionManager/index.native.js +99 -0
  20. package/dist/cjs/InteractionManager/index.native.js.map +6 -0
  21. package/dist/cjs/index.cjs +7 -7
  22. package/dist/cjs/index.js +6 -6
  23. package/dist/cjs/index.js.map +1 -1
  24. package/dist/cjs/index.native.js +6 -6
  25. package/dist/cjs/index.native.js.map +1 -1
  26. package/dist/cjs/vendor/react-native/FillRateHelper/index.cjs +138 -0
  27. package/dist/cjs/vendor/react-native/FillRateHelper/index.js +124 -0
  28. package/dist/cjs/vendor/react-native/FillRateHelper/index.js.map +6 -0
  29. package/dist/cjs/vendor/react-native/FillRateHelper/index.native.js +158 -0
  30. package/dist/cjs/vendor/react-native/FillRateHelper/index.native.js.map +6 -0
  31. package/dist/cjs/vendor/react-native/Utilities/clamp.cjs +29 -0
  32. package/dist/cjs/vendor/react-native/Utilities/clamp.js +24 -0
  33. package/dist/cjs/vendor/react-native/Utilities/clamp.js.map +6 -0
  34. package/dist/cjs/vendor/react-native/Utilities/clamp.native.js +25 -0
  35. package/dist/cjs/vendor/react-native/Utilities/clamp.native.js.map +6 -0
  36. package/dist/cjs/vendor/react-native/ViewabilityHelper.cjs +133 -0
  37. package/dist/cjs/vendor/react-native/ViewabilityHelper.js +144 -0
  38. package/dist/cjs/vendor/react-native/ViewabilityHelper.js.map +6 -0
  39. package/dist/cjs/vendor/react-native/ViewabilityHelper.native.js +199 -0
  40. package/dist/cjs/vendor/react-native/ViewabilityHelper.native.js.map +6 -0
  41. package/dist/cjs/vendor/react-native/VirtualizeUtils/index.cjs +106 -0
  42. package/dist/cjs/vendor/react-native/VirtualizeUtils/index.js +86 -0
  43. package/dist/cjs/vendor/react-native/VirtualizeUtils/index.js.map +6 -0
  44. package/dist/cjs/vendor/react-native/VirtualizeUtils/index.native.js +95 -0
  45. package/dist/cjs/vendor/react-native/VirtualizeUtils/index.native.js.map +6 -0
  46. package/dist/cjs/vendor/react-native/VirtualizedList/CellRenderMask.cjs +81 -0
  47. package/dist/cjs/vendor/react-native/VirtualizedList/CellRenderMask.js +84 -0
  48. package/dist/cjs/vendor/react-native/VirtualizedList/CellRenderMask.js.map +6 -0
  49. package/dist/cjs/vendor/react-native/VirtualizedList/CellRenderMask.native.js +125 -0
  50. package/dist/cjs/vendor/react-native/VirtualizedList/CellRenderMask.native.js.map +6 -0
  51. package/dist/cjs/vendor/react-native/VirtualizedList/ChildListCollection.cjs +56 -0
  52. package/dist/cjs/vendor/react-native/VirtualizedList/ChildListCollection.js +59 -0
  53. package/dist/cjs/vendor/react-native/VirtualizedList/ChildListCollection.js.map +6 -0
  54. package/dist/cjs/vendor/react-native/VirtualizedList/ChildListCollection.native.js +153 -0
  55. package/dist/cjs/vendor/react-native/VirtualizedList/ChildListCollection.native.js.map +6 -0
  56. package/dist/cjs/vendor/react-native/VirtualizedList/StateSafePureComponent.cjs +80 -0
  57. package/dist/cjs/vendor/react-native/VirtualizedList/StateSafePureComponent.js +74 -0
  58. package/dist/cjs/vendor/react-native/VirtualizedList/StateSafePureComponent.js.map +6 -0
  59. package/dist/cjs/vendor/react-native/VirtualizedList/StateSafePureComponent.native.js +163 -0
  60. package/dist/cjs/vendor/react-native/VirtualizedList/StateSafePureComponent.native.js.map +6 -0
  61. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.cjs +164 -0
  62. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.js +149 -0
  63. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.js.map +6 -0
  64. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.native.js +245 -0
  65. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.native.js.map +6 -0
  66. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListContext.cjs +84 -0
  67. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListContext.js +72 -0
  68. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListContext.js.map +6 -0
  69. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListContext.native.js +85 -0
  70. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListContext.native.js.map +6 -0
  71. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListProps.cjs +16 -0
  72. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListProps.js +14 -0
  73. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListProps.js.map +6 -0
  74. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListProps.native.js +15 -0
  75. package/dist/cjs/vendor/react-native/VirtualizedList/VirtualizedListProps.native.js.map +6 -0
  76. package/dist/cjs/vendor/react-native/VirtualizedList/index.cjs +1003 -0
  77. package/dist/cjs/vendor/react-native/VirtualizedList/index.js +1021 -0
  78. package/dist/cjs/vendor/react-native/VirtualizedList/index.js.map +6 -0
  79. package/dist/cjs/vendor/react-native/VirtualizedList/index.native.js +1075 -0
  80. package/dist/cjs/vendor/react-native/VirtualizedList/index.native.js.map +6 -0
  81. package/dist/cjs/vendor/react-native/deepDiffer/index.cjs +41 -0
  82. package/dist/cjs/vendor/react-native/deepDiffer/index.js +47 -0
  83. package/dist/cjs/vendor/react-native/deepDiffer/index.js.map +6 -0
  84. package/dist/cjs/vendor/react-native/deepDiffer/index.native.js +48 -0
  85. package/dist/cjs/vendor/react-native/deepDiffer/index.native.js.map +6 -0
  86. package/dist/esm/Batchinator/index.js +33 -0
  87. package/dist/esm/Batchinator/index.js.map +6 -0
  88. package/dist/esm/Batchinator/index.mjs +34 -0
  89. package/dist/esm/Batchinator/index.mjs.map +1 -0
  90. package/dist/esm/Batchinator/index.native.js +67 -0
  91. package/dist/esm/Batchinator/index.native.js.map +6 -0
  92. package/dist/esm/FlatList.js +176 -0
  93. package/dist/esm/FlatList.js.map +6 -0
  94. package/dist/esm/FlatList.mjs +162 -0
  95. package/dist/esm/FlatList.mjs.map +1 -0
  96. package/dist/esm/FlatList.native.js +238 -0
  97. package/dist/esm/FlatList.native.js.map +6 -0
  98. package/dist/esm/InteractionManager/TaskQueue.js +60 -0
  99. package/dist/esm/InteractionManager/TaskQueue.js.map +6 -0
  100. package/dist/esm/InteractionManager/TaskQueue.mjs +65 -0
  101. package/dist/esm/InteractionManager/TaskQueue.mjs.map +1 -0
  102. package/dist/esm/InteractionManager/TaskQueue.native.js +117 -0
  103. package/dist/esm/InteractionManager/TaskQueue.native.js.map +6 -0
  104. package/dist/esm/InteractionManager/index.js +73 -0
  105. package/dist/esm/InteractionManager/index.js.map +6 -0
  106. package/dist/esm/InteractionManager/index.mjs +80 -0
  107. package/dist/esm/InteractionManager/index.mjs.map +1 -0
  108. package/dist/esm/InteractionManager/index.native.js +77 -0
  109. package/dist/esm/InteractionManager/index.native.js.map +6 -0
  110. package/dist/esm/index.js +2 -2
  111. package/dist/esm/index.mjs +2 -2
  112. package/dist/esm/index.native.js +2 -2
  113. package/dist/esm/vendor/react-native/FillRateHelper/index.js +108 -0
  114. package/dist/esm/vendor/react-native/FillRateHelper/index.js.map +6 -0
  115. package/dist/esm/vendor/react-native/FillRateHelper/index.mjs +115 -0
  116. package/dist/esm/vendor/react-native/FillRateHelper/index.mjs.map +1 -0
  117. package/dist/esm/vendor/react-native/FillRateHelper/index.native.js +141 -0
  118. package/dist/esm/vendor/react-native/FillRateHelper/index.native.js.map +6 -0
  119. package/dist/esm/vendor/react-native/Utilities/clamp.js +8 -0
  120. package/dist/esm/vendor/react-native/Utilities/clamp.js.map +6 -0
  121. package/dist/esm/vendor/react-native/Utilities/clamp.mjs +6 -0
  122. package/dist/esm/vendor/react-native/Utilities/clamp.mjs.map +1 -0
  123. package/dist/esm/vendor/react-native/Utilities/clamp.native.js +8 -0
  124. package/dist/esm/vendor/react-native/Utilities/clamp.native.js.map +6 -0
  125. package/dist/esm/vendor/react-native/ViewabilityHelper.js +128 -0
  126. package/dist/esm/vendor/react-native/ViewabilityHelper.js.map +6 -0
  127. package/dist/esm/vendor/react-native/ViewabilityHelper.mjs +110 -0
  128. package/dist/esm/vendor/react-native/ViewabilityHelper.mjs.map +1 -0
  129. package/dist/esm/vendor/react-native/ViewabilityHelper.native.js +182 -0
  130. package/dist/esm/vendor/react-native/ViewabilityHelper.native.js.map +6 -0
  131. package/dist/esm/vendor/react-native/VirtualizeUtils/index.js +70 -0
  132. package/dist/esm/vendor/react-native/VirtualizeUtils/index.js.map +6 -0
  133. package/dist/esm/vendor/react-native/VirtualizeUtils/index.mjs +80 -0
  134. package/dist/esm/vendor/react-native/VirtualizeUtils/index.mjs.map +1 -0
  135. package/dist/esm/vendor/react-native/VirtualizeUtils/index.native.js +71 -0
  136. package/dist/esm/vendor/react-native/VirtualizeUtils/index.native.js.map +6 -0
  137. package/dist/esm/vendor/react-native/VirtualizedList/CellRenderMask.js +68 -0
  138. package/dist/esm/vendor/react-native/VirtualizedList/CellRenderMask.js.map +6 -0
  139. package/dist/esm/vendor/react-native/VirtualizedList/CellRenderMask.mjs +58 -0
  140. package/dist/esm/vendor/react-native/VirtualizedList/CellRenderMask.mjs.map +1 -0
  141. package/dist/esm/vendor/react-native/VirtualizedList/CellRenderMask.native.js +104 -0
  142. package/dist/esm/vendor/react-native/VirtualizedList/CellRenderMask.native.js.map +6 -0
  143. package/dist/esm/vendor/react-native/VirtualizedList/ChildListCollection.js +43 -0
  144. package/dist/esm/vendor/react-native/VirtualizedList/ChildListCollection.js.map +6 -0
  145. package/dist/esm/vendor/react-native/VirtualizedList/ChildListCollection.mjs +33 -0
  146. package/dist/esm/vendor/react-native/VirtualizedList/ChildListCollection.mjs.map +1 -0
  147. package/dist/esm/vendor/react-native/VirtualizedList/ChildListCollection.native.js +136 -0
  148. package/dist/esm/vendor/react-native/VirtualizedList/ChildListCollection.native.js.map +6 -0
  149. package/dist/esm/vendor/react-native/VirtualizedList/StateSafePureComponent.js +51 -0
  150. package/dist/esm/vendor/react-native/VirtualizedList/StateSafePureComponent.js.map +6 -0
  151. package/dist/esm/vendor/react-native/VirtualizedList/StateSafePureComponent.mjs +46 -0
  152. package/dist/esm/vendor/react-native/VirtualizedList/StateSafePureComponent.mjs.map +1 -0
  153. package/dist/esm/vendor/react-native/VirtualizedList/StateSafePureComponent.native.js +139 -0
  154. package/dist/esm/vendor/react-native/VirtualizedList/StateSafePureComponent.native.js.map +6 -0
  155. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.js +132 -0
  156. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.js.map +6 -0
  157. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.mjs +130 -0
  158. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.mjs.map +1 -0
  159. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.native.js +224 -0
  160. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.native.js.map +6 -0
  161. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListContext.js +50 -0
  162. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListContext.js.map +6 -0
  163. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListContext.mjs +47 -0
  164. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListContext.mjs.map +1 -0
  165. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListContext.native.js +56 -0
  166. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListContext.native.js.map +6 -0
  167. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListProps.js +1 -0
  168. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListProps.js.map +6 -0
  169. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListProps.mjs +2 -0
  170. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListProps.mjs.map +1 -0
  171. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListProps.native.js +1 -0
  172. package/dist/esm/vendor/react-native/VirtualizedList/VirtualizedListProps.native.js.map +6 -0
  173. package/dist/esm/vendor/react-native/VirtualizedList/index.js +1016 -0
  174. package/dist/esm/vendor/react-native/VirtualizedList/index.js.map +6 -0
  175. package/dist/esm/vendor/react-native/VirtualizedList/index.mjs +969 -0
  176. package/dist/esm/vendor/react-native/VirtualizedList/index.mjs.map +1 -0
  177. package/dist/esm/vendor/react-native/VirtualizedList/index.native.js +1065 -0
  178. package/dist/esm/vendor/react-native/VirtualizedList/index.native.js.map +6 -0
  179. package/dist/esm/vendor/react-native/deepDiffer/index.js +31 -0
  180. package/dist/esm/vendor/react-native/deepDiffer/index.js.map +6 -0
  181. package/dist/esm/vendor/react-native/deepDiffer/index.mjs +18 -0
  182. package/dist/esm/vendor/react-native/deepDiffer/index.mjs.map +1 -0
  183. package/dist/esm/vendor/react-native/deepDiffer/index.native.js +31 -0
  184. package/dist/esm/vendor/react-native/deepDiffer/index.native.js.map +6 -0
  185. package/package.json +6 -6
  186. package/src/Batchinator/index.tsx +78 -0
  187. package/src/FlatList.tsx +330 -0
  188. package/src/InteractionManager/TaskQueue.tsx +114 -0
  189. package/src/InteractionManager/index.tsx +139 -0
  190. package/src/index.tsx +2 -2
  191. package/src/vendor/react-native/FillRateHelper/index.tsx +218 -0
  192. package/src/vendor/react-native/Utilities/clamp.ts +21 -0
  193. package/src/vendor/react-native/ViewabilityHelper.ts +291 -0
  194. package/src/vendor/react-native/VirtualizeUtils/index.tsx +212 -0
  195. package/src/vendor/react-native/VirtualizedList/CellRenderMask.ts +147 -0
  196. package/src/vendor/react-native/VirtualizedList/ChildListCollection.tsx +73 -0
  197. package/src/vendor/react-native/VirtualizedList/StateSafePureComponent.tsx +79 -0
  198. package/src/vendor/react-native/VirtualizedList/VirtualizedListCellRenderer.tsx +210 -0
  199. package/src/vendor/react-native/VirtualizedList/VirtualizedListContext.tsx +116 -0
  200. package/src/vendor/react-native/VirtualizedList/VirtualizedListProps.ts +130 -0
  201. package/src/vendor/react-native/VirtualizedList/index.tsx +1797 -0
  202. package/src/vendor/react-native/deepDiffer/index.tsx +56 -0
@@ -0,0 +1,1016 @@
1
+ import { invariant, StyleSheet } from "@tamagui/react-native-web-internals";
2
+ import ViewabilityHelper from "../ViewabilityHelper";
3
+ import { CellRenderMask } from "./CellRenderMask";
4
+ import StateSafePureComponent from "./StateSafePureComponent";
5
+ import {
6
+ VirtualizedListCellContextProvider,
7
+ VirtualizedListContext,
8
+ VirtualizedListContextProvider
9
+ } from "./VirtualizedListContext";
10
+ import ScrollView from "../../../ScrollView/ScrollViewBase";
11
+ import View from "../../../View";
12
+ import CellRenderer from "./VirtualizedListCellRenderer";
13
+ import FillRateHelper from "../FillRateHelper";
14
+ import ChildListCollection from "./ChildListCollection";
15
+ import React from "react";
16
+ import clamp from "../Utilities/clamp";
17
+ import { keyExtractor as defaultKeyExtractor } from "../VirtualizeUtils";
18
+ import Batchinator from "../../../Batchinator";
19
+ import RefreshControl from "../../../RefreshControl";
20
+ import { jsx, jsxs } from "react/jsx-runtime";
21
+ const __DEV__ = process.env.NODE_ENV !== "production", ON_EDGE_REACHED_EPSILON = 1e-3;
22
+ let _usedIndexForKey = !1, _keylessItemComponentName = "";
23
+ function horizontalOrDefault(horizontal) {
24
+ return horizontal ?? !1;
25
+ }
26
+ function initialNumToRenderOrDefault(initialNumToRender) {
27
+ return initialNumToRender ?? 10;
28
+ }
29
+ function maxToRenderPerBatchOrDefault(maxToRenderPerBatch) {
30
+ return maxToRenderPerBatch ?? 10;
31
+ }
32
+ function onStartReachedThresholdOrDefault(onStartReachedThreshold) {
33
+ return onStartReachedThreshold ?? 2;
34
+ }
35
+ function onEndReachedThresholdOrDefault(onEndReachedThreshold) {
36
+ return onEndReachedThreshold ?? 2;
37
+ }
38
+ function getScrollingThreshold(threshold, visibleLength) {
39
+ return threshold * visibleLength / 2;
40
+ }
41
+ function scrollEventThrottleOrDefault(scrollEventThrottle) {
42
+ return scrollEventThrottle ?? 50;
43
+ }
44
+ function windowSizeOrDefault(windowSize) {
45
+ return windowSize ?? 21;
46
+ }
47
+ function findLastWhere(arr, predicate) {
48
+ for (let i = arr.length - 1; i >= 0; i--)
49
+ if (predicate(arr[i]))
50
+ return arr[i];
51
+ return null;
52
+ }
53
+ class VirtualizedList extends StateSafePureComponent {
54
+ static contextType = VirtualizedListContext;
55
+ // scrollToEnd may be janky without getItemLayout prop
56
+ scrollToEnd(params) {
57
+ const animated = params ? params.animated : !0, veryLast = this.props.getItemCount(this.props.data) - 1;
58
+ if (veryLast < 0)
59
+ return;
60
+ const frame = this.__getFrameMetricsApprox(veryLast, this.props), offset = Math.max(
61
+ 0,
62
+ frame.offset + frame.length + this._footerLength - this._scrollMetrics.visibleLength
63
+ );
64
+ if (this._scrollRef != null) {
65
+ if (this._scrollRef.scrollTo == null) {
66
+ console.warn(
67
+ "No scrollTo method provided. This may be because you have two nested VirtualizedLists with the same orientation, or because you are using a custom component that does not implement scrollTo."
68
+ );
69
+ return;
70
+ }
71
+ this._scrollRef.scrollTo(
72
+ horizontalOrDefault(this.props.horizontal) ? { x: offset, animated } : { y: offset, animated }
73
+ );
74
+ }
75
+ }
76
+ // scrollToIndex may be janky without getItemLayout prop
77
+ scrollToIndex(params) {
78
+ const { data, horizontal, getItemCount, getItemLayout, onScrollToIndexFailed } = this.props, { animated, index, viewOffset, viewPosition } = params;
79
+ if (invariant(
80
+ index >= 0,
81
+ `scrollToIndex out of range: requested index ${index} but minimum is 0`
82
+ ), invariant(
83
+ getItemCount(data) >= 1,
84
+ `scrollToIndex out of range: item length ${getItemCount(data)} but minimum is 1`
85
+ ), invariant(
86
+ index < getItemCount(data),
87
+ `scrollToIndex out of range: requested index ${index} is out of 0 to ${getItemCount(data) - 1}`
88
+ ), !getItemLayout && index > this._highestMeasuredFrameIndex) {
89
+ invariant(
90
+ !!onScrollToIndexFailed,
91
+ "scrollToIndex should be used in conjunction with getItemLayout or onScrollToIndexFailed, otherwise there is no way to know the location of offscreen indices or handle failures."
92
+ ), onScrollToIndexFailed({
93
+ averageItemLength: this._averageCellLength,
94
+ highestMeasuredFrameIndex: this._highestMeasuredFrameIndex,
95
+ index
96
+ });
97
+ return;
98
+ }
99
+ const frame = this.__getFrameMetricsApprox(Math.floor(index), this.props), offset = Math.max(
100
+ 0,
101
+ // @ts-ignore
102
+ this._getOffsetApprox(index, this.props) - (viewPosition || 0) * (this._scrollMetrics.visibleLength - frame.length)
103
+ ) - (viewOffset || 0);
104
+ if (this._scrollRef != null) {
105
+ if (this._scrollRef.scrollTo == null) {
106
+ console.warn(
107
+ "No scrollTo method provided. This may be because you have two nested VirtualizedLists with the same orientation, or because you are using a custom component that does not implement scrollTo."
108
+ );
109
+ return;
110
+ }
111
+ this._scrollRef.scrollTo(
112
+ horizontal ? { x: offset, animated } : { y: offset, animated }
113
+ );
114
+ }
115
+ }
116
+ // scrollToItem may be janky without getItemLayout prop. Required linear scan through items -
117
+ // use scrollToIndex instead if possible.
118
+ scrollToItem(params) {
119
+ const { item } = params, { data, getItem, getItemCount } = this.props, itemCount = getItemCount(data);
120
+ for (let index = 0; index < itemCount; index++)
121
+ if (getItem(data, index) === item) {
122
+ this.scrollToIndex({ ...params, index });
123
+ break;
124
+ }
125
+ }
126
+ /**
127
+ * Scroll to a specific content pixel offset in the list.
128
+ *
129
+ * Param `offset` expects the offset to scroll to.
130
+ * In case of `horizontal` is true, the offset is the x-value,
131
+ * in any other case the offset is the y-value.
132
+ *
133
+ * Param `animated` (`true` by default) defines whether the list
134
+ * should do an animation while scrolling.
135
+ */
136
+ scrollToOffset(params) {
137
+ const { animated, offset } = params;
138
+ if (this._scrollRef != null) {
139
+ if (this._scrollRef.scrollTo == null) {
140
+ console.warn(
141
+ "No scrollTo method provided. This may be because you have two nested VirtualizedLists with the same orientation, or because you are using a custom component that does not implement scrollTo."
142
+ );
143
+ return;
144
+ }
145
+ this._scrollRef.scrollTo(
146
+ horizontalOrDefault(this.props.horizontal) ? { x: offset, animated } : { y: offset, animated }
147
+ );
148
+ }
149
+ }
150
+ recordInteraction() {
151
+ this._nestedChildLists.forEach((childList) => {
152
+ childList.recordInteraction();
153
+ }), this._viewabilityTuples.forEach((t) => {
154
+ t.viewabilityHelper.recordInteraction();
155
+ }), this._updateViewableItems(this.props, this.state.cellsAroundViewport);
156
+ }
157
+ flashScrollIndicators() {
158
+ this._scrollRef != null && this._scrollRef.flashScrollIndicators();
159
+ }
160
+ /**
161
+ * Provides a handle to the underlying scroll responder.
162
+ * Note that `this._scrollRef` might not be a `ScrollView`, so we
163
+ * need to check that it responds to `getScrollResponder` before calling it.
164
+ */
165
+ getScrollResponder() {
166
+ return this._scrollRef && this._scrollRef.getScrollResponder ? this._scrollRef.getScrollResponder() : null;
167
+ }
168
+ getScrollableNode() {
169
+ return this._scrollRef && this._scrollRef.getScrollableNode ? this._scrollRef.getScrollableNode() : this._scrollRef;
170
+ }
171
+ getScrollRef() {
172
+ return this._scrollRef && this._scrollRef.getScrollRef ? this._scrollRef.getScrollRef() : this._scrollRef;
173
+ }
174
+ _getCellKey() {
175
+ return this.context?.cellKey || "rootList";
176
+ }
177
+ _getScrollMetrics = () => this._scrollMetrics;
178
+ hasMore() {
179
+ return this._hasMore;
180
+ }
181
+ _getOutermostParentListRef = () => this._isNestedWithSameOrientation() ? this.context.getOutermostParentListRef() : this;
182
+ _registerAsNestedChild = (childList) => {
183
+ this._nestedChildLists.add(childList.ref, childList.cellKey), this._hasInteracted && childList.ref.recordInteraction();
184
+ };
185
+ _unregisterAsNestedChild = (childList) => {
186
+ this._nestedChildLists.remove(childList.ref);
187
+ };
188
+ invertedWheelEventHandler;
189
+ constructor(props) {
190
+ if (super(props), this._checkProps(props), this._fillRateHelper = new FillRateHelper(this._getFrameMetrics), this._updateCellsToRenderBatcher = new Batchinator(
191
+ this._updateCellsToRender,
192
+ this.props.updateCellsBatchingPeriod ?? 50
193
+ ), this.props.viewabilityConfigCallbackPairs)
194
+ this._viewabilityTuples = this.props.viewabilityConfigCallbackPairs.map((pair) => ({
195
+ viewabilityHelper: new ViewabilityHelper(pair.viewabilityConfig),
196
+ onViewableItemsChanged: pair.onViewableItemsChanged
197
+ }));
198
+ else {
199
+ const { onViewableItemsChanged, viewabilityConfig } = this.props;
200
+ onViewableItemsChanged && this._viewabilityTuples.push({
201
+ viewabilityHelper: new ViewabilityHelper(viewabilityConfig),
202
+ onViewableItemsChanged
203
+ });
204
+ }
205
+ const initialRenderRegion = VirtualizedList._initialRenderRegion(props);
206
+ this.state = {
207
+ cellsAroundViewport: initialRenderRegion,
208
+ renderMask: VirtualizedList._createRenderMask(props, initialRenderRegion)
209
+ }, this.invertedWheelEventHandler = (ev) => {
210
+ const scrollOffset = this.props.horizontal ? ev.target.scrollLeft : ev.target.scrollTop, scrollLength = this.props.horizontal ? ev.target.scrollWidth : ev.target.scrollHeight, clientLength = this.props.horizontal ? ev.target.clientWidth : ev.target.clientHeight, isEventTargetScrollable = scrollLength > clientLength, delta = this.props.horizontal ? ev.deltaX || ev.wheelDeltaX : ev.deltaY || ev.wheelDeltaY;
211
+ let leftoverDelta = delta;
212
+ isEventTargetScrollable && (leftoverDelta = delta < 0 ? Math.min(delta + scrollOffset, 0) : Math.max(delta - (scrollLength - clientLength - scrollOffset), 0));
213
+ const targetDelta = delta - leftoverDelta;
214
+ if (this.props.inverted && this._scrollRef && this._scrollRef.getScrollableNode) {
215
+ const node = this._scrollRef.getScrollableNode();
216
+ if (this.props.horizontal) {
217
+ ev.target.scrollLeft += targetDelta;
218
+ const nextScrollLeft = node.scrollLeft - leftoverDelta;
219
+ node.scrollLeft = this.props.getItemLayout ? nextScrollLeft : Math.min(nextScrollLeft, this._totalCellLength);
220
+ } else {
221
+ ev.target.scrollTop += targetDelta;
222
+ const nextScrollTop = node.scrollTop - leftoverDelta;
223
+ node.scrollTop = this.props.getItemLayout ? nextScrollTop : Math.min(nextScrollTop, this._totalCellLength);
224
+ }
225
+ ev.preventDefault();
226
+ }
227
+ };
228
+ }
229
+ _checkProps(props) {
230
+ const { onScroll, windowSize, getItemCount, data, initialScrollIndex } = props;
231
+ invariant(
232
+ !(onScroll && onScroll.__isNative),
233
+ "Components based on VirtualizedList must be wrapped with Animated.createAnimatedComponent to support native onScroll events with useNativeDriver"
234
+ ), invariant(
235
+ windowSizeOrDefault(windowSize) > 0,
236
+ "VirtualizedList: The windowSize prop must be present and set to a value greater than 0."
237
+ ), invariant(getItemCount, 'VirtualizedList: The "getItemCount" prop must be provided');
238
+ const itemCount = getItemCount(data);
239
+ if (initialScrollIndex != null && !this._hasTriggeredInitialScrollToIndex && (initialScrollIndex < 0 || itemCount > 0 && initialScrollIndex >= itemCount) && !this._hasWarned.initialScrollIndex && (console.warn(
240
+ `initialScrollIndex "${initialScrollIndex}" is not valid (list has ${itemCount} items)`
241
+ ), this._hasWarned.initialScrollIndex = !0), __DEV__ && !this._hasWarned.flexWrap) {
242
+ const flatStyles = StyleSheet.flatten(this.props.contentContainerStyle);
243
+ flatStyles != null && flatStyles.flexWrap === "wrap" && (console.warn(
244
+ "`flexWrap: `wrap`` is not supported with the `VirtualizedList` components.Consider using `numColumns` with `FlatList` instead."
245
+ ), this._hasWarned.flexWrap = !0);
246
+ }
247
+ }
248
+ static _createRenderMask(props, cellsAroundViewport, additionalRegions) {
249
+ const itemCount = props.getItemCount(props.data);
250
+ invariant(
251
+ cellsAroundViewport.first >= 0 && cellsAroundViewport.last >= cellsAroundViewport.first - 1 && cellsAroundViewport.last < itemCount,
252
+ `Invalid cells around viewport "[${cellsAroundViewport.first}, ${cellsAroundViewport.last}]" was passed to VirtualizedList._createRenderMask`
253
+ );
254
+ const renderMask = new CellRenderMask(itemCount);
255
+ if (itemCount > 0) {
256
+ const allRegions = [cellsAroundViewport, ...additionalRegions ?? []];
257
+ for (const region of allRegions)
258
+ renderMask.addCells(region);
259
+ if (props.initialScrollIndex == null || props.initialScrollIndex <= 0) {
260
+ const initialRegion = VirtualizedList._initialRenderRegion(props);
261
+ renderMask.addCells(initialRegion);
262
+ }
263
+ const stickyIndicesSet = new Set(props.stickyHeaderIndices);
264
+ VirtualizedList._ensureClosestStickyHeader(
265
+ props,
266
+ stickyIndicesSet,
267
+ renderMask,
268
+ cellsAroundViewport.first
269
+ );
270
+ }
271
+ return renderMask;
272
+ }
273
+ static _initialRenderRegion(props) {
274
+ const itemCount = props.getItemCount(props.data), firstCellIndex = Math.max(
275
+ 0,
276
+ Math.min(itemCount - 1, Math.floor(props.initialScrollIndex ?? 0))
277
+ ), lastCellIndex = Math.min(
278
+ itemCount,
279
+ firstCellIndex + initialNumToRenderOrDefault(props.initialNumToRender)
280
+ ) - 1;
281
+ return {
282
+ first: firstCellIndex,
283
+ last: lastCellIndex
284
+ };
285
+ }
286
+ static _ensureClosestStickyHeader(props, stickyIndicesSet, renderMask, cellIdx) {
287
+ const stickyOffset = props.ListHeaderComponent ? 1 : 0;
288
+ for (let itemIdx = cellIdx - 1; itemIdx >= 0; itemIdx--)
289
+ if (stickyIndicesSet.has(itemIdx + stickyOffset)) {
290
+ renderMask.addCells({ first: itemIdx, last: itemIdx });
291
+ break;
292
+ }
293
+ }
294
+ _adjustCellsAroundViewport(props, cellsAroundViewport) {
295
+ const { data, getItemCount } = props, onEndReachedThreshold = onEndReachedThresholdOrDefault(
296
+ props.onEndReachedThreshold
297
+ ), { contentLength, offset, visibleLength } = this._scrollMetrics, distanceFromEnd = contentLength - visibleLength - offset;
298
+ if (visibleLength <= 0 || contentLength <= 0)
299
+ return cellsAroundViewport.last >= getItemCount(data) ? VirtualizedList._constrainToItemCount(cellsAroundViewport, props) : cellsAroundViewport;
300
+ let newCellsAroundViewport;
301
+ if (props.disableVirtualization) {
302
+ const renderAhead = distanceFromEnd < onEndReachedThreshold * visibleLength ? maxToRenderPerBatchOrDefault(props.maxToRenderPerBatch) : 0;
303
+ newCellsAroundViewport = {
304
+ first: 0,
305
+ last: Math.min(cellsAroundViewport.last + renderAhead, getItemCount(data) - 1)
306
+ };
307
+ } else {
308
+ if (props.initialScrollIndex && !this._scrollMetrics.offset && Math.abs(distanceFromEnd) >= Number.EPSILON)
309
+ return cellsAroundViewport.last >= getItemCount(data) ? VirtualizedList._constrainToItemCount(cellsAroundViewport, props) : cellsAroundViewport;
310
+ newCellsAroundViewport = computeWindowedRenderLimits(
311
+ props,
312
+ maxToRenderPerBatchOrDefault(props.maxToRenderPerBatch),
313
+ windowSizeOrDefault(props.windowSize),
314
+ cellsAroundViewport,
315
+ this.__getFrameMetricsApprox,
316
+ this._scrollMetrics
317
+ ), invariant(
318
+ newCellsAroundViewport.last < getItemCount(data),
319
+ "computeWindowedRenderLimits() should return range in-bounds"
320
+ );
321
+ }
322
+ if (this._nestedChildLists.size() > 0) {
323
+ const childIdx = this._findFirstChildWithMore(
324
+ newCellsAroundViewport.first,
325
+ newCellsAroundViewport.last
326
+ );
327
+ newCellsAroundViewport.last = childIdx ?? newCellsAroundViewport.last;
328
+ }
329
+ return newCellsAroundViewport;
330
+ }
331
+ _findFirstChildWithMore(first, last) {
332
+ for (let ii = first; ii <= last; ii++) {
333
+ const cellKeyForIndex = this._indicesToKeys.get(ii);
334
+ if (cellKeyForIndex != null && this._nestedChildLists.anyInCell(
335
+ cellKeyForIndex,
336
+ (childList) => childList.hasMore()
337
+ ))
338
+ return ii;
339
+ }
340
+ return null;
341
+ }
342
+ componentDidMount() {
343
+ this._isNestedWithSameOrientation() && this.context.registerAsNestedChild({
344
+ ref: this,
345
+ cellKey: this.context.cellKey
346
+ }), this.setupWebWheelHandler();
347
+ }
348
+ componentWillUnmount() {
349
+ this._isNestedWithSameOrientation() && this.context.unregisterAsNestedChild({ ref: this }), this._updateCellsToRenderBatcher.dispose({ abort: !0 }), this._viewabilityTuples.forEach((tuple) => {
350
+ tuple.viewabilityHelper.dispose();
351
+ }), this._fillRateHelper.deactivateAndFlush(), this.teardownWebWheelHandler();
352
+ }
353
+ setupWebWheelHandler() {
354
+ if (this._scrollRef && this._scrollRef.getScrollableNode)
355
+ this._scrollRef.getScrollableNode().addEventListener("wheel", this.invertedWheelEventHandler);
356
+ else {
357
+ setTimeout(() => this.setupWebWheelHandler(), 50);
358
+ return;
359
+ }
360
+ }
361
+ teardownWebWheelHandler() {
362
+ this._scrollRef && this._scrollRef.getScrollableNode && this._scrollRef.getScrollableNode().removeEventListener("wheel", this.invertedWheelEventHandler);
363
+ }
364
+ static getDerivedStateFromProps(newProps, prevState) {
365
+ if (newProps.getItemCount(newProps.data) === prevState.renderMask.numCells())
366
+ return prevState;
367
+ const constrainedCells = VirtualizedList._constrainToItemCount(
368
+ prevState.cellsAroundViewport,
369
+ newProps
370
+ );
371
+ return {
372
+ cellsAroundViewport: constrainedCells,
373
+ renderMask: VirtualizedList._createRenderMask(newProps, constrainedCells)
374
+ };
375
+ }
376
+ _pushCells(cells, stickyHeaderIndices, stickyIndicesFromProps, first, last, inversionStyle) {
377
+ const {
378
+ CellRendererComponent,
379
+ ItemSeparatorComponent,
380
+ ListHeaderComponent,
381
+ ListItemComponent,
382
+ data,
383
+ debug,
384
+ getItem,
385
+ getItemCount,
386
+ getItemLayout,
387
+ horizontal,
388
+ renderItem
389
+ } = this.props, stickyOffset = ListHeaderComponent ? 1 : 0, end = getItemCount(data) - 1;
390
+ let prevCellKey;
391
+ last = Math.min(end, last);
392
+ for (let ii = first; ii <= last; ii++) {
393
+ const item = getItem(data, ii), key = this._keyExtractor(item, ii, this.props);
394
+ this._indicesToKeys.set(ii, key), stickyIndicesFromProps.has(ii + stickyOffset) && stickyHeaderIndices.push(cells.length);
395
+ const shouldListenForLayout = getItemLayout == null || debug || this._fillRateHelper.enabled();
396
+ cells.push(
397
+ /* @__PURE__ */ jsx(
398
+ CellRenderer,
399
+ {
400
+ CellRendererComponent,
401
+ ItemSeparatorComponent: ii < end ? ItemSeparatorComponent : void 0,
402
+ ListItemComponent,
403
+ cellKey: key,
404
+ horizontal,
405
+ index: ii,
406
+ inversionStyle,
407
+ item,
408
+ prevCellKey,
409
+ onUpdateSeparators: this._onUpdateSeparators,
410
+ onCellFocusCapture: (e) => this._onCellFocusCapture(key),
411
+ onUnmount: this._onCellUnmount,
412
+ ref: (ref) => {
413
+ this._cellRefs[key] = ref;
414
+ },
415
+ renderItem,
416
+ ...shouldListenForLayout && {
417
+ onCellLayout: this._onCellLayout
418
+ }
419
+ },
420
+ key
421
+ )
422
+ ), prevCellKey = key;
423
+ }
424
+ }
425
+ static _constrainToItemCount(cells, props) {
426
+ const itemCount = props.getItemCount(props.data), last = Math.min(itemCount - 1, cells.last), maxToRenderPerBatch = maxToRenderPerBatchOrDefault(props.maxToRenderPerBatch);
427
+ return {
428
+ first: clamp(0, itemCount - 1 - maxToRenderPerBatch, cells.first),
429
+ last
430
+ };
431
+ }
432
+ _onUpdateSeparators = (keys, newProps) => {
433
+ keys.forEach((key) => {
434
+ const ref = key != null && this._cellRefs[key];
435
+ ref && ref.updateSeparatorProps(newProps);
436
+ });
437
+ };
438
+ _isNestedWithSameOrientation() {
439
+ const nestedContext = this.context;
440
+ return !!(nestedContext && !!nestedContext.horizontal === horizontalOrDefault(this.props.horizontal));
441
+ }
442
+ _getSpacerKey = (isVertical) => isVertical ? "height" : "width";
443
+ _keyExtractor(item, index, props) {
444
+ if (props.keyExtractor != null)
445
+ return props.keyExtractor(item, index);
446
+ const key = defaultKeyExtractor(item, index);
447
+ return key === String(index) && (_usedIndexForKey = !0, item.type && item.type.displayName && (_keylessItemComponentName = item.type.displayName)), key;
448
+ }
449
+ render() {
450
+ this._checkProps(this.props);
451
+ const { ListEmptyComponent, ListFooterComponent, ListHeaderComponent } = this.props, { data, horizontal } = this.props, inversionStyle = this.props.inverted ? horizontalOrDefault(this.props.horizontal) ? styles.horizontallyInverted : styles.verticallyInverted : null, cells = [], stickyIndicesFromProps = new Set(this.props.stickyHeaderIndices), stickyHeaderIndices = [];
452
+ if (ListHeaderComponent) {
453
+ stickyIndicesFromProps.has(0) && stickyHeaderIndices.push(0);
454
+ const element = React.isValidElement(ListHeaderComponent) ? ListHeaderComponent : /* @__PURE__ */ jsx(ListHeaderComponent, {});
455
+ cells.push(
456
+ /* @__PURE__ */ jsx(
457
+ VirtualizedListCellContextProvider,
458
+ {
459
+ cellKey: this._getCellKey() + "-header",
460
+ children: /* @__PURE__ */ jsx(
461
+ View,
462
+ {
463
+ onLayout: this._onLayoutHeader,
464
+ style: [inversionStyle, this.props.ListHeaderComponentStyle],
465
+ children: element
466
+ }
467
+ )
468
+ },
469
+ "$header"
470
+ )
471
+ );
472
+ }
473
+ const itemCount = this.props.getItemCount(data);
474
+ if (itemCount === 0 && ListEmptyComponent) {
475
+ const element = React.isValidElement(
476
+ ListEmptyComponent
477
+ ) ? ListEmptyComponent : /* @__PURE__ */ jsx(ListEmptyComponent, {});
478
+ cells.push(
479
+ /* @__PURE__ */ jsx(
480
+ VirtualizedListCellContextProvider,
481
+ {
482
+ cellKey: this._getCellKey() + "-empty",
483
+ children: React.cloneElement(element, {
484
+ onLayout: (event) => {
485
+ this._onLayoutEmpty(event), element.props.onLayout && element.props.onLayout(event);
486
+ },
487
+ style: [inversionStyle, element.props.style]
488
+ })
489
+ },
490
+ "$empty"
491
+ )
492
+ );
493
+ }
494
+ if (itemCount > 0) {
495
+ _usedIndexForKey = !1, _keylessItemComponentName = "";
496
+ const spacerKey = this._getSpacerKey(!horizontal), renderRegions = this.state.renderMask.enumerateRegions(), lastSpacer = findLastWhere(renderRegions, (r) => r.isSpacer);
497
+ for (const section of renderRegions)
498
+ if (section.isSpacer) {
499
+ if (this.props.disableVirtualization)
500
+ continue;
501
+ const last = section === lastSpacer && !this.props.getItemLayout ? clamp(section.first - 1, section.last, this._highestMeasuredFrameIndex) : section.last, firstMetrics = this.__getFrameMetricsApprox(section.first, this.props), lastMetrics = this.__getFrameMetricsApprox(last, this.props), spacerSize = lastMetrics.offset + lastMetrics.length - firstMetrics.offset;
502
+ cells.push(
503
+ /* @__PURE__ */ jsx(View, { style: { [spacerKey]: spacerSize } }, `$spacer-${section.first}`)
504
+ );
505
+ } else
506
+ this._pushCells(
507
+ cells,
508
+ stickyHeaderIndices,
509
+ stickyIndicesFromProps,
510
+ section.first,
511
+ section.last,
512
+ inversionStyle
513
+ );
514
+ !this._hasWarned.keys && _usedIndexForKey && (console.warn(
515
+ "VirtualizedList: missing keys for items, make sure to specify a key or id property on each item or provide a custom keyExtractor.",
516
+ _keylessItemComponentName
517
+ ), this._hasWarned.keys = !0);
518
+ }
519
+ if (ListFooterComponent) {
520
+ const element = React.isValidElement(ListFooterComponent) ? ListFooterComponent : /* @__PURE__ */ jsx(ListFooterComponent, {});
521
+ cells.push(
522
+ /* @__PURE__ */ jsx(
523
+ VirtualizedListCellContextProvider,
524
+ {
525
+ cellKey: this._getFooterCellKey(),
526
+ children: /* @__PURE__ */ jsx(
527
+ View,
528
+ {
529
+ onLayout: this._onLayoutFooter,
530
+ style: [inversionStyle, this.props.ListFooterComponentStyle],
531
+ children: element
532
+ }
533
+ )
534
+ },
535
+ "$footer"
536
+ )
537
+ );
538
+ }
539
+ const scrollProps = {
540
+ ...this.props,
541
+ onContentSizeChange: this._onContentSizeChange,
542
+ onLayout: this._onLayout,
543
+ onScroll: this._onScroll,
544
+ onScrollBeginDrag: this._onScrollBeginDrag,
545
+ onScrollEndDrag: this._onScrollEndDrag,
546
+ onMomentumScrollBegin: this._onMomentumScrollBegin,
547
+ onMomentumScrollEnd: this._onMomentumScrollEnd,
548
+ scrollEventThrottle: scrollEventThrottleOrDefault(this.props.scrollEventThrottle),
549
+ invertStickyHeaders: this.props.invertStickyHeaders !== void 0 ? this.props.invertStickyHeaders : this.props.inverted,
550
+ stickyHeaderIndices,
551
+ style: inversionStyle ? [inversionStyle, this.props.style] : this.props.style
552
+ };
553
+ return this._hasMore = this.state.cellsAroundViewport.last < itemCount - 1, /* @__PURE__ */ jsx(
554
+ VirtualizedListContextProvider,
555
+ {
556
+ value: {
557
+ cellKey: null,
558
+ getScrollMetrics: this._getScrollMetrics,
559
+ horizontal: horizontalOrDefault(this.props.horizontal),
560
+ getOutermostParentListRef: this._getOutermostParentListRef,
561
+ registerAsNestedChild: this._registerAsNestedChild,
562
+ unregisterAsNestedChild: this._unregisterAsNestedChild
563
+ },
564
+ children: React.cloneElement(
565
+ (this.props.renderScrollComponent || this._defaultRenderScrollComponent)(
566
+ scrollProps
567
+ ),
568
+ {
569
+ ref: this._captureScrollRef
570
+ },
571
+ cells
572
+ )
573
+ }
574
+ );
575
+ }
576
+ componentDidUpdate(prevProps) {
577
+ const { data, extraData } = this.props;
578
+ (data !== prevProps.data || extraData !== prevProps.extraData) && this._viewabilityTuples.forEach((tuple) => {
579
+ tuple.viewabilityHelper.resetViewableIndices();
580
+ });
581
+ const hiPriInProgress = this._hiPriInProgress;
582
+ this._scheduleCellsToRenderUpdate(), hiPriInProgress && (this._hiPriInProgress = !1);
583
+ }
584
+ _averageCellLength = 0;
585
+ _cellRefs = {};
586
+ _fillRateHelper;
587
+ _frames = {};
588
+ _footerLength = 0;
589
+ _hasTriggeredInitialScrollToIndex = !1;
590
+ _hasInteracted = !1;
591
+ _hasMore = !1;
592
+ _hasWarned = {};
593
+ _headerLength = 0;
594
+ _hiPriInProgress = !1;
595
+ _highestMeasuredFrameIndex = 0;
596
+ _indicesToKeys = /* @__PURE__ */ new Map();
597
+ _lastFocusedCellKey = null;
598
+ _nestedChildLists = new ChildListCollection();
599
+ _offsetFromParentVirtualizedList = 0;
600
+ _prevParentOffset = 0;
601
+ _scrollMetrics = {
602
+ contentLength: 0,
603
+ dOffset: 0,
604
+ dt: 10,
605
+ offset: 0,
606
+ timestamp: 0,
607
+ velocity: 0,
608
+ visibleLength: 0,
609
+ zoomScale: 1
610
+ };
611
+ _scrollRef = null;
612
+ _sentStartForContentLength = 0;
613
+ _sentEndForContentLength = 0;
614
+ _totalCellLength = 0;
615
+ _totalCellsMeasured = 0;
616
+ _updateCellsToRenderBatcher;
617
+ _viewabilityTuples = [];
618
+ _captureScrollRef = (ref) => {
619
+ this._scrollRef = ref;
620
+ };
621
+ _computeBlankness() {
622
+ this._fillRateHelper.computeBlankness(
623
+ // @ts-ignore
624
+ this.props,
625
+ this.state.cellsAroundViewport,
626
+ this._scrollMetrics
627
+ );
628
+ }
629
+ _defaultRenderScrollComponent = (props) => {
630
+ const onRefresh = props.onRefresh;
631
+ return this._isNestedWithSameOrientation() ? /* @__PURE__ */ jsx(View, { ...props }) : onRefresh ? (invariant(
632
+ typeof props.refreshing == "boolean",
633
+ "`refreshing` prop must be set as a boolean in order to use `onRefresh`, but got `" + JSON.stringify(props.refreshing ?? "undefined") + "`"
634
+ ), /* @__PURE__ */ jsx(
635
+ ScrollView,
636
+ {
637
+ ...props,
638
+ refreshControl: props.refreshControl == null ? /* @__PURE__ */ jsx(
639
+ RefreshControl,
640
+ {
641
+ refreshing: props.refreshing,
642
+ onRefresh,
643
+ progressViewOffset: props.progressViewOffset
644
+ }
645
+ ) : props.refreshControl
646
+ }
647
+ )) : /* @__PURE__ */ jsx(ScrollView, { ...props });
648
+ };
649
+ _onCellLayout = (e, cellKey, index) => {
650
+ const layout = e.nativeEvent.layout, next = {
651
+ offset: this._selectOffset(layout),
652
+ length: this._selectLength(layout),
653
+ index,
654
+ inLayout: !0
655
+ }, curr = this._frames[cellKey];
656
+ !curr || next.offset !== curr.offset || next.length !== curr.length || index !== curr.index ? (this._totalCellLength += next.length - (curr ? curr.length : 0), this._totalCellsMeasured += curr ? 0 : 1, this._averageCellLength = this._totalCellLength / this._totalCellsMeasured, this._frames[cellKey] = next, this._highestMeasuredFrameIndex = Math.max(this._highestMeasuredFrameIndex, index), this._scheduleCellsToRenderUpdate()) : this._frames[cellKey].inLayout = !0, this._triggerRemeasureForChildListsInCell(cellKey), this._computeBlankness(), this._updateViewableItems(
657
+ // @ts-ignore
658
+ this.props,
659
+ this.state.cellsAroundViewport
660
+ );
661
+ };
662
+ _onCellFocusCapture(cellKey) {
663
+ this._lastFocusedCellKey = cellKey, this._updateCellsToRender();
664
+ }
665
+ _onCellUnmount = (cellKey) => {
666
+ delete this._cellRefs[cellKey];
667
+ const curr = this._frames[cellKey];
668
+ curr && (this._frames[cellKey] = { ...curr, inLayout: !1 });
669
+ };
670
+ _triggerRemeasureForChildListsInCell(cellKey) {
671
+ this._nestedChildLists.forEachInCell(cellKey, (childList) => {
672
+ childList.measureLayoutRelativeToContainingList();
673
+ });
674
+ }
675
+ measureLayoutRelativeToContainingList() {
676
+ try {
677
+ if (!this._scrollRef)
678
+ return;
679
+ this._scrollRef.measureLayout(
680
+ this.context.getOutermostParentListRef().getScrollRef(),
681
+ (x, y, width, height) => {
682
+ this._offsetFromParentVirtualizedList = this._selectOffset({ x, y }), this._scrollMetrics.contentLength = this._selectLength({
683
+ width,
684
+ height
685
+ });
686
+ const scrollMetrics = this._convertParentScrollMetrics(
687
+ this.context.getScrollMetrics()
688
+ );
689
+ (this._scrollMetrics.visibleLength !== scrollMetrics.visibleLength || this._scrollMetrics.offset !== scrollMetrics.offset) && (this._scrollMetrics.visibleLength = scrollMetrics.visibleLength, this._scrollMetrics.offset = scrollMetrics.offset, this._nestedChildLists.forEach((childList) => {
690
+ childList.measureLayoutRelativeToContainingList();
691
+ }));
692
+ },
693
+ (error) => {
694
+ console.warn(
695
+ "VirtualizedList: Encountered an error while measuring a list's offset from its containing VirtualizedList."
696
+ );
697
+ }
698
+ );
699
+ } catch (error) {
700
+ console.warn("measureLayoutRelativeToContainingList threw an error", error.stack);
701
+ }
702
+ }
703
+ _onLayout = (e) => {
704
+ this._isNestedWithSameOrientation() ? this.measureLayoutRelativeToContainingList() : this._scrollMetrics.visibleLength = this._selectLength(e.nativeEvent.layout), this.props.onLayout && this.props.onLayout(e), this._scheduleCellsToRenderUpdate(), this._maybeCallOnEdgeReached();
705
+ };
706
+ _onLayoutEmpty = (e) => {
707
+ this.props.onLayout && this.props.onLayout(e);
708
+ };
709
+ _getFooterCellKey() {
710
+ return this._getCellKey() + "-footer";
711
+ }
712
+ _onLayoutFooter = (e) => {
713
+ this._triggerRemeasureForChildListsInCell(this._getFooterCellKey()), this._footerLength = this._selectLength(e.nativeEvent.layout);
714
+ };
715
+ _onLayoutHeader = (e) => {
716
+ this._headerLength = this._selectLength(e.nativeEvent.layout);
717
+ };
718
+ _renderDebugOverlay() {
719
+ const normalize = this._scrollMetrics.visibleLength / (this._scrollMetrics.contentLength || 1), framesInLayout = [], itemCount = this.props.getItemCount(this.props.data);
720
+ for (let ii = 0; ii < itemCount; ii++) {
721
+ const frame = this.__getFrameMetricsApprox(ii, this.props);
722
+ frame.inLayout && framesInLayout.push(frame);
723
+ }
724
+ const windowTop = this.__getFrameMetricsApprox(
725
+ this.state.cellsAroundViewport.first,
726
+ this.props
727
+ ).offset, frameLast = this.__getFrameMetricsApprox(
728
+ this.state.cellsAroundViewport.last,
729
+ this.props
730
+ ), windowLen = frameLast.offset + frameLast.length - windowTop, visTop = this._scrollMetrics.offset, visLen = this._scrollMetrics.visibleLength;
731
+ return /* @__PURE__ */ jsxs(View, { style: [styles.debugOverlayBase, styles.debugOverlay], children: [
732
+ framesInLayout.map((f, ii) => /* @__PURE__ */ jsx(
733
+ View,
734
+ {
735
+ style: [
736
+ styles.debugOverlayBase,
737
+ styles.debugOverlayFrame,
738
+ {
739
+ top: f.offset * normalize,
740
+ height: f.length * normalize
741
+ }
742
+ ]
743
+ },
744
+ "f" + ii
745
+ )),
746
+ /* @__PURE__ */ jsx(
747
+ View,
748
+ {
749
+ style: [
750
+ styles.debugOverlayBase,
751
+ styles.debugOverlayFrameLast,
752
+ {
753
+ top: windowTop * normalize,
754
+ height: windowLen * normalize
755
+ }
756
+ ]
757
+ }
758
+ ),
759
+ /* @__PURE__ */ jsx(
760
+ View,
761
+ {
762
+ style: [
763
+ styles.debugOverlayBase,
764
+ styles.debugOverlayFrameVis,
765
+ {
766
+ top: visTop * normalize,
767
+ height: visLen * normalize
768
+ }
769
+ ]
770
+ }
771
+ )
772
+ ] });
773
+ }
774
+ _selectLength(metrics) {
775
+ return horizontalOrDefault(this.props.horizontal) ? metrics.width : metrics.height;
776
+ }
777
+ _selectOffset(metrics) {
778
+ return horizontalOrDefault(this.props.horizontal) ? metrics.x : metrics.y;
779
+ }
780
+ _maybeCallOnEdgeReached() {
781
+ const {
782
+ data,
783
+ getItemCount,
784
+ onStartReached,
785
+ onStartReachedThreshold,
786
+ onEndReached,
787
+ onEndReachedThreshold,
788
+ initialScrollIndex
789
+ } = this.props, { contentLength, visibleLength, offset } = this._scrollMetrics;
790
+ let distanceFromStart = offset, distanceFromEnd = contentLength - visibleLength - offset;
791
+ distanceFromStart < ON_EDGE_REACHED_EPSILON && (distanceFromStart = 0), distanceFromEnd < ON_EDGE_REACHED_EPSILON && (distanceFromEnd = 0);
792
+ const DEFAULT_THRESHOLD_PX = 2, startThreshold = onStartReachedThreshold != null ? onStartReachedThreshold * visibleLength : DEFAULT_THRESHOLD_PX, endThreshold = onEndReachedThreshold != null ? onEndReachedThreshold * visibleLength : DEFAULT_THRESHOLD_PX, isWithinStartThreshold = distanceFromStart <= startThreshold, isWithinEndThreshold = distanceFromEnd <= endThreshold;
793
+ onEndReached && this.state.cellsAroundViewport.last === getItemCount(data) - 1 && isWithinEndThreshold && this._scrollMetrics.contentLength !== this._sentEndForContentLength ? (this._sentEndForContentLength = this._scrollMetrics.contentLength, onEndReached({ distanceFromEnd })) : onStartReached != null && this.state.cellsAroundViewport.first === 0 && isWithinStartThreshold && this._scrollMetrics.contentLength !== this._sentStartForContentLength ? (!initialScrollIndex || this._scrollMetrics.timestamp !== 0) && (this._sentStartForContentLength = this._scrollMetrics.contentLength, onStartReached({ distanceFromStart })) : (this._sentStartForContentLength = isWithinStartThreshold ? this._sentStartForContentLength : 0, this._sentEndForContentLength = isWithinEndThreshold ? this._sentEndForContentLength : 0);
794
+ }
795
+ _onContentSizeChange = (width, height) => {
796
+ width > 0 && height > 0 && this.props.initialScrollIndex != null && this.props.initialScrollIndex > 0 && !this._hasTriggeredInitialScrollToIndex && (this.props.contentOffset == null && (this.props.initialScrollIndex < this.props.getItemCount(this.props.data) ? this.scrollToIndex({
797
+ animated: !1,
798
+ index: nullthrows(this.props.initialScrollIndex)
799
+ }) : this.scrollToEnd({ animated: !1 })), this._hasTriggeredInitialScrollToIndex = !0), this.props.onContentSizeChange && this.props.onContentSizeChange(width, height), this._scrollMetrics.contentLength = this._selectLength({ height, width }), this._scheduleCellsToRenderUpdate(), this._maybeCallOnEdgeReached();
800
+ };
801
+ _convertParentScrollMetrics = (metrics) => {
802
+ const offset = metrics.offset - this._offsetFromParentVirtualizedList, visibleLength = metrics.visibleLength, dOffset = offset - this._scrollMetrics.offset, contentLength = this._scrollMetrics.contentLength;
803
+ return {
804
+ visibleLength,
805
+ contentLength,
806
+ offset,
807
+ dOffset
808
+ };
809
+ };
810
+ _onScroll = (e) => {
811
+ this._nestedChildLists.forEach((childList) => {
812
+ childList._onScroll(e);
813
+ }), this.props.onScroll && this.props.onScroll(e);
814
+ const timestamp = e.timeStamp;
815
+ let visibleLength = this._selectLength(e.nativeEvent.layoutMeasurement), contentLength = this._selectLength(e.nativeEvent.contentSize), offset = this._selectOffset(e.nativeEvent.contentOffset), dOffset = offset - this._scrollMetrics.offset;
816
+ if (this._isNestedWithSameOrientation()) {
817
+ if (this._scrollMetrics.contentLength === 0)
818
+ return;
819
+ ({ visibleLength, contentLength, offset, dOffset } = this._convertParentScrollMetrics({
820
+ visibleLength,
821
+ offset
822
+ }));
823
+ }
824
+ const dt = this._scrollMetrics.timestamp ? Math.max(1, timestamp - this._scrollMetrics.timestamp) : 1, velocity = dOffset / dt;
825
+ dt > 500 && this._scrollMetrics.dt > 500 && contentLength > 5 * visibleLength && !this._hasWarned.perf && (infoLog(
826
+ "VirtualizedList: You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate, etc.",
827
+ { dt, prevDt: this._scrollMetrics.dt, contentLength }
828
+ ), this._hasWarned.perf = !0);
829
+ const zoomScale = e.nativeEvent.zoomScale < 0 ? 1 : e.nativeEvent.zoomScale;
830
+ this._scrollMetrics = {
831
+ contentLength,
832
+ dt,
833
+ dOffset,
834
+ offset,
835
+ timestamp,
836
+ velocity,
837
+ visibleLength,
838
+ zoomScale
839
+ }, this._updateViewableItems(this.props, this.state.cellsAroundViewport), this.props && (this._maybeCallOnEdgeReached(), velocity !== 0 && this._fillRateHelper.activate(), this._computeBlankness(), this._scheduleCellsToRenderUpdate());
840
+ };
841
+ _scheduleCellsToRenderUpdate() {
842
+ const { first, last } = this.state.cellsAroundViewport, { offset, visibleLength, velocity } = this._scrollMetrics, itemCount = this.props.getItemCount(this.props.data);
843
+ let hiPri = !1;
844
+ const onStartReachedThreshold = onStartReachedThresholdOrDefault(
845
+ this.props.onStartReachedThreshold
846
+ ), onEndReachedThreshold = onEndReachedThresholdOrDefault(
847
+ this.props.onEndReachedThreshold
848
+ );
849
+ if (first > 0) {
850
+ const distTop = offset - this.__getFrameMetricsApprox(first, this.props).offset;
851
+ hiPri = distTop < 0 || velocity < -2 && distTop < getScrollingThreshold(onStartReachedThreshold, visibleLength);
852
+ }
853
+ if (!hiPri && last >= 0 && last < itemCount - 1) {
854
+ const distBottom = this.__getFrameMetricsApprox(last, this.props).offset - (offset + visibleLength);
855
+ hiPri = distBottom < 0 || velocity > 2 && distBottom < getScrollingThreshold(onEndReachedThreshold, visibleLength);
856
+ }
857
+ if (hiPri && (this._averageCellLength || this.props.getItemLayout) && !this._hiPriInProgress) {
858
+ this._hiPriInProgress = !0, this._updateCellsToRenderBatcher.dispose({ abort: !0 }), this._updateCellsToRender();
859
+ return;
860
+ } else
861
+ this._updateCellsToRenderBatcher.schedule();
862
+ }
863
+ _onScrollBeginDrag = (e) => {
864
+ this._nestedChildLists.forEach((childList) => {
865
+ childList._onScrollBeginDrag(e);
866
+ }), this._viewabilityTuples.forEach((tuple) => {
867
+ tuple.viewabilityHelper.recordInteraction();
868
+ }), this._hasInteracted = !0, this.props.onScrollBeginDrag && this.props.onScrollBeginDrag(e);
869
+ };
870
+ _onScrollEndDrag = (e) => {
871
+ this._nestedChildLists.forEach((childList) => {
872
+ childList._onScrollEndDrag(e);
873
+ });
874
+ const { velocity } = e.nativeEvent;
875
+ velocity && (this._scrollMetrics.velocity = this._selectOffset(velocity)), this._computeBlankness(), this.props.onScrollEndDrag && this.props.onScrollEndDrag(e);
876
+ };
877
+ _onMomentumScrollBegin = (e) => {
878
+ this._nestedChildLists.forEach((childList) => {
879
+ childList._onMomentumScrollBegin(e);
880
+ }), this.props.onMomentumScrollBegin && this.props.onMomentumScrollBegin(e);
881
+ };
882
+ _onMomentumScrollEnd = (e) => {
883
+ this._nestedChildLists.forEach((childList) => {
884
+ childList._onMomentumScrollEnd(e);
885
+ }), this._scrollMetrics.velocity = 0, this._computeBlankness(), this.props.onMomentumScrollEnd && this.props.onMomentumScrollEnd(e);
886
+ };
887
+ _updateCellsToRender = () => {
888
+ this._updateViewableItems(this.props, this.state.cellsAroundViewport), this.setState((state, props) => {
889
+ const cellsAroundViewport = this._adjustCellsAroundViewport(
890
+ props,
891
+ state.cellsAroundViewport
892
+ ), renderMask = VirtualizedList._createRenderMask(
893
+ props,
894
+ cellsAroundViewport,
895
+ this._getNonViewportRenderRegions(props)
896
+ );
897
+ return cellsAroundViewport.first === state.cellsAroundViewport.first && cellsAroundViewport.last === state.cellsAroundViewport.last && renderMask.equals(state.renderMask) ? null : { cellsAroundViewport, renderMask };
898
+ });
899
+ };
900
+ _createViewToken = (index, isViewable, props) => {
901
+ const { data, getItem } = props, item = getItem(data, index);
902
+ return {
903
+ index,
904
+ item,
905
+ key: this._keyExtractor(item, index, props),
906
+ isViewable
907
+ };
908
+ };
909
+ _getOffsetApprox = (index, props) => {
910
+ if (Number.isInteger(index))
911
+ return this.__getFrameMetricsApprox(index, props).offset;
912
+ {
913
+ const frameMetrics = this.__getFrameMetricsApprox(Math.floor(index), props), remainder = index - Math.floor(index);
914
+ return frameMetrics.offset + remainder * frameMetrics.length;
915
+ }
916
+ };
917
+ __getFrameMetricsApprox = (index, props) => {
918
+ const frame = this._getFrameMetrics(index, props);
919
+ if (frame && frame.index === index)
920
+ return frame;
921
+ {
922
+ const { data, getItemCount, getItemLayout } = props;
923
+ return invariant(
924
+ index >= 0 && index < getItemCount(data),
925
+ "Tried to get frame for out of range index " + index
926
+ ), invariant(
927
+ !getItemLayout,
928
+ "Should not have to estimate frames when a measurement metrics function is provided"
929
+ ), {
930
+ length: this._averageCellLength,
931
+ offset: this._averageCellLength * index
932
+ };
933
+ }
934
+ };
935
+ _getFrameMetrics = (index, props) => {
936
+ const { data, getItem, getItemCount, getItemLayout } = props;
937
+ invariant(
938
+ index >= 0 && index < getItemCount(data),
939
+ "Tried to get frame for out of range index " + index
940
+ );
941
+ const item = getItem(data, index), frame = this._frames[this._keyExtractor(item, index, props)];
942
+ return (!frame || frame.index !== index) && getItemLayout ? getItemLayout(data, index) : frame;
943
+ };
944
+ _getNonViewportRenderRegions = (props) => {
945
+ if (!(this._lastFocusedCellKey && this._cellRefs[this._lastFocusedCellKey]))
946
+ return [];
947
+ const focusedCellIndex = this._cellRefs[this._lastFocusedCellKey].props.index, itemCount = props.getItemCount(props.data);
948
+ if (focusedCellIndex >= itemCount || this._keyExtractor(
949
+ props.getItem(props.data, focusedCellIndex),
950
+ focusedCellIndex,
951
+ props
952
+ ) !== this._lastFocusedCellKey)
953
+ return [];
954
+ let first = focusedCellIndex, heightOfCellsBeforeFocused = 0;
955
+ for (let i = first - 1; i >= 0 && heightOfCellsBeforeFocused < this._scrollMetrics.visibleLength; i--)
956
+ first--, heightOfCellsBeforeFocused += this.__getFrameMetricsApprox(i, props).length;
957
+ let last = focusedCellIndex, heightOfCellsAfterFocused = 0;
958
+ for (let i = last + 1; i < itemCount && heightOfCellsAfterFocused < this._scrollMetrics.visibleLength; i++)
959
+ last++, heightOfCellsAfterFocused += this.__getFrameMetricsApprox(i, props).length;
960
+ return [{ first, last }];
961
+ };
962
+ _updateViewableItems(props, cellsAroundViewport) {
963
+ this._viewabilityTuples.forEach((tuple) => {
964
+ tuple.viewabilityHelper.onUpdate(
965
+ props,
966
+ this._scrollMetrics.offset,
967
+ this._scrollMetrics.visibleLength,
968
+ this._getFrameMetrics,
969
+ this._createViewToken,
970
+ tuple.onViewableItemsChanged,
971
+ cellsAroundViewport
972
+ );
973
+ });
974
+ }
975
+ }
976
+ const styles = StyleSheet.create({
977
+ verticallyInverted: {
978
+ transform: "scaleY(-1)"
979
+ },
980
+ horizontallyInverted: {
981
+ transform: "scaleX(-1)"
982
+ },
983
+ debug: {
984
+ flex: 1
985
+ },
986
+ debugOverlayBase: {
987
+ position: "absolute",
988
+ top: 0,
989
+ right: 0
990
+ },
991
+ debugOverlay: {
992
+ bottom: 0,
993
+ width: 20,
994
+ borderColor: "blue",
995
+ borderWidth: 1
996
+ },
997
+ debugOverlayFrame: {
998
+ left: 0,
999
+ backgroundColor: "orange"
1000
+ },
1001
+ debugOverlayFrameLast: {
1002
+ left: 0,
1003
+ borderColor: "green",
1004
+ borderWidth: 2
1005
+ },
1006
+ debugOverlayFrameVis: {
1007
+ left: 0,
1008
+ borderColor: "red",
1009
+ borderWidth: 2
1010
+ }
1011
+ });
1012
+ var VirtualizedList_default = VirtualizedList;
1013
+ export {
1014
+ VirtualizedList_default as default
1015
+ };
1016
+ //# sourceMappingURL=index.js.map