@react-native-ohos/flash-list 1.8.3 → 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 (455) 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/benchmark/useBlankAreaTracker.d.ts +0 -57
  309. package/dist/benchmark/useBlankAreaTracker.d.ts.map +0 -1
  310. package/dist/benchmark/useBlankAreaTracker.js +0 -90
  311. package/dist/benchmark/useBlankAreaTracker.js.map +0 -1
  312. package/dist/errors/CustomError.d.ts +0 -31
  313. package/dist/errors/CustomError.d.ts.map +0 -1
  314. package/dist/errors/CustomError.js +0 -37
  315. package/dist/errors/CustomError.js.map +0 -1
  316. package/dist/errors/ExceptionList.d.ts +0 -47
  317. package/dist/errors/ExceptionList.d.ts.map +0 -1
  318. package/dist/errors/ExceptionList.js +0 -49
  319. package/dist/errors/ExceptionList.js.map +0 -1
  320. package/dist/errors/Warnings.d.ts +0 -32
  321. package/dist/errors/Warnings.d.ts.map +0 -1
  322. package/dist/errors/Warnings.js +0 -36
  323. package/dist/errors/Warnings.js.map +0 -1
  324. package/dist/fabric/AutoLayoutNativeComponent.d.ts +0 -42
  325. package/dist/fabric/AutoLayoutNativeComponent.d.ts.map +0 -1
  326. package/dist/fabric/AutoLayoutNativeComponent.js +0 -29
  327. package/dist/fabric/AutoLayoutNativeComponent.js.map +0 -1
  328. package/dist/fabric/CellContainerNativeComponent.d.ts +0 -31
  329. package/dist/fabric/CellContainerNativeComponent.d.ts.map +0 -1
  330. package/dist/fabric/CellContainerNativeComponent.js +0 -29
  331. package/dist/fabric/CellContainerNativeComponent.js.map +0 -1
  332. package/dist/native/auto-layout/AutoLayoutView.d.ts +0 -45
  333. package/dist/native/auto-layout/AutoLayoutView.d.ts.map +0 -1
  334. package/dist/native/auto-layout/AutoLayoutView.js +0 -71
  335. package/dist/native/auto-layout/AutoLayoutView.js.map +0 -1
  336. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts +0 -27
  337. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts.map +0 -1
  338. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js +0 -29
  339. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js.map +0 -1
  340. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts +0 -28
  341. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts.map +0 -1
  342. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts +0 -27
  343. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.d.ts.map +0 -1
  344. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js +0 -29
  345. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.harmony.js.map +0 -1
  346. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts +0 -27
  347. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts.map +0 -1
  348. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js +0 -29
  349. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js.map +0 -1
  350. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js +0 -29
  351. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js.map +0 -1
  352. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts +0 -39
  353. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts.map +0 -1
  354. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js +0 -26
  355. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js.map +0 -1
  356. package/dist/native/cell-container/CellContainer.android.d.ts +0 -29
  357. package/dist/native/cell-container/CellContainer.android.d.ts.map +0 -1
  358. package/dist/native/cell-container/CellContainer.android.js +0 -32
  359. package/dist/native/cell-container/CellContainer.android.js.map +0 -1
  360. package/dist/native/cell-container/CellContainer.d.ts +0 -31
  361. package/dist/native/cell-container/CellContainer.d.ts.map +0 -1
  362. package/dist/native/cell-container/CellContainer.harmony.d.ts +0 -29
  363. package/dist/native/cell-container/CellContainer.harmony.d.ts.map +0 -1
  364. package/dist/native/cell-container/CellContainer.harmony.js +0 -32
  365. package/dist/native/cell-container/CellContainer.harmony.js.map +0 -1
  366. package/dist/native/cell-container/CellContainer.ios.d.ts +0 -29
  367. package/dist/native/cell-container/CellContainer.ios.d.ts.map +0 -1
  368. package/dist/native/cell-container/CellContainer.ios.js +0 -32
  369. package/dist/native/cell-container/CellContainer.ios.js.map +0 -1
  370. package/dist/native/cell-container/CellContainer.js +0 -34
  371. package/dist/native/cell-container/CellContainer.js.map +0 -1
  372. package/dist/native/cell-container/CellContainer.web.d.ts +0 -30
  373. package/dist/native/cell-container/CellContainer.web.d.ts.map +0 -1
  374. package/dist/native/cell-container/CellContainer.web.js +0 -36
  375. package/dist/native/cell-container/CellContainer.web.js.map +0 -1
  376. package/dist/utils/ContentContainerUtils.d.ts +0 -50
  377. package/dist/utils/ContentContainerUtils.d.ts.map +0 -1
  378. package/dist/utils/ContentContainerUtils.js +0 -71
  379. package/dist/utils/ContentContainerUtils.js.map +0 -1
  380. package/dist/viewability/ViewToken.d.ts +0 -31
  381. package/dist/viewability/ViewToken.d.ts.map +0 -1
  382. package/dist/viewability/ViewToken.js +0 -26
  383. package/dist/viewability/ViewToken.js.map +0 -1
  384. package/dist/viewability/ViewabilityHelper.d.ts +0 -49
  385. package/dist/viewability/ViewabilityHelper.d.ts.map +0 -1
  386. package/dist/viewability/ViewabilityHelper.js +0 -130
  387. package/dist/viewability/ViewabilityHelper.js.map +0 -1
  388. package/dist/viewability/ViewabilityManager.d.ts +0 -48
  389. package/dist/viewability/ViewabilityManager.d.ts.map +0 -1
  390. package/dist/viewability/ViewabilityManager.js +0 -131
  391. package/dist/viewability/ViewabilityManager.js.map +0 -1
  392. package/harmony/flash_list/BuildProfile.ets +0 -17
  393. package/harmony/flash_list/LICENSE +0 -7
  394. package/harmony/flash_list/build-profile.json5 +0 -8
  395. package/harmony/flash_list/hvigorfile.ts +0 -1
  396. package/harmony/flash_list/index.ets +0 -27
  397. package/harmony/flash_list/obfuscation-rules.txt +0 -18
  398. package/harmony/flash_list/oh-package.json5 +0 -24
  399. package/harmony/flash_list/src/main/cpp/AutoLayoutNode.cpp +0 -63
  400. package/harmony/flash_list/src/main/cpp/AutoLayoutNode.h +0 -54
  401. package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.cpp +0 -140
  402. package/harmony/flash_list/src/main/cpp/AutoLayoutShadow.h +0 -66
  403. package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.cpp +0 -208
  404. package/harmony/flash_list/src/main/cpp/AutoLayoutViewComponentInstance.h +0 -78
  405. package/harmony/flash_list/src/main/cpp/AutoLayoutViewEventEmitRequestHandler.h +0 -53
  406. package/harmony/flash_list/src/main/cpp/AutoLayoutViewJSIBinder.h +0 -50
  407. package/harmony/flash_list/src/main/cpp/CMakeLists.txt +0 -12
  408. package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.cpp +0 -80
  409. package/harmony/flash_list/src/main/cpp/CellContainerComponentInstance.h +0 -64
  410. package/harmony/flash_list/src/main/cpp/CellContainerJSIBinder.h +0 -39
  411. package/harmony/flash_list/src/main/cpp/ComponentDescriptors.h +0 -40
  412. package/harmony/flash_list/src/main/cpp/EventEmitters.cpp +0 -40
  413. package/harmony/flash_list/src/main/cpp/EventEmitters.h +0 -48
  414. package/harmony/flash_list/src/main/cpp/FlashListPackage.h +0 -85
  415. package/harmony/flash_list/src/main/cpp/FlashListStackNode.cpp +0 -87
  416. package/harmony/flash_list/src/main/cpp/FlashListStackNode.h +0 -57
  417. package/harmony/flash_list/src/main/cpp/Props.cpp +0 -52
  418. package/harmony/flash_list/src/main/cpp/Props.h +0 -64
  419. package/harmony/flash_list/src/main/cpp/ShadowNodes.cpp +0 -34
  420. package/harmony/flash_list/src/main/cpp/ShadowNodes.h +0 -48
  421. package/harmony/flash_list/src/main/ets/Logger.ets +0 -64
  422. package/harmony/flash_list/src/main/ets/RNAutoLayoutShadow.ets +0 -154
  423. package/harmony/flash_list/src/main/ets/RNAutoLayoutView.ets +0 -277
  424. package/harmony/flash_list/src/main/ets/RNCellContainer.ets +0 -113
  425. package/harmony/flash_list/src/main/module.json5 +0 -9
  426. package/harmony/flash_list/src/main/resources/base/element/color.json +0 -8
  427. package/harmony/flash_list/src/main/resources/base/element/string.json +0 -16
  428. package/harmony/flash_list/src/main/resources/base/media/icon.png +0 -0
  429. package/harmony/flash_list/src/main/resources/base/profile/main_pages.json +0 -5
  430. package/harmony/flash_list/src/main/resources/en_US/element/string.json +0 -16
  431. package/harmony/flash_list/src/main/resources/zh_CN/element/string.json +0 -16
  432. package/harmony/flash_list.har +0 -0
  433. package/src/FlashList.tsx +0 -949
  434. package/src/GridLayoutProviderWithProps.ts +0 -204
  435. package/src/MasonryFlashList.tsx +0 -499
  436. package/src/PureComponentWrapper.tsx +0 -65
  437. package/src/benchmark/useBlankAreaTracker.ts +0 -141
  438. package/src/errors/CustomError.ts +0 -34
  439. package/src/errors/ExceptionList.ts +0 -52
  440. package/src/errors/Warnings.ts +0 -39
  441. package/src/fabric/AutoLayoutNativeComponent.ts +0 -52
  442. package/src/fabric/CellContainerNativeComponent.ts +0 -35
  443. package/src/native/auto-layout/AutoLayoutView.tsx +0 -97
  444. package/src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts +0 -31
  445. package/src/native/auto-layout/AutoLayoutViewNativeComponent.harmony.ts +0 -31
  446. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts +0 -31
  447. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ts +0 -31
  448. package/src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts +0 -41
  449. package/src/native/cell-container/CellContainer.android.ts +0 -31
  450. package/src/native/cell-container/CellContainer.harmony.ts +0 -31
  451. package/src/native/cell-container/CellContainer.ios.ts +0 -31
  452. package/src/native/cell-container/CellContainer.tsx +0 -38
  453. package/src/native/cell-container/CellContainer.web.tsx +0 -33
  454. package/src/utils/ContentContainerUtils.ts +0 -116
  455. package/src/viewability/ViewToken.ts +0 -31
