@react-native-ohos/flash-list 1.8.3-rc.5 → 2.1.1-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/LICENSE +1 -1
  2. package/README.OpenSource +1 -1
  3. package/dist/AnimatedFlashList.d.ts +4 -28
  4. package/dist/AnimatedFlashList.d.ts.map +1 -1
  5. package/dist/AnimatedFlashList.js +5 -30
  6. package/dist/AnimatedFlashList.js.map +1 -1
  7. package/dist/FlashList.d.ts +1 -179
  8. package/dist/FlashList.d.ts.map +1 -1
  9. package/dist/FlashList.js +1 -599
  10. package/dist/FlashList.js.map +1 -1
  11. package/dist/FlashListProps.d.ts +285 -278
  12. package/dist/FlashListProps.d.ts.map +1 -1
  13. package/dist/FlashListProps.js +5 -31
  14. package/dist/FlashListProps.js.map +1 -1
  15. package/dist/FlashListRef.d.ts +305 -0
  16. package/dist/FlashListRef.d.ts.map +1 -0
  17. package/dist/FlashListRef.js +2 -0
  18. package/dist/FlashListRef.js.map +1 -0
  19. package/dist/benchmark/AutoScrollHelper.d.ts +17 -40
  20. package/dist/benchmark/AutoScrollHelper.d.ts.map +1 -1
  21. package/dist/benchmark/AutoScrollHelper.js +59 -90
  22. package/dist/benchmark/AutoScrollHelper.js.map +1 -1
  23. package/dist/benchmark/JSFPSMonitor.d.ts +22 -45
  24. package/dist/benchmark/JSFPSMonitor.d.ts.map +1 -1
  25. package/dist/benchmark/JSFPSMonitor.js +59 -87
  26. package/dist/benchmark/JSFPSMonitor.js.map +1 -1
  27. package/dist/benchmark/roundToDecimalPlaces.d.ts +1 -24
  28. package/dist/benchmark/roundToDecimalPlaces.d.ts.map +1 -1
  29. package/dist/benchmark/roundToDecimalPlaces.js +4 -31
  30. package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
  31. package/dist/benchmark/useBenchmark.d.ts +40 -57
  32. package/dist/benchmark/useBenchmark.d.ts.map +1 -1
  33. package/dist/benchmark/useBenchmark.js +119 -189
  34. package/dist/benchmark/useBenchmark.js.map +1 -1
  35. package/dist/benchmark/useDataMultiplier.d.ts +8 -31
  36. package/dist/benchmark/useDataMultiplier.d.ts.map +1 -1
  37. package/dist/benchmark/useDataMultiplier.js +19 -47
  38. package/dist/benchmark/useDataMultiplier.js.map +1 -1
  39. package/dist/benchmark/useFlatListBenchmark.d.ts +14 -35
  40. package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
  41. package/dist/benchmark/useFlatListBenchmark.js +92 -122
  42. package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
  43. package/dist/errors/ErrorMessages.d.ts +16 -0
  44. package/dist/errors/ErrorMessages.d.ts.map +1 -0
  45. package/dist/errors/ErrorMessages.js +16 -0
  46. package/dist/errors/ErrorMessages.js.map +1 -0
  47. package/dist/errors/WarningMessages.d.ts +6 -0
  48. package/dist/errors/WarningMessages.d.ts.map +1 -0
  49. package/dist/errors/WarningMessages.js +7 -0
  50. package/dist/errors/WarningMessages.js.map +1 -0
  51. package/dist/index.d.ts +15 -36
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +19 -54
  54. package/dist/index.js.map +1 -1
  55. package/dist/isNewArch.d.ts +2 -0
  56. package/dist/isNewArch.d.ts.map +1 -0
  57. package/dist/isNewArch.js +22 -0
  58. package/dist/isNewArch.js.map +1 -0
  59. package/dist/native/config/PlatformHelper.android.d.ts +6 -48
  60. package/dist/native/config/PlatformHelper.android.d.ts.map +1 -1
  61. package/dist/native/config/PlatformHelper.android.js +6 -45
  62. package/dist/native/config/PlatformHelper.android.js.map +1 -1
  63. package/dist/native/config/PlatformHelper.d.ts +6 -48
  64. package/dist/native/config/PlatformHelper.d.ts.map +1 -1
  65. package/dist/native/config/PlatformHelper.harmony.d.ts +29 -48
  66. package/dist/native/config/PlatformHelper.harmony.d.ts.map +1 -1
  67. package/dist/native/config/PlatformHelper.harmony.js +29 -44
  68. package/dist/native/config/PlatformHelper.harmony.js.map +1 -1
  69. package/dist/native/config/PlatformHelper.ios.d.ts +6 -48
  70. package/dist/native/config/PlatformHelper.ios.d.ts.map +1 -1
  71. package/dist/native/config/PlatformHelper.ios.js +6 -44
  72. package/dist/native/config/PlatformHelper.ios.js.map +1 -1
  73. package/dist/native/config/PlatformHelper.js +6 -45
  74. package/dist/native/config/PlatformHelper.js.map +1 -1
  75. package/dist/native/config/PlatformHelper.web.d.ts +6 -49
  76. package/dist/native/config/PlatformHelper.web.d.ts.map +1 -1
  77. package/dist/native/config/PlatformHelper.web.js +6 -47
  78. package/dist/native/config/PlatformHelper.web.js.map +1 -1
  79. package/dist/recyclerview/LayoutCommitObserver.d.ts +12 -0
  80. package/dist/recyclerview/LayoutCommitObserver.d.ts.map +1 -0
  81. package/dist/recyclerview/LayoutCommitObserver.js +58 -0
  82. package/dist/recyclerview/LayoutCommitObserver.js.map +1 -0
  83. package/dist/recyclerview/RecyclerView.d.ts +13 -0
  84. package/dist/recyclerview/RecyclerView.d.ts.map +1 -0
  85. package/dist/recyclerview/RecyclerView.js +368 -0
  86. package/dist/recyclerview/RecyclerView.js.map +1 -0
  87. package/dist/recyclerview/RecyclerViewContextProvider.d.ts +46 -0
  88. package/dist/recyclerview/RecyclerViewContextProvider.d.ts.map +1 -0
  89. package/dist/recyclerview/RecyclerViewContextProvider.js +10 -0
  90. package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -0
  91. package/dist/recyclerview/RecyclerViewManager.d.ts +78 -0
  92. package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -0
  93. package/dist/recyclerview/RecyclerViewManager.js +343 -0
  94. package/dist/recyclerview/RecyclerViewManager.js.map +1 -0
  95. package/dist/recyclerview/RecyclerViewProps.d.ts +2 -0
  96. package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -0
  97. package/dist/recyclerview/RecyclerViewProps.js +2 -0
  98. package/dist/recyclerview/RecyclerViewProps.js.map +1 -0
  99. package/dist/recyclerview/RenderStackManager.d.ts +86 -0
  100. package/dist/recyclerview/RenderStackManager.d.ts.map +1 -0
  101. package/dist/recyclerview/RenderStackManager.js +252 -0
  102. package/dist/recyclerview/RenderStackManager.js.map +1 -0
  103. package/dist/recyclerview/ViewHolder.d.ts +45 -0
  104. package/dist/recyclerview/ViewHolder.d.ts.map +1 -0
  105. package/dist/recyclerview/ViewHolder.js +94 -0
  106. package/dist/recyclerview/ViewHolder.js.map +1 -0
  107. package/dist/recyclerview/ViewHolderCollection.d.ts +63 -0
  108. package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -0
  109. package/dist/recyclerview/ViewHolderCollection.js +87 -0
  110. package/dist/recyclerview/ViewHolderCollection.js.map +1 -0
  111. package/dist/recyclerview/components/CompatScroller.d.ts +7 -0
  112. package/dist/recyclerview/components/CompatScroller.d.ts.map +1 -0
  113. package/dist/recyclerview/components/CompatScroller.js +7 -0
  114. package/dist/recyclerview/components/CompatScroller.js.map +1 -0
  115. package/dist/recyclerview/components/CompatView.d.ts +7 -0
  116. package/dist/recyclerview/components/CompatView.d.ts.map +1 -0
  117. package/dist/recyclerview/components/CompatView.js +7 -0
  118. package/dist/recyclerview/components/CompatView.js.map +1 -0
  119. package/dist/recyclerview/components/ScrollAnchor.d.ts +29 -0
  120. package/dist/recyclerview/components/ScrollAnchor.d.ts.map +1 -0
  121. package/dist/recyclerview/components/ScrollAnchor.js +33 -0
  122. package/dist/recyclerview/components/ScrollAnchor.js.map +1 -0
  123. package/dist/recyclerview/components/StickyHeaders.d.ts +38 -0
  124. package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -0
  125. package/dist/recyclerview/components/StickyHeaders.js +112 -0
  126. package/dist/recyclerview/components/StickyHeaders.js.map +1 -0
  127. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts +51 -0
  128. package/dist/recyclerview/helpers/ConsecutiveNumbers.d.ts.map +1 -0
  129. package/dist/recyclerview/helpers/ConsecutiveNumbers.js +95 -0
  130. package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -0
  131. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts +105 -0
  132. package/dist/recyclerview/helpers/EngagedIndicesTracker.d.ts.map +1 -0
  133. package/dist/recyclerview/helpers/EngagedIndicesTracker.js +202 -0
  134. package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -0
  135. package/dist/recyclerview/helpers/RenderTimeTracker.d.ts +14 -0
  136. package/dist/recyclerview/helpers/RenderTimeTracker.d.ts.map +1 -0
  137. package/dist/recyclerview/helpers/RenderTimeTracker.js +44 -0
  138. package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -0
  139. package/dist/recyclerview/helpers/VelocityTracker.d.ts +29 -0
  140. package/dist/recyclerview/helpers/VelocityTracker.d.ts.map +1 -0
  141. package/dist/recyclerview/helpers/VelocityTracker.js +64 -0
  142. package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -0
  143. package/dist/recyclerview/hooks/useBoundDetection.d.ts +17 -0
  144. package/dist/recyclerview/hooks/useBoundDetection.d.ts.map +1 -0
  145. package/dist/recyclerview/hooks/useBoundDetection.js +132 -0
  146. package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -0
  147. package/dist/recyclerview/hooks/useLayoutState.d.ts +14 -0
  148. package/dist/recyclerview/hooks/useLayoutState.d.ts.map +1 -0
  149. package/dist/recyclerview/hooks/useLayoutState.js +38 -0
  150. package/dist/recyclerview/hooks/useLayoutState.js.map +1 -0
  151. package/dist/recyclerview/hooks/useMappingHelper.d.ts +9 -0
  152. package/dist/recyclerview/hooks/useMappingHelper.d.ts.map +1 -0
  153. package/dist/recyclerview/hooks/useMappingHelper.js +15 -0
  154. package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -0
  155. package/dist/recyclerview/hooks/useOnLoad.d.ts +25 -0
  156. package/dist/recyclerview/hooks/useOnLoad.d.ts.map +1 -0
  157. package/dist/recyclerview/hooks/useOnLoad.js +67 -0
  158. package/dist/recyclerview/hooks/useOnLoad.js.map +1 -0
  159. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts +28 -0
  160. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -0
  161. package/dist/recyclerview/hooks/useRecyclerViewController.js +507 -0
  162. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -0
  163. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts +8 -0
  164. package/dist/recyclerview/hooks/useRecyclerViewManager.d.ts.map +1 -0
  165. package/dist/recyclerview/hooks/useRecyclerViewManager.js +32 -0
  166. package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -0
  167. package/dist/recyclerview/hooks/useRecyclingState.d.ts +18 -0
  168. package/dist/recyclerview/hooks/useRecyclingState.d.ts.map +1 -0
  169. package/dist/recyclerview/hooks/useRecyclingState.js +49 -0
  170. package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -0
  171. package/dist/recyclerview/hooks/useSecondaryProps.d.ts +27 -0
  172. package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -0
  173. package/dist/recyclerview/hooks/useSecondaryProps.js +90 -0
  174. package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -0
  175. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts +15 -0
  176. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.d.ts.map +1 -0
  177. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +58 -0
  178. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -0
  179. package/dist/recyclerview/hooks/useUnmountFlag.d.ts +10 -0
  180. package/dist/recyclerview/hooks/useUnmountFlag.d.ts.map +1 -0
  181. package/dist/recyclerview/hooks/useUnmountFlag.js +25 -0
  182. package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -0
  183. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts +79 -0
  184. package/dist/recyclerview/layout-managers/GridLayoutManager.d.ts.map +1 -0
  185. package/dist/recyclerview/layout-managers/GridLayoutManager.js +221 -0
  186. package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -0
  187. package/dist/recyclerview/layout-managers/LayoutManager.d.ts +296 -0
  188. package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -0
  189. package/dist/recyclerview/layout-managers/LayoutManager.js +279 -0
  190. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -0
  191. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts +51 -0
  192. package/dist/recyclerview/layout-managers/LinearLayoutManager.d.ts.map +1 -0
  193. package/dist/recyclerview/layout-managers/LinearLayoutManager.js +151 -0
  194. package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -0
  195. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts +81 -0
  196. package/dist/recyclerview/layout-managers/MasonryLayoutManager.d.ts.map +1 -0
  197. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +269 -0
  198. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -0
  199. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts +12 -0
  200. package/dist/recyclerview/utils/adjustOffsetForRTL.d.ts.map +1 -0
  201. package/dist/recyclerview/utils/adjustOffsetForRTL.js +14 -0
  202. package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -0
  203. package/dist/recyclerview/utils/componentUtils.d.ts +19 -0
  204. package/dist/recyclerview/utils/componentUtils.d.ts.map +1 -0
  205. package/dist/recyclerview/utils/componentUtils.js +27 -0
  206. package/dist/recyclerview/utils/componentUtils.js.map +1 -0
  207. package/dist/recyclerview/utils/findVisibleIndex.d.ts +24 -0
  208. package/dist/recyclerview/utils/findVisibleIndex.d.ts.map +1 -0
  209. package/dist/recyclerview/utils/findVisibleIndex.js +76 -0
  210. package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -0
  211. package/dist/recyclerview/utils/measureLayout.d.ts +52 -0
  212. package/dist/recyclerview/utils/measureLayout.d.ts.map +1 -0
  213. package/dist/recyclerview/utils/measureLayout.js +99 -0
  214. package/dist/recyclerview/utils/measureLayout.js.map +1 -0
  215. package/dist/recyclerview/utils/measureLayout.web.d.ts +29 -0
  216. package/dist/recyclerview/utils/measureLayout.web.d.ts.map +1 -0
  217. package/dist/recyclerview/utils/measureLayout.web.js +79 -0
  218. package/dist/recyclerview/utils/measureLayout.web.js.map +1 -0
  219. package/dist/recyclerview/viewability/ViewToken.d.ts +8 -0
  220. package/dist/recyclerview/viewability/ViewToken.d.ts.map +1 -0
  221. package/dist/recyclerview/viewability/ViewToken.js +2 -0
  222. package/dist/recyclerview/viewability/ViewToken.js.map +1 -0
  223. package/dist/recyclerview/viewability/ViewabilityHelper.d.ts +26 -0
  224. package/dist/recyclerview/viewability/ViewabilityHelper.d.ts.map +1 -0
  225. package/dist/recyclerview/viewability/ViewabilityHelper.js +98 -0
  226. package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -0
  227. package/dist/recyclerview/viewability/ViewabilityManager.d.ts +25 -0
  228. package/dist/recyclerview/viewability/ViewabilityManager.d.ts.map +1 -0
  229. package/dist/recyclerview/viewability/ViewabilityManager.js +94 -0
  230. package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -0
  231. package/dist/tsconfig.tsbuildinfo +1 -1
  232. package/dist/utils/AverageWindow.d.ts +33 -43
  233. package/dist/utils/AverageWindow.d.ts.map +1 -1
  234. package/dist/utils/AverageWindow.js +66 -71
  235. package/dist/utils/AverageWindow.js.map +1 -1
  236. package/jestSetup.js +23 -37
  237. package/package.json +15 -24
  238. package/src/AnimatedFlashList.ts +2 -25
  239. package/src/FlashList.ts +1 -0
  240. package/src/FlashListProps.ts +109 -100
  241. package/src/FlashListRef.ts +320 -0
  242. package/src/benchmark/AutoScrollHelper.ts +0 -24
  243. package/src/benchmark/JSFPSMonitor.ts +2 -26
  244. package/src/benchmark/roundToDecimalPlaces.ts +0 -24
  245. package/src/benchmark/useBenchmark.ts +59 -105
  246. package/src/benchmark/useDataMultiplier.ts +0 -24
  247. package/src/benchmark/useFlatListBenchmark.ts +43 -32
  248. package/src/errors/ErrorMessages.ts +26 -0
  249. package/src/errors/WarningMessages.ts +9 -0
  250. package/src/index.ts +18 -46
  251. package/src/isNewArch.ts +25 -0
  252. package/src/native/config/PlatformHelper.android.ts +3 -49
  253. package/src/native/config/PlatformHelper.harmony.ts +3 -24
  254. package/src/native/config/PlatformHelper.ios.ts +3 -48
  255. package/src/native/config/PlatformHelper.ts +3 -49
  256. package/src/native/config/PlatformHelper.web.ts +4 -55
  257. package/src/recyclerview/LayoutCommitObserver.tsx +74 -0
  258. package/src/recyclerview/RecyclerView.tsx +616 -0
  259. package/src/recyclerview/RecyclerViewContextProvider.ts +65 -0
  260. package/src/recyclerview/RecyclerViewManager.ts +461 -0
  261. package/src/recyclerview/RecyclerViewProps.ts +1 -0
  262. package/src/recyclerview/RenderStackManager.ts +317 -0
  263. package/src/recyclerview/ViewHolder.tsx +180 -0
  264. package/src/recyclerview/ViewHolderCollection.tsx +193 -0
  265. package/src/recyclerview/components/CompatScroller.ts +9 -0
  266. package/src/recyclerview/components/CompatView.ts +9 -0
  267. package/src/recyclerview/components/ScrollAnchor.tsx +66 -0
  268. package/src/recyclerview/components/StickyHeaders.tsx +222 -0
  269. package/src/recyclerview/helpers/ConsecutiveNumbers.ts +120 -0
  270. package/src/recyclerview/helpers/EngagedIndicesTracker.ts +301 -0
  271. package/src/recyclerview/helpers/RenderTimeTracker.ts +50 -0
  272. package/src/recyclerview/helpers/VelocityTracker.ts +77 -0
  273. package/src/recyclerview/hooks/useBoundDetection.ts +176 -0
  274. package/src/recyclerview/hooks/useLayoutState.ts +55 -0
  275. package/src/recyclerview/hooks/useMappingHelper.ts +20 -0
  276. package/src/recyclerview/hooks/useOnLoad.ts +80 -0
  277. package/src/recyclerview/hooks/useRecyclerViewController.tsx +633 -0
  278. package/src/recyclerview/hooks/useRecyclerViewManager.ts +42 -0
  279. package/src/recyclerview/hooks/useRecyclingState.ts +67 -0
  280. package/src/recyclerview/hooks/useSecondaryProps.tsx +124 -0
  281. package/src/recyclerview/hooks/useUnmountAwareCallbacks.ts +73 -0
  282. package/src/recyclerview/hooks/useUnmountFlag.ts +27 -0
  283. package/src/recyclerview/layout-managers/GridLayoutManager.ts +256 -0
  284. package/src/recyclerview/layout-managers/LayoutManager.ts +568 -0
  285. package/src/recyclerview/layout-managers/LinearLayoutManager.ts +171 -0
  286. package/src/recyclerview/layout-managers/MasonryLayoutManager.ts +323 -0
  287. package/src/recyclerview/utils/adjustOffsetForRTL.ts +17 -0
  288. package/src/recyclerview/utils/componentUtils.ts +28 -0
  289. package/src/recyclerview/utils/findVisibleIndex.ts +93 -0
  290. package/src/recyclerview/utils/measureLayout.ts +128 -0
  291. package/src/recyclerview/utils/measureLayout.web.ts +102 -0
  292. package/src/recyclerview/viewability/ViewToken.ts +7 -0
  293. package/src/{viewability → recyclerview/viewability}/ViewabilityHelper.ts +8 -33
  294. package/src/{viewability → recyclerview/viewability}/ViewabilityManager.ts +23 -46
  295. package/src/utils/AverageWindow.ts +33 -24
  296. package/dist/GridLayoutProviderWithProps.d.ts +0 -65
  297. package/dist/GridLayoutProviderWithProps.d.ts.map +0 -1
  298. package/dist/GridLayoutProviderWithProps.js +0 -138
  299. package/dist/GridLayoutProviderWithProps.js.map +0 -1
  300. package/dist/MasonryFlashList.d.ts +0 -74
  301. package/dist/MasonryFlashList.d.ts.map +0 -1
  302. package/dist/MasonryFlashList.js +0 -275
  303. package/dist/MasonryFlashList.js.map +0 -1
  304. package/dist/PureComponentWrapper.d.ts +0 -45
  305. package/dist/PureComponentWrapper.d.ts.map +0 -1
  306. package/dist/PureComponentWrapper.js +0 -60
  307. package/dist/PureComponentWrapper.js.map +0 -1
  308. package/dist/__tests__/AverageWindow.test.d.ts +0 -2
  309. package/dist/__tests__/AverageWindow.test.d.ts.map +0 -1
  310. package/dist/__tests__/AverageWindow.test.js +0 -69
  311. package/dist/__tests__/AverageWindow.test.js.map +0 -1
  312. package/dist/__tests__/ContentContainerUtils.test.d.ts +0 -2
  313. package/dist/__tests__/ContentContainerUtils.test.d.ts.map +0 -1
  314. package/dist/__tests__/ContentContainerUtils.test.js +0 -85
  315. package/dist/__tests__/ContentContainerUtils.test.js.map +0 -1
  316. package/dist/__tests__/FlashList.test.d.ts +0 -2
  317. package/dist/__tests__/FlashList.test.d.ts.map +0 -1
  318. package/dist/__tests__/FlashList.test.js +0 -792
  319. package/dist/__tests__/FlashList.test.js.map +0 -1
  320. package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts +0 -2
  321. package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts.map +0 -1
  322. package/dist/__tests__/GridLayoutProviderWithProps.test.js +0 -143
  323. package/dist/__tests__/GridLayoutProviderWithProps.test.js.map +0 -1
  324. package/dist/__tests__/MasonryFlashList.test.d.ts +0 -2
  325. package/dist/__tests__/MasonryFlashList.test.d.ts.map +0 -1
  326. package/dist/__tests__/MasonryFlashList.test.js +0 -254
  327. package/dist/__tests__/MasonryFlashList.test.js.map +0 -1
  328. package/dist/__tests__/PlatformHelper.web.test.d.ts +0 -2
  329. package/dist/__tests__/PlatformHelper.web.test.d.ts.map +0 -1
  330. package/dist/__tests__/PlatformHelper.web.test.js +0 -33
  331. package/dist/__tests__/PlatformHelper.web.test.js.map +0 -1
  332. package/dist/__tests__/ViewabilityHelper.test.d.ts +0 -2
  333. package/dist/__tests__/ViewabilityHelper.test.d.ts.map +0 -1
  334. package/dist/__tests__/ViewabilityHelper.test.js +0 -187
  335. package/dist/__tests__/ViewabilityHelper.test.js.map +0 -1
  336. package/dist/__tests__/helpers/mountFlashList.d.ts +0 -19
  337. package/dist/__tests__/helpers/mountFlashList.d.ts.map +0 -1
  338. package/dist/__tests__/helpers/mountFlashList.js +0 -44
  339. package/dist/__tests__/helpers/mountFlashList.js.map +0 -1
  340. package/dist/__tests__/helpers/mountMasonryFlashList.d.ts +0 -18
  341. package/dist/__tests__/helpers/mountMasonryFlashList.d.ts.map +0 -1
  342. package/dist/__tests__/helpers/mountMasonryFlashList.js +0 -49
  343. package/dist/__tests__/helpers/mountMasonryFlashList.js.map +0 -1
  344. package/dist/__tests__/useBlankAreaTracker.test.d.ts +0 -2
  345. package/dist/__tests__/useBlankAreaTracker.test.d.ts.map +0 -1
  346. package/dist/__tests__/useBlankAreaTracker.test.js +0 -177
  347. package/dist/__tests__/useBlankAreaTracker.test.js.map +0 -1
  348. package/dist/benchmark/useBlankAreaTracker.d.ts +0 -57
  349. package/dist/benchmark/useBlankAreaTracker.d.ts.map +0 -1
  350. package/dist/benchmark/useBlankAreaTracker.js +0 -90
  351. package/dist/benchmark/useBlankAreaTracker.js.map +0 -1
  352. package/dist/errors/CustomError.d.ts +0 -31
  353. package/dist/errors/CustomError.d.ts.map +0 -1
  354. package/dist/errors/CustomError.js +0 -37
  355. package/dist/errors/CustomError.js.map +0 -1
  356. package/dist/errors/ExceptionList.d.ts +0 -47
  357. package/dist/errors/ExceptionList.d.ts.map +0 -1
  358. package/dist/errors/ExceptionList.js +0 -49
  359. package/dist/errors/ExceptionList.js.map +0 -1
  360. package/dist/errors/Warnings.d.ts +0 -32
  361. package/dist/errors/Warnings.d.ts.map +0 -1
  362. package/dist/errors/Warnings.js +0 -36
  363. package/dist/errors/Warnings.js.map +0 -1
  364. package/dist/fabric/AutoLayoutNativeComponent.d.ts +0 -42
  365. package/dist/fabric/AutoLayoutNativeComponent.d.ts.map +0 -1
  366. package/dist/fabric/AutoLayoutNativeComponent.js +0 -29
  367. package/dist/fabric/AutoLayoutNativeComponent.js.map +0 -1
  368. package/dist/fabric/CellContainerNativeComponent.d.ts +0 -31
  369. package/dist/fabric/CellContainerNativeComponent.d.ts.map +0 -1
  370. package/dist/fabric/CellContainerNativeComponent.js +0 -29
  371. package/dist/fabric/CellContainerNativeComponent.js.map +0 -1
  372. package/dist/native/auto-layout/AutoLayoutView.d.ts +0 -45
  373. package/dist/native/auto-layout/AutoLayoutView.d.ts.map +0 -1
  374. package/dist/native/auto-layout/AutoLayoutView.js +0 -71
  375. package/dist/native/auto-layout/AutoLayoutView.js.map +0 -1
  376. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts +0 -27
  377. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts.map +0 -1
  378. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js +0 -29
  379. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js.map +0 -1
  380. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts +0 -28
  381. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts.map +0 -1
  382. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts +0 -27
  383. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts.map +0 -1
  384. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js +0 -29
  385. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js.map +0 -1
  386. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts +0 -27
  387. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts.map +0 -1
  388. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js +0 -29
  389. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js.map +0 -1
  390. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js +0 -29
  391. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js.map +0 -1
  392. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts +0 -39
  393. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts.map +0 -1
  394. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js +0 -26
  395. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js.map +0 -1
  396. package/dist/native/cell-container/CellContainer.android.d.ts +0 -29
  397. package/dist/native/cell-container/CellContainer.android.d.ts.map +0 -1
  398. package/dist/native/cell-container/CellContainer.android.js +0 -32
  399. package/dist/native/cell-container/CellContainer.android.js.map +0 -1
  400. package/dist/native/cell-container/CellContainer.d.ts +0 -31
  401. package/dist/native/cell-container/CellContainer.d.ts.map +0 -1
  402. package/dist/native/cell-container/CellContainer.harmony.d.ts +0 -29
  403. package/dist/native/cell-container/CellContainer.harmony.d.ts.map +0 -1
  404. package/dist/native/cell-container/CellContainer.harmony.js +0 -32
  405. package/dist/native/cell-container/CellContainer.harmony.js.map +0 -1
  406. package/dist/native/cell-container/CellContainer.ios.d.ts +0 -29
  407. package/dist/native/cell-container/CellContainer.ios.d.ts.map +0 -1
  408. package/dist/native/cell-container/CellContainer.ios.js +0 -32
  409. package/dist/native/cell-container/CellContainer.ios.js.map +0 -1
  410. package/dist/native/cell-container/CellContainer.js +0 -34
  411. package/dist/native/cell-container/CellContainer.js.map +0 -1
  412. package/dist/native/cell-container/CellContainer.web.d.ts +0 -30
  413. package/dist/native/cell-container/CellContainer.web.d.ts.map +0 -1
  414. package/dist/native/cell-container/CellContainer.web.js +0 -36
  415. package/dist/native/cell-container/CellContainer.web.js.map +0 -1
  416. package/dist/utils/ContentContainerUtils.d.ts +0 -50
  417. package/dist/utils/ContentContainerUtils.d.ts.map +0 -1
  418. package/dist/utils/ContentContainerUtils.js +0 -71
  419. package/dist/utils/ContentContainerUtils.js.map +0 -1
  420. package/dist/viewability/ViewToken.d.ts +0 -31
  421. package/dist/viewability/ViewToken.d.ts.map +0 -1
  422. package/dist/viewability/ViewToken.js +0 -26
  423. package/dist/viewability/ViewToken.js.map +0 -1
  424. package/dist/viewability/ViewabilityHelper.d.ts +0 -49
  425. package/dist/viewability/ViewabilityHelper.d.ts.map +0 -1
  426. package/dist/viewability/ViewabilityHelper.js +0 -130
  427. package/dist/viewability/ViewabilityHelper.js.map +0 -1
  428. package/dist/viewability/ViewabilityManager.d.ts +0 -48
  429. package/dist/viewability/ViewabilityManager.d.ts.map +0 -1
  430. package/dist/viewability/ViewabilityManager.js +0 -131
  431. package/dist/viewability/ViewabilityManager.js.map +0 -1
  432. package/harmony/flash_list/BuildProfile.ets +0 -17
  433. package/harmony/flash_list/LICENSE +0 -7
  434. package/harmony/flash_list/build-profile.json5 +0 -8
  435. package/harmony/flash_list/hvigorfile.ts +0 -1
  436. package/harmony/flash_list/index.ets +0 -27
  437. package/harmony/flash_list/obfuscation-rules.txt +0 -18
  438. package/harmony/flash_list/oh-package.json5 +0 -24
  439. package/harmony/flash_list/src/main/cpp/AutoLayoutNode.cpp +0 -63
  440. package/harmony/flash_list/src/main/cpp/AutoLayoutNode.h +0 -54
  441. package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.cpp +0 -140
  442. package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.h +0 -66
  443. package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.cpp +0 -208
  444. package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.h +0 -78
  445. package/harmony/flash_list/src/main/cpp/AutoLayoutViewEventEmitRequestHandler.h +0 -53
  446. package/harmony/flash_list/src/main/cpp/AutoLayoutViewJSIBinder.h +0 -50
  447. package/harmony/flash_list/src/main/cpp/CMakeLists.txt +0 -12
  448. package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.cpp +0 -80
  449. package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.h +0 -64
  450. package/harmony/flash_list/src/main/cpp/CellContainerJSIBinder.h +0 -39
  451. package/harmony/flash_list/src/main/cpp/ComponentDescriptors.h +0 -40
  452. package/harmony/flash_list/src/main/cpp/EventEmitters.cpp +0 -40
  453. package/harmony/flash_list/src/main/cpp/EventEmitters.h +0 -48
  454. package/harmony/flash_list/src/main/cpp/FlashListPackage.h +0 -85
  455. package/harmony/flash_list/src/main/cpp/FlashListStackNode.cpp +0 -87
  456. package/harmony/flash_list/src/main/cpp/FlashListStackNode.h +0 -57
  457. package/harmony/flash_list/src/main/cpp/Props.cpp +0 -52
  458. package/harmony/flash_list/src/main/cpp/Props.h +0 -64
  459. package/harmony/flash_list/src/main/cpp/ShadowNodes.cpp +0 -34
  460. package/harmony/flash_list/src/main/cpp/ShadowNodes.h +0 -48
  461. package/harmony/flash_list/src/main/ets/Logger.ets +0 -64
  462. package/harmony/flash_list/src/main/ets/RNAutoLayoutShadow.ets +0 -154
  463. package/harmony/flash_list/src/main/ets/RNAutoLayoutView.ets +0 -277
  464. package/harmony/flash_list/src/main/ets/RNCellContainer.ets +0 -113
  465. package/harmony/flash_list/src/main/module.json5 +0 -9
  466. package/harmony/flash_list/src/main/resources/base/element/color.json +0 -8
  467. package/harmony/flash_list/src/main/resources/base/element/string.json +0 -16
  468. package/harmony/flash_list/src/main/resources/base/media/icon.png +0 -0
  469. package/harmony/flash_list/src/main/resources/base/profile/main_pages.json +0 -5
  470. package/harmony/flash_list/src/main/resources/en_US/element/string.json +0 -16
  471. package/harmony/flash_list/src/main/resources/zh_CN/element/string.json +0 -16
  472. package/harmony/flash_list.har +0 -0
  473. package/src/FlashList.tsx +0 -949
  474. package/src/GridLayoutProviderWithProps.ts +0 -204
  475. package/src/MasonryFlashList.tsx +0 -499
  476. package/src/PureComponentWrapper.tsx +0 -65
  477. package/src/benchmark/useBlankAreaTracker.ts +0 -141
  478. package/src/errors/CustomError.ts +0 -34
  479. package/src/errors/ExceptionList.ts +0 -52
  480. package/src/errors/Warnings.ts +0 -39
  481. package/src/fabric/AutoLayoutNativeComponent.ts +0 -52
  482. package/src/fabric/CellContainerNativeComponent.ts +0 -35
  483. package/src/native/auto-layout/AutoLayoutView.tsx +0 -97
  484. package/src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts +0 -31
  485. package/src/native/auto-layout/AutoLayoutViewNativeComponent.harmony.ts +0 -31
  486. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts +0 -31
  487. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ts +0 -31
  488. package/src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts +0 -41
  489. package/src/native/cell-container/CellContainer.android.ts +0 -31
  490. package/src/native/cell-container/CellContainer.harmony.ts +0 -31
  491. package/src/native/cell-container/CellContainer.ios.ts +0 -31
  492. package/src/native/cell-container/CellContainer.tsx +0 -38
  493. package/src/native/cell-container/CellContainer.web.tsx +0 -33
  494. package/src/utils/ContentContainerUtils.ts +0 -116
  495. package/src/viewability/ViewToken.ts +0 -31