@@ -0,0 +1,616 @@
1
+ /**
2
+ * RecyclerView is a high-performance list component that efficiently renders and recycles list items.
3
+ * It's designed to handle large lists with optimal memory usage and smooth scrolling.
4
+ */
5
+ import React, {
6
+ RefObject,
7
+ useCallback,
8
+ useLayoutEffect,
9
+ useMemo,
10
+ useRef,
11
+ forwardRef,
12
+ useState,
13
+ useId,
14
+ } from "react";
15
+ import {
16
+ Animated,
17
+ I18nManager,
18
+ NativeScrollEvent,
19
+ NativeSyntheticEvent,
20
+ } from "react-native";
21
+
22
+ import { FlashListRef } from "../FlashListRef";
23
+ import { ErrorMessages } from "../errors/ErrorMessages";
24
+ import { WarningMessages } from "../errors/WarningMessages";
25
+
26
+ import { RVDimension } from "./layout-managers/LayoutManager";
27
+ import {
28
+ areDimensionsNotEqual,
29
+ measureFirstChildLayout,
30
+ measureItemLayout,
31
+ measureParentSize,
32
+ } from "./utils/measureLayout";
33
+ import {
34
+ RecyclerViewContext,
35
+ RecyclerViewContextProvider,
36
+ useRecyclerViewContext,
37
+ } from "./RecyclerViewContextProvider";
38
+ import { useLayoutState } from "./hooks/useLayoutState";
39
+ import { useRecyclerViewManager } from "./hooks/useRecyclerViewManager";
40
+ import { RecyclerViewProps } from "./RecyclerViewProps";
41
+ import { useOnListLoad } from "./hooks/useOnLoad";
42
+ import {
43
+ ViewHolderCollection,
44
+ ViewHolderCollectionRef,
45
+ } from "./ViewHolderCollection";
46
+ import { CompatView } from "./components/CompatView";
47
+ import { CompatScroller } from "./components/CompatScroller";
48
+ import { useBoundDetection } from "./hooks/useBoundDetection";
49
+ import { adjustOffsetForRTL } from "./utils/adjustOffsetForRTL";
50
+ import { useSecondaryProps } from "./hooks/useSecondaryProps";
51
+ import { StickyHeaders, StickyHeaderRef } from "./components/StickyHeaders";
52
+ import { ScrollAnchor, ScrollAnchorRef } from "./components/ScrollAnchor";
53
+ import { useRecyclerViewController } from "./hooks/useRecyclerViewController";
54
+ import { RenderTimeTracker } from "./helpers/RenderTimeTracker";
55
+
56
+ /**
57
+ * Main RecyclerView component that handles list rendering, scrolling, and item recycling.
58
+ * @template T - The type of items in the list
59
+ */
60
+ const RecyclerViewComponent = <T,>(
61
+ props: RecyclerViewProps<T>,
62
+ ref: React.Ref<FlashListRef<T>>
63
+ ) => {
64
+ // Destructure props and initialize refs
65
+ const {
66
+ horizontal,
67
+ renderItem,
68
+ data,
69
+ extraData,
70
+ onLoad,
71
+ CellRendererComponent,
72
+ overrideProps,
73
+ refreshing,
74
+ onRefresh,
75
+ progressViewOffset,
76
+ ListEmptyComponent,
77
+ ListHeaderComponent,
78
+ ListHeaderComponentStyle,
79
+ ListFooterComponent,
80
+ ListFooterComponentStyle,
81
+ ItemSeparatorComponent,
82
+ renderScrollComponent,
83
+ style,
84
+ stickyHeaderIndices,
85
+ maintainVisibleContentPosition,
86
+ onCommitLayoutEffect,
87
+ ...rest
88
+ } = props;
89
+
90
+ const [renderTimeTracker] = useState(() => new RenderTimeTracker());
91
+
92
+ renderTimeTracker.startTracking();
93
+
94
+ // Core refs for managing scroll view, internal view, and child container
95
+ const scrollViewRef = useRef<CompatScroller>(null);
96
+ const internalViewRef = useRef<CompatView>(null);
97
+ const firstChildViewRef = useRef<CompatView>(null);
98
+ const containerViewSizeRef = useRef<RVDimension | undefined>(undefined);
99
+ const pendingChildIds = useRef<Set<string>>(new Set()).current;
100
+
101
+ // Track scroll position
102
+ const scrollY = useRef(new Animated.Value(0)).current;
103
+
104
+ // Refs for sticky headers and scroll anchoring
105
+ const stickyHeaderRef = useRef<StickyHeaderRef>(null);
106
+ const scrollAnchorRef = useRef<ScrollAnchorRef>(null);
107
+
108
+ // State for managing layout and render updates
109
+ const [_, setLayoutTreeId] = useLayoutState(0);
110
+ const [__, setRenderId] = useState(0);
111
+
112
+ // Map to store refs for each item in the list
113
+ const refHolder = useMemo(
114
+ () => new Map<number, RefObject<CompatView | null>>(),
115
+ []
116
+ );
117
+
118
+ // Initialize core RecyclerView manager and content offset management
119
+ const { recyclerViewManager, velocityTracker } =
120
+ useRecyclerViewManager(props);
121
+ const {
122
+ applyOffsetCorrection,
123
+ computeFirstVisibleIndexForOffsetCorrection,
124
+ applyInitialScrollIndex,
125
+ handlerMethods,
126
+ } = useRecyclerViewController(
127
+ recyclerViewManager,
128
+ ref,
129
+ scrollViewRef,
130
+ scrollAnchorRef
131
+ );
132
+
133
+ // Initialize view holder collection ref
134
+ const viewHolderCollectionRef = useRef<ViewHolderCollectionRef>(null);
135
+
136
+ // Hook to handle list loading
137
+ useOnListLoad(recyclerViewManager, onLoad);
138
+
139
+ // Hook to detect when scrolling reaches list bounds
140
+ const { checkBounds } = useBoundDetection(recyclerViewManager, scrollViewRef);
141
+
142
+ const isHorizontalRTL = I18nManager.isRTL && horizontal;
143
+
144
+ /**
145
+ * Initialize the RecyclerView by measuring and setting up the window size
146
+ * This effect runs when the component mounts or when layout changes
147
+ */
148
+ useLayoutEffect(() => {
149
+ if (internalViewRef.current && firstChildViewRef.current) {
150
+ // Measure the outer and inner container layouts
151
+ const outerViewLayout = measureParentSize(internalViewRef.current);
152
+ const firstChildViewLayout = measureFirstChildLayout(
153
+ firstChildViewRef.current,
154
+ internalViewRef.current
155
+ );
156
+
157
+ containerViewSizeRef.current = outerViewLayout;
158
+
159
+ // Calculate offset of first item
160
+ const firstItemOffset = horizontal
161
+ ? firstChildViewLayout.x - outerViewLayout.x
162
+ : firstChildViewLayout.y - outerViewLayout.y;
163
+
164
+ // Update the RecyclerView manager with window dimensions
165
+ recyclerViewManager.updateLayoutParams(
166
+ {
167
+ width: horizontal
168
+ ? outerViewLayout.width
169
+ : firstChildViewLayout.width,
170
+ height: horizontal
171
+ ? firstChildViewLayout.height
172
+ : outerViewLayout.height,
173
+ },
174
+ isHorizontalRTL && recyclerViewManager.hasLayout()
175
+ ? firstItemOffset -
176
+ recyclerViewManager.getChildContainerDimensions().width
177
+ : firstItemOffset
178
+ );
179
+ }
180
+ });
181
+
182
+ /**
183
+ * Effect to handle layout updates for list items
184
+ * This ensures proper positioning and recycling of items
185
+ */
186
+ // eslint-disable-next-line react-hooks/exhaustive-deps
187
+ useLayoutEffect(() => {
188
+ if (pendingChildIds.size > 0) {
189
+ return;
190
+ }
191
+ const layoutInfo = Array.from(refHolder, ([index, viewHolderRef]) => {
192
+ const layout = measureItemLayout(
193
+ viewHolderRef.current!,
194
+ recyclerViewManager.tryGetLayout(index)
195
+ );
196
+
197
+ // comapre height with stored layout
198
+ // const storedLayout = recyclerViewManager.getLayout(index);
199
+ // if (
200
+ // storedLayout.height !== layout.height &&
201
+ // storedLayout.isHeightMeasured
202
+ // ) {
203
+ // console.log(
204
+ // "height changed",
205
+ // index,
206
+ // layout.height,
207
+ // storedLayout.height
208
+ // );
209
+ // }
210
+ return { index, dimensions: layout };
211
+ });
212
+
213
+ const hasExceededMaxRendersWithoutCommit =
214
+ renderTimeTracker.hasExceededMaxRendersWithoutCommit();
215
+
216
+ if (hasExceededMaxRendersWithoutCommit) {
217
+ console.warn(WarningMessages.exceededMaxRendersWithoutCommit);
218
+ }
219
+
220
+ if (
221
+ recyclerViewManager.modifyChildrenLayout(layoutInfo, data?.length ?? 0) &&
222
+ !hasExceededMaxRendersWithoutCommit
223
+ ) {
224
+ // Trigger re-render if layout modifications were made
225
+ setRenderId((prev) => prev + 1);
226
+ } else {
227
+ viewHolderCollectionRef.current?.commitLayout();
228
+ applyOffsetCorrection();
229
+ }
230
+
231
+ if (
232
+ horizontal &&
233
+ recyclerViewManager.hasLayout() &&
234
+ recyclerViewManager.getWindowSize().height > 0
235
+ ) {
236
+ // We want the parent FlashList to continue rendering the next batch of items as soon as height is available.
237
+ // Waiting for each horizontal list to finish might cause too many setState calls.
238
+ // This will help avoid "Maximum update depth exceeded" error.
239
+ parentRecyclerViewContext?.unmarkChildLayoutAsPending(recyclerViewId);
240
+ }
241
+ });
242
+
243
+ /**
244
+ * Scroll event handler that manages scroll position, velocity, and RTL support
245
+ */
246
+ const onScrollHandler = useCallback(
247
+ (event: NativeSyntheticEvent<NativeScrollEvent>) => {
248
+ if (recyclerViewManager.ignoreScrollEvents) {
249
+ return;
250
+ }
251
+
252
+ let scrollOffset = horizontal
253
+ ? event.nativeEvent.contentOffset.x
254
+ : event.nativeEvent.contentOffset.y;
255
+
256
+ // Handle RTL (Right-to-Left) layout adjustments
257
+ if (isHorizontalRTL) {
258
+ scrollOffset = adjustOffsetForRTL(
259
+ scrollOffset,
260
+ event.nativeEvent.contentSize.width,
261
+ event.nativeEvent.layoutMeasurement.width
262
+ );
263
+ }
264
+
265
+ velocityTracker.computeVelocity(
266
+ scrollOffset,
267
+ recyclerViewManager.getAbsoluteLastScrollOffset(),
268
+ Boolean(horizontal),
269
+ (velocity, isMomentumEnd) => {
270
+ if (recyclerViewManager.ignoreScrollEvents) {
271
+ return;
272
+ }
273
+
274
+ if (isMomentumEnd) {
275
+ computeFirstVisibleIndexForOffsetCorrection();
276
+ if (!recyclerViewManager.isOffsetProjectionEnabled) {
277
+ return;
278
+ }
279
+ recyclerViewManager.resetVelocityCompute();
280
+ }
281
+ // Update scroll position and trigger re-render if needed
282
+ if (recyclerViewManager.updateScrollOffset(scrollOffset, velocity)) {
283
+ setRenderId((prev) => prev + 1);
284
+ }
285
+ }
286
+ );
287
+
288
+ // Update sticky headers and check bounds
289
+ stickyHeaderRef.current?.reportScrollEvent(event.nativeEvent);
290
+ checkBounds();
291
+
292
+ // Record interaction and compute item visibility
293
+ recyclerViewManager.recordInteraction();
294
+ recyclerViewManager.computeItemViewability();
295
+
296
+ // Call user-provided onScroll handler
297
+ recyclerViewManager.props.onScroll?.(event);
298
+ },
299
+ [
300
+ checkBounds,
301
+ computeFirstVisibleIndexForOffsetCorrection,
302
+ horizontal,
303
+ isHorizontalRTL,
304
+ recyclerViewManager,
305
+ velocityTracker,
306
+ ]
307
+ );
308
+
309
+ const parentRecyclerViewContext = useRecyclerViewContext();
310
+ const recyclerViewId = useId();
311
+
312
+ // Create context for child components
313
+ const recyclerViewContext: RecyclerViewContext<T> = useMemo(() => {
314
+ return {
315
+ layout: () => {
316
+ setLayoutTreeId((prev) => prev + 1);
317
+ },
318
+ getRef: () => {
319
+ if (recyclerViewManager.isDisposed) {
320
+ return null;
321
+ }
322
+ return handlerMethods;
323
+ },
324
+ getParentRef: () => {
325
+ return parentRecyclerViewContext?.getRef() ?? null;
326
+ },
327
+ getParentScrollViewRef: () => {
328
+ return parentRecyclerViewContext?.getScrollViewRef() ?? null;
329
+ },
330
+ getScrollViewRef: () => {
331
+ return scrollViewRef.current;
332
+ },
333
+ markChildLayoutAsPending: (id: string) => {
334
+ pendingChildIds.add(id);
335
+ },
336
+ unmarkChildLayoutAsPending: (id: string) => {
337
+ if (pendingChildIds.has(id)) {
338
+ pendingChildIds.delete(id);
339
+ recyclerViewContext.layout();
340
+ }
341
+ },
342
+ };
343
+ }, [
344
+ handlerMethods,
345
+ parentRecyclerViewContext,
346
+ pendingChildIds,
347
+ recyclerViewManager.isDisposed,
348
+ setLayoutTreeId,
349
+ ]);
350
+
351
+ /**
352
+ * Validates that item dimensions match the expected layout
353
+ */
354
+ const validateItemSize = useCallback(
355
+ (index: number, size: RVDimension) => {
356
+ const layout = recyclerViewManager.getLayout(index);
357
+ const width = Math.max(
358
+ Math.min(layout.width, layout.maxWidth ?? Infinity),
359
+ layout.minWidth ?? 0
360
+ );
361
+ const height = Math.max(
362
+ Math.min(layout.height, layout.maxHeight ?? Infinity),
363
+ layout.minHeight ?? 0
364
+ );
365
+ if (
366
+ areDimensionsNotEqual(width, size.width) ||
367
+ areDimensionsNotEqual(height, size.height)
368
+ ) {
369
+ // console.log(
370
+ // "invalid size",
371
+ // index,
372
+ // width,
373
+ // size.width,
374
+ // height,
375
+ // size.height
376
+ // );
377
+ // TODO: Add a warning for missing useLayoutState
378
+ recyclerViewContext.layout();
379
+ }
380
+ },
381
+ [recyclerViewContext, recyclerViewManager]
382
+ );
383
+
384
+ // Get secondary props and components
385
+ const {
386
+ refreshControl,
387
+ renderHeader,
388
+ renderFooter,
389
+ renderEmpty,
390
+ CompatScrollView,
391
+ } = useSecondaryProps(props);
392
+
393
+ if (
394
+ !recyclerViewManager.getIsFirstLayoutComplete() &&
395
+ recyclerViewManager.getDataLength() > 0
396
+ ) {
397
+ parentRecyclerViewContext?.markChildLayoutAsPending(recyclerViewId);
398
+ }
399
+
400
+ // Render sticky headers if configured
401
+ const stickyHeaders = useMemo(() => {
402
+ if (
403
+ data &&
404
+ data.length > 0 &&
405
+ stickyHeaderIndices &&
406
+ stickyHeaderIndices.length > 0
407
+ ) {
408
+ if (horizontal) {
409
+ throw new Error(ErrorMessages.stickyHeadersNotSupportedForHorizontal);
410
+ }
411
+ return (
412
+ <StickyHeaders
413
+ stickyHeaderIndices={stickyHeaderIndices}
414
+ data={data}
415
+ renderItem={renderItem}
416
+ scrollY={scrollY}
417
+ stickyHeaderRef={stickyHeaderRef}
418
+ recyclerViewManager={recyclerViewManager}
419
+ extraData={extraData}
420
+ />
421
+ );
422
+ }
423
+ return null;
424
+ }, [
425
+ data,
426
+ stickyHeaderIndices,
427
+ renderItem,
428
+ scrollY,
429
+ horizontal,
430
+ recyclerViewManager,
431
+ extraData,
432
+ ]);
433
+
434
+ // Set up scroll event handling with animation support for sticky headers
435
+ const animatedEvent = useMemo(() => {
436
+ if (stickyHeaders) {
437
+ return Animated.event(
438
+ [{ nativeEvent: { contentOffset: { y: scrollY } } }],
439
+ { useNativeDriver: true, listener: onScrollHandler }
440
+ );
441
+ }
442
+ return onScrollHandler;
443
+ }, [onScrollHandler, scrollY, stickyHeaders]);
444
+
445
+ const shouldMaintainVisibleContentPosition =
446
+ recyclerViewManager.shouldMaintainVisibleContentPosition();
447
+
448
+ const maintainVisibleContentPositionInternal = useMemo(() => {
449
+ if (shouldMaintainVisibleContentPosition) {
450
+ return {
451
+ ...maintainVisibleContentPosition,
452
+ minIndexForVisible: 0,
453
+ };
454
+ }
455
+ return undefined;
456
+ }, [maintainVisibleContentPosition, shouldMaintainVisibleContentPosition]);
457
+
458
+ const shouldRenderFromBottom =
459
+ recyclerViewManager.getDataLength() > 0 &&
460
+ (maintainVisibleContentPosition?.startRenderingFromBottom ?? false);
461
+
462
+ // Create view for measuring bounded size
463
+ const viewToMeasureBoundedSize = useMemo(() => {
464
+ return (
465
+ <CompatView
466
+ style={{
467
+ height: horizontal ? undefined : 0,
468
+ width: horizontal ? 0 : undefined,
469
+ }}
470
+ ref={firstChildViewRef}
471
+ />
472
+ );
473
+ }, [horizontal]);
474
+
475
+ const scrollAnchor = useMemo(() => {
476
+ if (shouldMaintainVisibleContentPosition) {
477
+ return (
478
+ <ScrollAnchor
479
+ horizontal={Boolean(horizontal)}
480
+ scrollAnchorRef={scrollAnchorRef}
481
+ />
482
+ );
483
+ }
484
+ return null;
485
+ }, [horizontal, shouldMaintainVisibleContentPosition]);
486
+
487
+ // console.log("render", recyclerViewManager.getRenderStack());
488
+
489
+ // Render the main RecyclerView structure
490
+ return (
491
+ <RecyclerViewContextProvider value={recyclerViewContext}>
492
+ <CompatView
493
+ style={[
494
+ {
495
+ flex: horizontal ? undefined : 1,
496
+ overflow: "hidden",
497
+ },
498
+ style,
499
+ ]}
500
+ ref={internalViewRef}
501
+ collapsable={false}
502
+ onLayout={(event) => {
503
+ if (
504
+ areDimensionsNotEqual(
505
+ event.nativeEvent.layout.width,
506
+ containerViewSizeRef.current?.width ?? 0
507
+ ) ||
508
+ areDimensionsNotEqual(
509
+ event.nativeEvent.layout.height,
510
+ containerViewSizeRef.current?.height ?? 0
511
+ )
512
+ ) {
513
+ // console.log(
514
+ // "onLayout",
515
+
516
+ // recyclerViewManager.getWindowSize(),
517
+ // event.nativeEvent.layout
518
+ // );
519
+ recyclerViewContext.layout();
520
+ }
521
+ }}
522
+ >
523
+ <CompatScrollView
524
+ {...rest}
525
+ horizontal={horizontal}
526
+ ref={scrollViewRef}
527
+ onScroll={animatedEvent}
528
+ maintainVisibleContentPosition={
529
+ maintainVisibleContentPositionInternal
530
+ }
531
+ refreshControl={refreshControl}
532
+ {...overrideProps}
533
+ >
534
+ {/* Scroll anchor for maintaining content position */}
535
+ {scrollAnchor}
536
+ {isHorizontalRTL && viewToMeasureBoundedSize}
537
+ {renderHeader}
538
+ {!isHorizontalRTL && viewToMeasureBoundedSize}
539
+ {/* Main list content */}
540
+ <ViewHolderCollection
541
+ viewHolderCollectionRef={viewHolderCollectionRef}
542
+ data={data}
543
+ horizontal={horizontal}
544
+ renderStack={recyclerViewManager.getRenderStack()}
545
+ getLayout={(index) => recyclerViewManager.getLayout(index)}
546
+ getAdjustmentMargin={() => {
547
+ if (!shouldRenderFromBottom || !recyclerViewManager.hasLayout()) {
548
+ return 0;
549
+ }
550
+
551
+ const windowSize = horizontal
552
+ ? recyclerViewManager.getWindowSize().width
553
+ : recyclerViewManager.getWindowSize().height;
554
+ const childContainerSize = horizontal
555
+ ? recyclerViewManager.getChildContainerDimensions().width
556
+ : recyclerViewManager.getChildContainerDimensions().height;
557
+
558
+ return Math.max(
559
+ 0,
560
+ windowSize -
561
+ childContainerSize -
562
+ recyclerViewManager.firstItemOffset
563
+ );
564
+ }}
565
+ refHolder={refHolder}
566
+ onSizeChanged={validateItemSize}
567
+ renderItem={renderItem}
568
+ extraData={extraData}
569
+ onCommitLayoutEffect={() => {
570
+ applyInitialScrollIndex();
571
+ parentRecyclerViewContext?.unmarkChildLayoutAsPending(
572
+ recyclerViewId
573
+ );
574
+ onCommitLayoutEffect?.();
575
+ }}
576
+ onCommitEffect={() => {
577
+ renderTimeTracker.markRenderComplete();
578
+ recyclerViewManager.updateAverageRenderTime(
579
+ renderTimeTracker.getAverageRenderTime()
580
+ );
581
+ applyInitialScrollIndex();
582
+ checkBounds();
583
+ recyclerViewManager.computeItemViewability();
584
+ recyclerViewManager.animationOptimizationsEnabled = false;
585
+ }}
586
+ CellRendererComponent={CellRendererComponent}
587
+ ItemSeparatorComponent={ItemSeparatorComponent}
588
+ getChildContainerLayout={() =>
589
+ recyclerViewManager.hasLayout()
590
+ ? recyclerViewManager.getChildContainerDimensions()
591
+ : undefined
592
+ }
593
+ />
594
+ {renderEmpty}
595
+ {renderFooter}
596
+ </CompatScrollView>
597
+ {stickyHeaders}
598
+ </CompatView>
599
+ </RecyclerViewContextProvider>
600
+ );
601
+ };
602
+
603
+ // Set displayName for the inner component
604
+ RecyclerViewComponent.displayName = "FlashList";
605
+
606
+ // Type definition for the RecyclerView component
607
+ type RecyclerViewType = <T>(
608
+ props: RecyclerViewProps<T> & { ref?: React.Ref<FlashListRef<T>> }
609
+ ) => React.JSX.Element;
610
+
611
+ // Create and export the memoized, forwarded ref component
612
+ const RecyclerView = React.memo(
613
+ forwardRef(RecyclerViewComponent)
614
+ ) as RecyclerViewType;
615
+
616
+ export { RecyclerView };
@@ -0,0 +1,65 @@
1
+ import { createContext, useContext } from "react";
2
+
3
+ import { FlashListRef } from "../FlashListRef";
4
+
5
+ import { CompatScroller } from "./components/CompatScroller";
6
+
7
+ export interface RecyclerViewContext<T> extends FlashListContext<T> {
8
+ /**
9
+ * Mark the children FlashLists as pending for layout
10
+ * This will force parent FlashList to wait for children to be laid out before
11
+ * rendering the next batch of items.
12
+ * @param id - The id of the child FlashList
13
+ * @returns void
14
+ */
15
+ markChildLayoutAsPending: (id: string) => void;
16
+ /**
17
+ * Unmark the child FlashList as pending for layout
18
+ * This will allow parent FlashList to render the next batch of items.
19
+ * @param id - The id of the child FlashList
20
+ * @returns void
21
+ */
22
+ unmarkChildLayoutAsPending: (id: string) => void;
23
+ }
24
+
25
+ export interface FlashListContext<T> {
26
+ /**
27
+ * Layout the current FlashList
28
+ * @returns void
29
+ */
30
+ layout: () => void;
31
+ /**
32
+ * Get the ref for the current FlashList
33
+ */
34
+ getRef: () => FlashListRef<T> | null;
35
+ /**
36
+ * Get the ref for the parent FlashList if present
37
+ */
38
+ getParentRef: () => FlashListRef<unknown> | null;
39
+ /**
40
+ * Get the scrollView ref for the current FlashList if present
41
+ */
42
+ getScrollViewRef: () => CompatScroller | null;
43
+ /**
44
+ * Get the scrollView ref for the parent FlashList if present
45
+ */
46
+ getParentScrollViewRef: () => CompatScroller | null;
47
+ }
48
+
49
+ const RecyclerViewContextInstance = createContext<
50
+ RecyclerViewContext<unknown> | undefined
51
+ >(undefined);
52
+
53
+ export const RecyclerViewContextProvider = RecyclerViewContextInstance.Provider;
54
+ export function useRecyclerViewContext<T>():
55
+ | RecyclerViewContext<T>
56
+ | undefined {
57
+ return useContext(RecyclerViewContextInstance) as
58
+ | RecyclerViewContext<T>
59
+ | undefined;
60
+ }
61
+ export function useFlashListContext<T>(): FlashListContext<T> | undefined {
62
+ return useContext(RecyclerViewContextInstance) as
63
+ | FlashListContext<T>
64
+ | undefined;
65
+ }