@@ -0,0 +1,301 @@
1
+ import { PlatformConfig } from "../../native/config/PlatformHelper";
2
+ import { RVLayoutManager } from "../layout-managers/LayoutManager";
3
+
4
+ import { ConsecutiveNumbers } from "./ConsecutiveNumbers";
5
+
6
+ export interface RVEngagedIndicesTracker {
7
+ // Current scroll offset of the list. Directly setting this won't trigger visible indices updates
8
+ scrollOffset: number;
9
+ // Total distance (in pixels) to pre-render items before and after the visible viewport
10
+ drawDistance: number;
11
+ // Whether to use offset projection to predict the next scroll offset
12
+ enableOffsetProjection: boolean;
13
+ // Average render time of the list
14
+ averageRenderTime: number;
15
+
16
+ /**
17
+ * Updates the scroll offset and calculates which items should be rendered (engaged indices).
18
+ * @param offset - The new scroll offset position
19
+ * @param velocity - Current scroll velocity to optimize buffer distribution
20
+ * @param layoutManager - Layout manager to fetch item positions and dimensions
21
+ * @returns New engaged indices if changed, undefined if no change
22
+ */
23
+ updateScrollOffset: (
24
+ offset: number,
25
+ velocity: Velocity | null | undefined,
26
+ layoutManager: RVLayoutManager
27
+ ) => ConsecutiveNumbers | undefined;
28
+
29
+ /**
30
+ * Returns the currently engaged (rendered) indices.
31
+ * This includes both visible items and buffer items.
32
+ * @returns The last computed set of engaged indices
33
+ */
34
+ getEngagedIndices: () => ConsecutiveNumbers;
35
+
36
+ /**
37
+ * Computes the visible indices in the viewport.
38
+ * @param layoutManager - Layout manager to fetch item positions and dimensions
39
+ * @returns Indices of items currently visible in the viewport
40
+ */
41
+ computeVisibleIndices: (layoutManager: RVLayoutManager) => ConsecutiveNumbers;
42
+
43
+ /**
44
+ * Sets the scroll direction for velocity history tracking.
45
+ * @param scrollDirection - The direction of scrolling ("forward" or "backward")
46
+ */
47
+ setScrollDirection: (scrollDirection: "forward" | "backward") => void;
48
+
49
+ /**
50
+ * Resets the velocity history based on the current scroll direction.
51
+ */
52
+ resetVelocityHistory: () => void;
53
+ }
54
+
55
+ export interface Velocity {
56
+ x: number;
57
+ y: number;
58
+ }
59
+
60
+ export class RVEngagedIndicesTrackerImpl implements RVEngagedIndicesTracker {
61
+ // Current scroll position of the list
62
+ public scrollOffset = 0;
63
+ // Distance to pre-render items before and after the visible viewport (in pixels)
64
+ public drawDistance = PlatformConfig.defaultDrawDistance;
65
+
66
+ // Whether to use offset projection to predict the next scroll offset
67
+ public enableOffsetProjection = true;
68
+
69
+ // Average render time of the list
70
+ public averageRenderTime = 16;
71
+
72
+ // Internal override to disable offset projection
73
+ private forceDisableOffsetProjection = false;
74
+
75
+ // Currently rendered item indices (including buffer items)
76
+ private engagedIndices = ConsecutiveNumbers.EMPTY;
77
+
78
+ // Buffer distribution multipliers for scroll direction optimization
79
+ private smallMultiplier = 0.3; // Used for buffer in the opposite direction of scroll
80
+ private largeMultiplier = 0.7; // Used for buffer in the direction of scroll
81
+
82
+ // Circular buffer to track recent scroll velocities for direction detection
83
+ private velocityHistory = [0, 0, 0, -0.1, -0.1];
84
+ private velocityIndex = 0;
85
+
86
+ /**
87
+ * Updates scroll position and determines which items should be rendered.
88
+ * Implements a smart buffer system that:
89
+ * 1. Calculates the visible viewport
90
+ * 2. Determines optimal buffer distribution based on scroll direction
91
+ * 3. Adjusts buffer sizes at list boundaries
92
+ * 4. Returns new indices that need to be rendered
93
+ */
94
+ updateScrollOffset(
95
+ offset: number,
96
+ velocity: Velocity | null | undefined,
97
+ layoutManager: RVLayoutManager
98
+ ): ConsecutiveNumbers | undefined {
99
+ // Update current scroll position
100
+ this.scrollOffset = offset;
101
+
102
+ // STEP 1: Determine the currently visible viewport
103
+ const windowSize = layoutManager.getWindowsSize();
104
+ const isHorizontal = layoutManager.isHorizontal();
105
+
106
+ // Update velocity history
107
+ if (velocity) {
108
+ this.updateVelocityHistory(isHorizontal ? velocity.x : velocity.y);
109
+ }
110
+
111
+ // Determine scroll direction to optimize buffer distribution
112
+ const isScrollingBackward = this.isScrollingBackward();
113
+ const viewportStart =
114
+ this.enableOffsetProjection && !this.forceDisableOffsetProjection
115
+ ? this.getProjectedScrollOffset(offset, this.averageRenderTime)
116
+ : offset;
117
+
118
+ // console.log("timeMs", this.averageRenderTime, offset, viewportStart);
119
+
120
+ const viewportSize = isHorizontal ? windowSize.width : windowSize.height;
121
+ const viewportEnd = viewportStart + viewportSize;
122
+
123
+ // STEP 2: Determine buffer size and distribution
124
+ // The total extra space where items will be pre-rendered
125
+ const totalBuffer = this.drawDistance * 2;
126
+
127
+ // Distribute more buffer in the direction of scrolling
128
+ // When scrolling forward: more buffer after viewport
129
+ // When scrolling backward: more buffer before viewport
130
+ const beforeRatio = isScrollingBackward
131
+ ? this.largeMultiplier
132
+ : this.smallMultiplier;
133
+ const afterRatio = isScrollingBackward
134
+ ? this.smallMultiplier
135
+ : this.largeMultiplier;
136
+
137
+ const bufferBefore = Math.ceil(totalBuffer * beforeRatio);
138
+ const bufferAfter = Math.ceil(totalBuffer * afterRatio);
139
+
140
+ // STEP 3: Calculate the extended viewport (visible area + buffers)
141
+ // The start position with buffer (never less than 0)
142
+ let extendedStart = Math.max(0, viewportStart - bufferBefore);
143
+
144
+ // If we couldn't apply full buffer at start, calculate how much was unused
145
+ const unusedStartBuffer = Math.max(0, bufferBefore - viewportStart);
146
+
147
+ // Add any unused start buffer to the end buffer
148
+ let extendedEnd = viewportEnd + bufferAfter + unusedStartBuffer;
149
+
150
+ // STEP 4: Handle end boundary adjustments
151
+ // Get the total content size to check for end boundary
152
+ const layoutSize = layoutManager.getLayoutSize();
153
+ const maxPosition = isHorizontal ? layoutSize.width : layoutSize.height;
154
+
155
+ // If we hit the end boundary, redistribute unused buffer to the start
156
+ if (extendedEnd > maxPosition) {
157
+ // Calculate unused end buffer and apply it to the start if possible
158
+ const unusedEndBuffer = extendedEnd - maxPosition;
159
+ extendedEnd = maxPosition;
160
+
161
+ // Try to extend start position further with the unused end buffer
162
+ extendedStart = Math.max(0, extendedStart - unusedEndBuffer);
163
+ }
164
+
165
+ // STEP 5: Get and return the new engaged indices
166
+ const newEngagedIndices = layoutManager.getVisibleLayouts(
167
+ extendedStart,
168
+ extendedEnd
169
+ );
170
+ // console.log(
171
+ // "newEngagedIndices",
172
+ // newEngagedIndices,
173
+ // this.scrollOffset,
174
+ // viewportStart
175
+ // );
176
+ // Only return new indices if they've changed
177
+ const oldEngagedIndices = this.engagedIndices;
178
+ this.engagedIndices = newEngagedIndices;
179
+
180
+ return newEngagedIndices.equals(oldEngagedIndices)
181
+ ? undefined
182
+ : newEngagedIndices;
183
+ }
184
+
185
+ /**
186
+ * Updates the velocity history with a new velocity value.
187
+ * @param velocity - Current scroll velocity component (x or y)
188
+ */
189
+ private updateVelocityHistory(velocity: number) {
190
+ this.velocityHistory[this.velocityIndex] = velocity;
191
+ this.velocityIndex = (this.velocityIndex + 1) % this.velocityHistory.length;
192
+ }
193
+
194
+ /**
195
+ * Determines scroll direction by analyzing recent velocity history.
196
+ * Uses a majority voting system on the last 5 velocity values.
197
+ * @returns true if scrolling backward (negative direction), false otherwise
198
+ */
199
+ private isScrollingBackward(): boolean {
200
+ // should decide based on whether we have more positive or negative values, use for loop
201
+ let positiveCount = 0;
202
+ let negativeCount = 0;
203
+ // eslint-disable-next-line @typescript-eslint/prefer-for-of
204
+ for (let i = 0; i < this.velocityHistory.length; i++) {
205
+ if (this.velocityHistory[i] > 0) {
206
+ positiveCount++;
207
+ } else if (this.velocityHistory[i] < 0) {
208
+ negativeCount++;
209
+ }
210
+ }
211
+ return positiveCount < negativeCount;
212
+ }
213
+
214
+ /**
215
+ * Calculates the median velocity based on velocity history
216
+ * Medina works better agains outliers
217
+ * @returns Median velocity over the recent history
218
+ */
219
+ private getMedianVelocity(): number {
220
+ // Make a copy of velocity history and sort it
221
+ const sortedVelocities = [...this.velocityHistory].sort(
222
+ (valueA, valueB) => valueA - valueB
223
+ );
224
+ const length = sortedVelocities.length;
225
+
226
+ // If length is odd, return the middle element
227
+ if (length % 2 === 1) {
228
+ return sortedVelocities[Math.floor(length / 2)];
229
+ }
230
+
231
+ // If length is even, return the average of the two middle elements
232
+ const midIndex = length / 2;
233
+ return (sortedVelocities[midIndex - 1] + sortedVelocities[midIndex]) / 2;
234
+ }
235
+
236
+ /**
237
+ * Projects the next scroll offset based on median velocity
238
+ * @param timeMs Time in milliseconds to predict ahead
239
+ * @returns Projected scroll offset
240
+ */
241
+ private getProjectedScrollOffset(offset: number, timeMs: number): number {
242
+ const medianVelocity = this.getMedianVelocity();
243
+ // Convert time from ms to seconds for velocity calculation
244
+ // Predict next position: current position + (velocity * time)
245
+ return offset + medianVelocity * timeMs;
246
+ }
247
+
248
+ /**
249
+ * Calculates which items are currently visible in the viewport.
250
+ * Unlike getEngagedIndices, this doesn't include buffer items.
251
+ * @param layoutManager - Layout manager to fetch item positions
252
+ * @returns Indices of items currently visible in the viewport
253
+ */
254
+ computeVisibleIndices(layoutManager: RVLayoutManager): ConsecutiveNumbers {
255
+ const windowSize = layoutManager.getWindowsSize();
256
+ const isHorizontal = layoutManager.isHorizontal();
257
+
258
+ // Calculate viewport boundaries
259
+ const viewportStart = this.scrollOffset;
260
+ const viewportSize = isHorizontal ? windowSize.width : windowSize.height;
261
+ const viewportEnd = viewportStart + viewportSize;
262
+
263
+ // Get indices of items currently visible in the viewport
264
+ const newVisibleIndices = layoutManager.getVisibleLayouts(
265
+ viewportStart,
266
+ viewportEnd
267
+ );
268
+ return newVisibleIndices;
269
+ }
270
+
271
+ /**
272
+ * Returns the currently engaged (rendered) indices.
273
+ * This includes both visible items and buffer items.
274
+ * @returns The last computed set of engaged indices
275
+ */
276
+ getEngagedIndices(): ConsecutiveNumbers {
277
+ return this.engagedIndices;
278
+ }
279
+
280
+ setScrollDirection(scrollDirection: "forward" | "backward") {
281
+ if (scrollDirection === "forward") {
282
+ this.velocityHistory = [0, 0, 0, 0.1, 0.1];
283
+ this.velocityIndex = 0;
284
+ } else {
285
+ this.velocityHistory = [0, 0, 0, -0.1, -0.1];
286
+ this.velocityIndex = 0;
287
+ }
288
+ }
289
+
290
+ /**
291
+ * Resets the velocity history based on the current scroll direction.
292
+ * This ensures that the velocity history is always in sync with the current scroll direction.
293
+ */
294
+ resetVelocityHistory() {
295
+ if (this.isScrollingBackward()) {
296
+ this.setScrollDirection("backward");
297
+ } else {
298
+ this.setScrollDirection("forward");
299
+ }
300
+ }
301
+ }
@@ -0,0 +1,50 @@
1
+ import { PlatformConfig } from "../../native/config/PlatformHelper";
2
+ import { AverageWindow } from "../../utils/AverageWindow";
3
+
4
+ export class RenderTimeTracker {
5
+ private renderTimeAvgWindow = new AverageWindow(5);
6
+ private lastTimerStartedAt = -1;
7
+ private maxRenderTime = 32; // TODO: Improve this even more
8
+ private defaultRenderTime = 16;
9
+ private rendersWithoutCommit = 0;
10
+ private maxRendersWithoutCommit = 40;
11
+
12
+ startTracking() {
13
+ this.rendersWithoutCommit++;
14
+ if (!PlatformConfig.trackAverageRenderTimeForOffsetProjection) {
15
+ return;
16
+ }
17
+ if (this.lastTimerStartedAt === -1) {
18
+ this.lastTimerStartedAt = Date.now();
19
+ }
20
+ }
21
+
22
+ markRenderComplete() {
23
+ this.rendersWithoutCommit = 0;
24
+ if (!PlatformConfig.trackAverageRenderTimeForOffsetProjection) {
25
+ return;
26
+ }
27
+ if (this.lastTimerStartedAt !== -1) {
28
+ this.renderTimeAvgWindow.addValue(Date.now() - this.lastTimerStartedAt);
29
+ this.lastTimerStartedAt = -1;
30
+ }
31
+ }
32
+
33
+ hasExceededMaxRendersWithoutCommit() {
34
+ return this.rendersWithoutCommit >= this.maxRendersWithoutCommit;
35
+ }
36
+
37
+ getRawValue() {
38
+ return this.renderTimeAvgWindow.currentValue;
39
+ }
40
+
41
+ getAverageRenderTime() {
42
+ if (!PlatformConfig.trackAverageRenderTimeForOffsetProjection) {
43
+ return this.defaultRenderTime;
44
+ }
45
+ return Math.min(
46
+ this.maxRenderTime,
47
+ Math.max(Math.round(this.renderTimeAvgWindow.currentValue), 16)
48
+ );
49
+ }
50
+ }
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Tracks and calculates velocity for scroll/drag movements
3
+ * Used to determine momentum scrolling behavior
4
+ */
5
+ export class VelocityTracker<T> {
6
+ /** Timestamp of the last velocity update */
7
+ private lastUpdateTime = Date.now();
8
+ /** Current velocity vector with x and y components */
9
+ private velocity = { x: 0, y: 0 };
10
+
11
+ /** Reference to the momentum end timeout */
12
+ private timeoutId: NodeJS.Timeout | null = null;
13
+
14
+ /**
15
+ * Calculates velocity based on position change over time
16
+ * @param newOffset Current position value
17
+ * @param oldOffset Previous position value
18
+ * @param isHorizontal Whether movement is horizontal (true) or vertical (false)
19
+ * @param isRTL Whether layout direction is right-to-left
20
+ * @param callback Function to call with velocity updates and momentum end signal
21
+ */
22
+ computeVelocity(
23
+ newOffset: number,
24
+ oldOffset: number,
25
+ isHorizontal: boolean,
26
+ callback: (
27
+ velocity: { x: number; y: number },
28
+ isMomentumEnd: boolean
29
+ ) => void
30
+ ) {
31
+ // Clear any pending momentum end timeout
32
+ this.cleanUp();
33
+ // Calculate time since last update
34
+ const currentTime = Date.now();
35
+ const timeSinceLastUpdate = Math.max(1, currentTime - this.lastUpdateTime);
36
+
37
+ // Calculate velocity as distance/time
38
+ const newVelocity = (newOffset - oldOffset) / timeSinceLastUpdate;
39
+
40
+ // console.log(
41
+ // "newVelocity",
42
+ // newOffset,
43
+ // oldOffset,
44
+ // currentTime,
45
+ // this.lastUpdateTime,
46
+ // timeSinceLastUpdate,
47
+ // newVelocity
48
+ // );
49
+ this.lastUpdateTime = currentTime;
50
+
51
+ // Apply velocity to the correct axis
52
+ this.velocity.x = isHorizontal ? newVelocity : 0;
53
+ this.velocity.y = isHorizontal ? 0 : newVelocity;
54
+
55
+ // Trigger callback with current velocity
56
+ callback(this.velocity, false);
57
+
58
+ // Set timeout to signal momentum end after 100ms of no updates
59
+ this.timeoutId = setTimeout(() => {
60
+ this.cleanUp();
61
+ this.lastUpdateTime = Date.now();
62
+ this.velocity.x = 0;
63
+ this.velocity.y = 0;
64
+ callback(this.velocity, true);
65
+ }, 100);
66
+ }
67
+
68
+ /**
69
+ * Cleans up resources by clearing any pending timeout
70
+ */
71
+ cleanUp() {
72
+ if (this.timeoutId !== null) {
73
+ clearTimeout(this.timeoutId);
74
+ this.timeoutId = null;
75
+ }
76
+ }
77
+ }
@@ -0,0 +1,176 @@
1
+ import { useCallback, useEffect, useMemo, useRef } from "react";
2
+
3
+ import { RecyclerViewManager } from "../RecyclerViewManager";
4
+ import { CompatScroller } from "../components/CompatScroller";
5
+
6
+ import { useUnmountAwareAnimationFrame } from "./useUnmountAwareCallbacks";
7
+
8
+ /**
9
+ * Hook to detect when the scroll position reaches near the start or end of the list
10
+ * and trigger the appropriate callbacks. This hook is responsible for:
11
+ * 1. Detecting when the user scrolls near the end of the list (onEndReached)
12
+ * 2. Detecting when the user scrolls near the start of the list (onStartReached)
13
+ * 3. Managing auto-scrolling to bottom when new content is added
14
+ *
15
+ * @param recyclerViewManager - The RecyclerViewManager instance that handles the list's core functionality
16
+ * @param props - The RecyclerViewProps containing configuration and callbacks
17
+ * @param scrollViewRef - Reference to the scrollable container component
18
+ */
19
+ export function useBoundDetection<T>(
20
+ recyclerViewManager: RecyclerViewManager<T>,
21
+ scrollViewRef: React.RefObject<CompatScroller>
22
+ ) {
23
+ // Track whether we've already triggered the end reached callback to prevent duplicate calls
24
+ const pendingEndReached = useRef(false);
25
+ // Track whether we've already triggered the start reached callback to prevent duplicate calls
26
+ const pendingStartReached = useRef(false);
27
+ // Track whether we should auto-scroll to bottom when new content is added
28
+ const pendingAutoscrollToBottom = useRef(false);
29
+
30
+ const lastCheckBoundsTime = useRef(Date.now());
31
+
32
+ const { data } = recyclerViewManager.props;
33
+ const { requestAnimationFrame } = useUnmountAwareAnimationFrame();
34
+
35
+ const windowHeight = recyclerViewManager.hasLayout()
36
+ ? recyclerViewManager.getWindowSize().height
37
+ : 0;
38
+
39
+ const contentHeight = recyclerViewManager.hasLayout()
40
+ ? recyclerViewManager.getChildContainerDimensions().height
41
+ : 0;
42
+
43
+ const windowWidth = recyclerViewManager.hasLayout()
44
+ ? recyclerViewManager.getWindowSize().width
45
+ : 0;
46
+
47
+ const contentWidth = recyclerViewManager.hasLayout()
48
+ ? recyclerViewManager.getChildContainerDimensions().width
49
+ : 0;
50
+
51
+ /**
52
+ * Checks if the scroll position is near the start or end of the list
53
+ * and triggers appropriate callbacks if configured.
54
+ */
55
+ const checkBounds = useCallback(() => {
56
+ lastCheckBoundsTime.current = Date.now();
57
+
58
+ const {
59
+ onEndReached,
60
+ onStartReached,
61
+ maintainVisibleContentPosition,
62
+ horizontal,
63
+ onEndReachedThreshold: onEndReachedThresholdProp,
64
+ onStartReachedThreshold: onStartReachedThresholdProp,
65
+ } = recyclerViewManager.props;
66
+ // Skip all calculations if neither callback is provided and autoscroll is disabled
67
+ const autoscrollToBottomThreshold =
68
+ maintainVisibleContentPosition?.autoscrollToBottomThreshold ?? -1;
69
+
70
+ if (!onEndReached && !onStartReached && autoscrollToBottomThreshold < 0) {
71
+ return;
72
+ }
73
+
74
+ if (recyclerViewManager.getIsFirstLayoutComplete()) {
75
+ const lastScrollOffset =
76
+ recyclerViewManager.getAbsoluteLastScrollOffset();
77
+ const contentSize = recyclerViewManager.getChildContainerDimensions();
78
+ const windowSize = recyclerViewManager.getWindowSize();
79
+ const isHorizontal = horizontal === true;
80
+
81
+ // Calculate dimensions based on scroll direction
82
+ const visibleLength = isHorizontal ? windowSize.width : windowSize.height;
83
+ const contentLength =
84
+ (isHorizontal ? contentSize.width : contentSize.height) +
85
+ recyclerViewManager.firstItemOffset;
86
+
87
+ // Check if we're near the end of the list
88
+ if (onEndReached) {
89
+ const onEndReachedThreshold = onEndReachedThresholdProp ?? 0.5;
90
+ const endThresholdDistance = onEndReachedThreshold * visibleLength;
91
+
92
+ const isNearEnd =
93
+ Math.ceil(lastScrollOffset + visibleLength) >=
94
+ contentLength - endThresholdDistance;
95
+
96
+ if (isNearEnd && !pendingEndReached.current) {
97
+ pendingEndReached.current = true;
98
+ onEndReached();
99
+ }
100
+ pendingEndReached.current = isNearEnd;
101
+ }
102
+
103
+ // Check if we're near the start of the list
104
+ if (onStartReached) {
105
+ const onStartReachedThreshold = onStartReachedThresholdProp ?? 0.2;
106
+ const startThresholdDistance = onStartReachedThreshold * visibleLength;
107
+
108
+ const isNearStart = lastScrollOffset <= startThresholdDistance;
109
+
110
+ if (isNearStart && !pendingStartReached.current) {
111
+ pendingStartReached.current = true;
112
+ onStartReached();
113
+ }
114
+ pendingStartReached.current = isNearStart;
115
+ }
116
+
117
+ // Handle auto-scrolling to bottom for vertical lists
118
+ if (!isHorizontal && autoscrollToBottomThreshold >= 0) {
119
+ const autoscrollToBottomThresholdDistance =
120
+ autoscrollToBottomThreshold * visibleLength;
121
+
122
+ const isNearBottom =
123
+ Math.ceil(lastScrollOffset + visibleLength) >=
124
+ contentLength - autoscrollToBottomThresholdDistance;
125
+
126
+ if (isNearBottom) {
127
+ pendingAutoscrollToBottom.current = true;
128
+ } else {
129
+ pendingAutoscrollToBottom.current = false;
130
+ }
131
+ }
132
+ }
133
+ }, [recyclerViewManager]);
134
+
135
+ const runAutoScrollToBottomCheck = useCallback(() => {
136
+ if (pendingAutoscrollToBottom.current) {
137
+ pendingAutoscrollToBottom.current = false;
138
+ requestAnimationFrame(() => {
139
+ const shouldAnimate =
140
+ recyclerViewManager.props.maintainVisibleContentPosition
141
+ ?.animateAutoScrollToBottom ?? true;
142
+ scrollViewRef.current?.scrollToEnd({
143
+ animated: shouldAnimate,
144
+ });
145
+ });
146
+ }
147
+ }, [requestAnimationFrame, scrollViewRef, recyclerViewManager]);
148
+
149
+ // Reset end reached state when data changes
150
+ useMemo(() => {
151
+ pendingEndReached.current = false;
152
+ // needs to run only when data changes
153
+ // eslint-disable-next-line react-hooks/exhaustive-deps
154
+ }, [data]);
155
+
156
+ // Auto-scroll to bottom when new content is added and we're near the bottom
157
+ useEffect(() => {
158
+ runAutoScrollToBottomCheck();
159
+ }, [data, runAutoScrollToBottomCheck, windowHeight, windowWidth]);
160
+
161
+ // Since content changes frequently, we try and avoid doing the auto scroll during active scrolls
162
+ useEffect(() => {
163
+ if (Date.now() - lastCheckBoundsTime.current >= 100) {
164
+ runAutoScrollToBottomCheck();
165
+ }
166
+ }, [
167
+ contentHeight,
168
+ contentWidth,
169
+ recyclerViewManager.firstItemOffset,
170
+ runAutoScrollToBottomCheck,
171
+ ]);
172
+
173
+ return {
174
+ checkBounds,
175
+ };
176
+ }
@@ -0,0 +1,55 @@
1
+ import { useState, useCallback } from "react";
2
+
3
+ import { useRecyclerViewContext } from "../RecyclerViewContextProvider";
4
+
5
+ export type LayoutStateSetter<T> = (
6
+ newValue: T | ((prevValue: T) => T),
7
+ skipParentLayout?: boolean
8
+ ) => void;
9
+
10
+ export type LayoutStateInitialValue<T> = T | (() => T);
11
+
12
+ /**
13
+ * Custom hook that combines state management with RecyclerView layout updates.
14
+ * This hook provides a way to manage state that affects the layout of the RecyclerView,
15
+ * ensuring that any state changes trigger a layout recalculation.
16
+ *
17
+ * @param initialState - The initial state value or a function that returns the initial state
18
+ * @returns A tuple containing:
19
+ * - The current state value
20
+ * - A setter function that updates the state and triggers a layout recalculation
21
+ */
22
+ export function useLayoutState<T>(
23
+ initialState: LayoutStateInitialValue<T>
24
+ ): [T, LayoutStateSetter<T>] {
25
+ // Initialize state with the provided initial value
26
+ const [state, setState] = useState<T>(initialState);
27
+ // Get the RecyclerView context for layout management
28
+ const recyclerViewContext = useRecyclerViewContext();
29
+
30
+ /**
31
+ * Setter function that updates the state and triggers a layout recalculation.
32
+ * This ensures that any state changes that affect the layout are properly reflected
33
+ * in the RecyclerView's visual representation.
34
+ *
35
+ * @param newValue - Either a new state value or a function that receives the previous state
36
+ * and returns the new state
37
+ */
38
+ const setLayoutState: LayoutStateSetter<T> = useCallback(
39
+ (newValue, skipParentLayout) => {
40
+ // Update the state using either the new value or the result of the updater function
41
+ setState((prevValue) =>
42
+ typeof newValue === "function"
43
+ ? (newValue as (prevValue: T) => T)(prevValue)
44
+ : newValue
45
+ );
46
+ if (!skipParentLayout) {
47
+ // Trigger a layout recalculation in the RecyclerView
48
+ recyclerViewContext?.layout();
49
+ }
50
+ },
51
+ [recyclerViewContext]
52
+ );
53
+
54
+ return [state, setLayoutState];
55
+ }
@@ -0,0 +1,20 @@
1
+ import { useCallback } from "react";
2
+
3
+ import { useRecyclerViewContext } from "../RecyclerViewContextProvider";
4
+
5
+ /**
6
+ * Returns a function that can help create a mapping key for the items.
7
+ * Useful when doing .map on items to create a list of components.
8
+ * Using this ensures that performance is optimal for FlashList
9
+ */
10
+ export const useMappingHelper = () => {
11
+ const recyclerViewContext = useRecyclerViewContext();
12
+ const getMappingKey = useCallback(
13
+ (itemKey: string | number | bigint, index: number) => {
14
+ return recyclerViewContext ? index : itemKey;
15
+ },
16
+ [recyclerViewContext]
17
+ );
18
+
19
+ return { getMappingKey };
20
+ };