@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,67 @@
1
+ import { useCallback, useMemo, useRef } from "react";
2
+
3
+ import { LayoutStateSetter, useLayoutState } from "./useLayoutState";
4
+
5
+ export type RecyclingStateSetter<T> = LayoutStateSetter<T>;
6
+
7
+ export type RecyclingStateInitialValue<T> = T | (() => T);
8
+
9
+ /**
10
+ * A custom hook that provides state management with automatic reset functionality.
11
+ * Similar to useState, but automatically resets the state when specified dependencies change.
12
+ * This is particularly useful for managing state that needs to be reset when certain props or values change when items are recycled.
13
+ * This also avoids another setState call on recycling and helps with performance.
14
+ *
15
+ * @param initialState - The initial state value or a function that returns the initial state
16
+ * @param deps - Array of dependencies that trigger a state reset when changed
17
+ * @param onReset - Optional callback function that is called when the state is reset
18
+ * @returns A tuple containing:
19
+ * - The current state value
20
+ * - A setState function that works like useState's setState
21
+ */
22
+ export function useRecyclingState<T>(
23
+ initialState: RecyclingStateInitialValue<T>,
24
+ deps: React.DependencyList,
25
+ onReset?: () => void
26
+ ): [T, RecyclingStateSetter<T>] {
27
+ // Store the current state value in a ref to persist between renders
28
+ const valueStore = useRef<T>();
29
+ // Use layoutState to trigger re-renders when state changes
30
+ const [_, setCounter] = useLayoutState(0);
31
+
32
+ // Reset state when dependencies change
33
+ useMemo(() => {
34
+ // Calculate initial value from function or direct value
35
+ const initialValue =
36
+ typeof initialState === "function"
37
+ ? (initialState as () => T)()
38
+ : initialState;
39
+ valueStore.current = initialValue;
40
+ // Call onReset callback if provided
41
+ onReset?.();
42
+ // eslint-disable-next-line react-hooks/exhaustive-deps
43
+ }, deps);
44
+
45
+ /**
46
+ * Proxy setState function that updates the stored value and triggers a re-render.
47
+ * Only triggers a re-render if the new value is different from the current value.
48
+ */
49
+ const setStateProxy: RecyclingStateSetter<T> = useCallback(
50
+ (newValue, skipParentLayout) => {
51
+ // Calculate next state value from function or direct value
52
+ const nextState =
53
+ typeof newValue === "function"
54
+ ? (newValue as (prevValue: T) => T)(valueStore.current!)
55
+ : newValue;
56
+
57
+ // Only update and trigger re-render if value has changed
58
+ if (nextState !== valueStore.current) {
59
+ valueStore.current = nextState;
60
+ setCounter((prev) => prev + 1, skipParentLayout);
61
+ }
62
+ },
63
+ [setCounter]
64
+ );
65
+
66
+ return [valueStore.current!, setStateProxy];
67
+ }
@@ -0,0 +1,124 @@
1
+ import { Animated, RefreshControl } from "react-native";
2
+ import React, { useMemo } from "react";
3
+
4
+ import { RecyclerViewProps } from "../RecyclerViewProps";
5
+ import { getValidComponent } from "../utils/componentUtils";
6
+ import { CompatView } from "../components/CompatView";
7
+ import { CompatAnimatedScroller } from "../components/CompatScroller";
8
+
9
+ /**
10
+ * Hook that manages secondary props and components for the RecyclerView.
11
+ * This hook handles the creation and management of:
12
+ * 1. Pull-to-refresh functionality
13
+ * 2. Header and footer components
14
+ * 3. Empty state component
15
+ * 4. Custom scroll component with animation support
16
+ *
17
+ * @param props - The RecyclerViewProps containing all configuration options
18
+ * @returns An object containing:
19
+ * - refreshControl: The pull-to-refresh control component
20
+ * - renderHeader: The header component renderer
21
+ * - renderFooter: The footer component renderer
22
+ * - renderEmpty: The empty state component renderer
23
+ * - CompatScrollView: The animated scroll component
24
+ */
25
+ export function useSecondaryProps<T>(props: RecyclerViewProps<T>) {
26
+ const {
27
+ ListHeaderComponent,
28
+ ListHeaderComponentStyle,
29
+ ListFooterComponent,
30
+ ListFooterComponentStyle,
31
+ ListEmptyComponent,
32
+ renderScrollComponent,
33
+ refreshing,
34
+ progressViewOffset,
35
+ onRefresh,
36
+ data,
37
+ refreshControl: customRefreshControl,
38
+ } = props;
39
+
40
+ /**
41
+ * Creates the refresh control component if onRefresh is provided.
42
+ */
43
+ const refreshControl = useMemo(() => {
44
+ if (customRefreshControl) {
45
+ return customRefreshControl;
46
+ } else if (onRefresh) {
47
+ return (
48
+ <RefreshControl
49
+ refreshing={Boolean(refreshing)}
50
+ progressViewOffset={progressViewOffset}
51
+ onRefresh={onRefresh}
52
+ />
53
+ );
54
+ }
55
+ return undefined;
56
+ }, [onRefresh, refreshing, progressViewOffset, customRefreshControl]);
57
+
58
+ /**
59
+ * Creates the header component with optional styling.
60
+ */
61
+ const renderHeader = useMemo(() => {
62
+ if (!ListHeaderComponent) {
63
+ return null;
64
+ }
65
+ return (
66
+ <CompatView style={ListHeaderComponentStyle}>
67
+ {getValidComponent(ListHeaderComponent)}
68
+ </CompatView>
69
+ );
70
+ }, [ListHeaderComponent, ListHeaderComponentStyle]);
71
+
72
+ /**
73
+ * Creates the footer component with optional styling.
74
+ */
75
+ const renderFooter = useMemo(() => {
76
+ if (!ListFooterComponent) {
77
+ return null;
78
+ }
79
+ return (
80
+ <CompatView style={ListFooterComponentStyle}>
81
+ {getValidComponent(ListFooterComponent)}
82
+ </CompatView>
83
+ );
84
+ }, [ListFooterComponent, ListFooterComponentStyle]);
85
+
86
+ /**
87
+ * Creates the empty state component when there's no data.
88
+ * Only rendered when ListEmptyComponent is provided and data is empty.
89
+ */
90
+ const renderEmpty = useMemo(() => {
91
+ if (!ListEmptyComponent || (data && data.length > 0)) {
92
+ return null;
93
+ }
94
+ return getValidComponent(ListEmptyComponent);
95
+ }, [ListEmptyComponent, data]);
96
+
97
+ /**
98
+ * Creates an animated scroll component based on the provided renderScrollComponent.
99
+ * If no custom component is provided, uses the default CompatAnimatedScroller.
100
+ */
101
+ const CompatScrollView = useMemo(() => {
102
+ let scrollComponent = CompatAnimatedScroller;
103
+ if (typeof renderScrollComponent === "function") {
104
+ // Create a forwarded ref wrapper for the custom scroll component
105
+ const ForwardedScrollComponent = React.forwardRef((_props, ref) =>
106
+ (renderScrollComponent as any)({ ..._props, ref } as any)
107
+ );
108
+ ForwardedScrollComponent.displayName = "CustomScrollView";
109
+ scrollComponent = ForwardedScrollComponent as any;
110
+ } else if (renderScrollComponent) {
111
+ scrollComponent = renderScrollComponent;
112
+ }
113
+ // Wrap the scroll component with Animated.createAnimatedComponent
114
+ return Animated.createAnimatedComponent(scrollComponent);
115
+ }, [renderScrollComponent]);
116
+
117
+ return {
118
+ refreshControl,
119
+ renderHeader,
120
+ renderFooter,
121
+ renderEmpty,
122
+ CompatScrollView,
123
+ };
124
+ }
@@ -0,0 +1,73 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+
3
+ /**
4
+ * Hook that provides a setTimeout which is aware of component unmount state.
5
+ * Any timeouts created with this hook will be automatically cleared when the component unmounts.
6
+ */
7
+ export function useUnmountAwareTimeout() {
8
+ // Store active timeout IDs in a Set for more efficient add/remove operations
9
+ const [timeoutIds] = useState<Set<NodeJS.Timeout>>(() => new Set());
10
+
11
+ // Clear all timeouts on unmount
12
+ useEffect(() => {
13
+ return () => {
14
+ timeoutIds.forEach((id) => global.clearTimeout(id));
15
+ timeoutIds.clear();
16
+ };
17
+ }, [timeoutIds]);
18
+
19
+ // Create a safe setTimeout that will be cleared on unmount
20
+ const setTimeout = useCallback(
21
+ (callback: () => void, delay: number): void => {
22
+ const id = global.setTimeout(() => {
23
+ // Remove this timeout ID from the tracking set
24
+ timeoutIds.delete(id);
25
+ callback();
26
+ }, delay);
27
+
28
+ // Track this timeout ID
29
+ timeoutIds.add(id);
30
+ },
31
+ [timeoutIds]
32
+ );
33
+
34
+ return {
35
+ setTimeout,
36
+ };
37
+ }
38
+
39
+ /**
40
+ * Hook that provides a requestAnimationFrame which is aware of component unmount state.
41
+ * Any animation frames requested with this hook will be automatically canceled when the component unmounts.
42
+ */
43
+ export function useUnmountAwareAnimationFrame() {
44
+ // Store active animation frame request IDs in a Set for more efficient add/remove operations
45
+ const [requestIds] = useState<Set<number>>(() => new Set());
46
+
47
+ // Cancel all animation frame requests on unmount
48
+ useEffect(() => {
49
+ return () => {
50
+ requestIds.forEach((id) => cancelAnimationFrame(id));
51
+ requestIds.clear();
52
+ };
53
+ }, [requestIds]);
54
+
55
+ // Create a safe requestAnimationFrame that will be canceled on unmount
56
+ const requestAnimationFrame = useCallback(
57
+ (callback: FrameRequestCallback): void => {
58
+ const id = global.requestAnimationFrame((timestamp) => {
59
+ // Remove this request ID from the tracking set
60
+ requestIds.delete(id);
61
+ callback(timestamp);
62
+ });
63
+
64
+ // Track this request ID
65
+ requestIds.add(id);
66
+ },
67
+ [requestIds]
68
+ );
69
+
70
+ return {
71
+ requestAnimationFrame,
72
+ };
73
+ }
@@ -0,0 +1,27 @@
1
+ import { useRef, useLayoutEffect } from "react";
2
+
3
+ /**
4
+ * Hook that provides a way to track component unmounting state.
5
+ * This hook is particularly useful for preventing state updates or side effects
6
+ * after a component has unmounted, helping to avoid memory leaks and race conditions.
7
+ *
8
+ * @returns A ref containing a boolean flag that indicates whether the component is unmounted
9
+ * (true) or mounted (false)
10
+ */
11
+ export const useUnmountFlag = () => {
12
+ // Create a ref to store the unmount state
13
+ // Using ref ensures the value persists between renders without causing re-renders
14
+ const isUnmounted = useRef(false);
15
+
16
+ // Use layoutEffect to set up cleanup on unmount
17
+ // This ensures the flag is set before any other cleanup effects run
18
+ useLayoutEffect(() => {
19
+ isUnmounted.current = false;
20
+ // Cleanup function that runs when the component unmounts
21
+ return () => {
22
+ isUnmounted.current = true;
23
+ };
24
+ }, []);
25
+
26
+ return isUnmounted;
27
+ };
@@ -0,0 +1,256 @@
1
+ import {
2
+ LayoutParams,
3
+ RVDimension,
4
+ RVLayout,
5
+ RVLayoutInfo,
6
+ RVLayoutManager,
7
+ } from "./LayoutManager";
8
+
9
+ /**
10
+ * GridLayoutManager implementation that arranges items in a grid pattern.
11
+ * Items are placed in rows and columns, with support for items spanning multiple columns.
12
+ */
13
+ export class RVGridLayoutManagerImpl extends RVLayoutManager {
14
+ /** The width of the bounded area for the grid */
15
+ private boundedSize: number;
16
+
17
+ /** If there's a span change for grid layout, we need to recompute all the widths */
18
+ private fullRelayoutRequired = false;
19
+
20
+ constructor(params: LayoutParams, previousLayoutManager?: RVLayoutManager) {
21
+ super(params, previousLayoutManager);
22
+ this.boundedSize = params.windowSize.width;
23
+ }
24
+
25
+ /**
26
+ * Updates layout parameters and triggers recomputation if necessary.
27
+ * @param params New layout parameters
28
+ */
29
+ updateLayoutParams(params: LayoutParams): void {
30
+ const prevNumColumns = this.maxColumns;
31
+ super.updateLayoutParams(params);
32
+ if (
33
+ this.boundedSize !== params.windowSize.width ||
34
+ prevNumColumns !== params.maxColumns
35
+ ) {
36
+ this.boundedSize = params.windowSize.width;
37
+ if (this.layouts.length > 0) {
38
+ // update all widths
39
+ this.updateAllWidths();
40
+
41
+ this.recomputeLayouts(0, this.layouts.length - 1);
42
+ this.requiresRepaint = true;
43
+ }
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Processes layout information for items, updating their dimensions.
49
+ * @param layoutInfo Array of layout information for items
50
+ * @param itemCount Total number of items in the list
51
+ */
52
+ processLayoutInfo(layoutInfo: RVLayoutInfo[], itemCount: number) {
53
+ for (const info of layoutInfo) {
54
+ const { index, dimensions } = info;
55
+ const layout = this.layouts[index];
56
+ layout.height = dimensions.height;
57
+ layout.isHeightMeasured = true;
58
+ layout.isWidthMeasured = true;
59
+ }
60
+
61
+ // TODO: Can be optimized
62
+ if (this.fullRelayoutRequired) {
63
+ this.updateAllWidths();
64
+ this.fullRelayoutRequired = false;
65
+ return 0;
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Estimates layout dimensions for an item at the given index.
71
+ * @param index Index of the item to estimate layout for
72
+ */
73
+ estimateLayout(index: number) {
74
+ const layout = this.layouts[index];
75
+ layout.width = this.getWidth(index);
76
+ layout.height = this.getEstimatedHeight(index);
77
+
78
+ layout.isWidthMeasured = true;
79
+ layout.enforcedWidth = true;
80
+ }
81
+
82
+ /**
83
+ * Handles span change for an item.
84
+ * @param index Index of the item
85
+ */
86
+ handleSpanChange(index: number) {
87
+ this.fullRelayoutRequired = true;
88
+ }
89
+
90
+ /**
91
+ * Returns the total size of the layout area.
92
+ * @returns RVDimension containing width and height of the layout
93
+ */
94
+ getLayoutSize(): RVDimension {
95
+ if (this.layouts.length === 0) return { width: 0, height: 0 };
96
+ const totalHeight = this.computeTotalHeightTillRow(this.layouts.length - 1);
97
+ return {
98
+ width: this.boundedSize,
99
+ height: totalHeight,
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Recomputes layouts for items in the given range.
105
+ * @param startIndex Starting index of items to recompute
106
+ * @param endIndex Ending index of items to recompute
107
+ */
108
+ recomputeLayouts(startIndex: number, endIndex: number): void {
109
+ const newStartIndex = this.locateFirstIndexInRow(
110
+ Math.max(0, startIndex - 1)
111
+ );
112
+ const startVal = this.getLayout(newStartIndex);
113
+
114
+ let startX = startVal.x;
115
+ let startY = startVal.y;
116
+
117
+ for (let i = newStartIndex; i <= endIndex; i++) {
118
+ const layout = this.getLayout(i);
119
+ if (!this.checkBounds(startX, layout.width)) {
120
+ const tallestItem = this.processAndReturnTallestItemInRow(i - 1);
121
+ startY = tallestItem.y + tallestItem.height;
122
+ startX = 0;
123
+ }
124
+
125
+ layout.x = startX;
126
+ layout.y = startY;
127
+ startX += layout.width;
128
+ }
129
+ if (endIndex === this.layouts.length - 1) {
130
+ this.processAndReturnTallestItemInRow(endIndex);
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Calculates the width of an item based on its span.
136
+ * @param index Index of the item
137
+ * @returns Width of the item
138
+ */
139
+ private getWidth(index: number): number {
140
+ return (this.boundedSize / this.maxColumns) * this.getSpan(index);
141
+ }
142
+
143
+ /**
144
+ * Processes items in a row and returns the tallest item.
145
+ * Also handles height normalization for items in the same row.
146
+ * Tallest item per row helps in forcing tallest items height on neighbouring items.
147
+ * @param endIndex Index of the last item in the row
148
+ * @returns The tallest item in the row
149
+ */
150
+ private processAndReturnTallestItemInRow(endIndex: number): RVLayout {
151
+ const startIndex = this.locateFirstIndexInRow(endIndex);
152
+ let tallestItem: RVLayout | undefined;
153
+ let maxHeight = 0;
154
+ let i = startIndex;
155
+ let isMeasured = false;
156
+ while (i <= endIndex) {
157
+ const layout = this.layouts[i];
158
+ isMeasured = isMeasured || Boolean(layout.isHeightMeasured);
159
+ maxHeight = Math.max(maxHeight, layout.height);
160
+ if (
161
+ layout.height > (layout.minHeight ?? 0) &&
162
+ layout.height > (tallestItem?.height ?? 0)
163
+ ) {
164
+ tallestItem = layout;
165
+ }
166
+
167
+ i++;
168
+ if (i >= this.layouts.length) {
169
+ break;
170
+ }
171
+ }
172
+ if (!tallestItem && maxHeight > 0) {
173
+ maxHeight = Number.MAX_SAFE_INTEGER;
174
+ }
175
+ tallestItem = tallestItem ?? this.layouts[startIndex];
176
+
177
+ if (!isMeasured) {
178
+ return tallestItem;
179
+ }
180
+
181
+ if (tallestItem) {
182
+ let targetHeight = tallestItem.height;
183
+ if (maxHeight - tallestItem.height > 1) {
184
+ targetHeight = 0;
185
+ this.requiresRepaint = true;
186
+ }
187
+ i = startIndex;
188
+ while (i <= endIndex) {
189
+ this.layouts[i].minHeight = targetHeight;
190
+ if (targetHeight > 0) {
191
+ this.layouts[i].height = targetHeight;
192
+ }
193
+ i++;
194
+ if (i >= this.layouts.length) {
195
+ break;
196
+ }
197
+ }
198
+ tallestItem.minHeight = 0;
199
+ }
200
+ return tallestItem;
201
+ }
202
+
203
+ /**
204
+ * Computes the total height of the layout.
205
+ * @param endIndex Index of the last item in the row
206
+ * @returns Total height of the layout
207
+ */
208
+ private computeTotalHeightTillRow(endIndex: number): number {
209
+ const startIndex = this.locateFirstIndexInRow(endIndex);
210
+ const y = this.layouts[startIndex].y;
211
+ let maxHeight = 0;
212
+ let i = startIndex;
213
+ while (i <= endIndex) {
214
+ maxHeight = Math.max(maxHeight, this.layouts[i].height);
215
+ i++;
216
+ if (i >= this.layouts.length) {
217
+ break;
218
+ }
219
+ }
220
+ return y + maxHeight;
221
+ }
222
+
223
+ private updateAllWidths() {
224
+ for (let i = 0; i < this.layouts.length; i++) {
225
+ this.layouts[i].width = this.getWidth(i);
226
+ }
227
+ }
228
+
229
+ /**
230
+ * Checks if an item can fit within the bounded width.
231
+ * @param itemX Starting X position of the item
232
+ * @param width Width of the item
233
+ * @returns True if the item fits within bounds
234
+ */
235
+ private checkBounds(itemX: number, width: number): boolean {
236
+ return itemX + width <= this.boundedSize + 0.9;
237
+ }
238
+
239
+ /**
240
+ * Locates the index of the first item in the current row.
241
+ * @param itemIndex Index to start searching from
242
+ * @returns Index of the first item in the row
243
+ */
244
+ private locateFirstIndexInRow(itemIndex: number): number {
245
+ if (itemIndex === 0) {
246
+ return 0;
247
+ }
248
+ let i = itemIndex;
249
+ for (; i >= 0; i--) {
250
+ if (this.layouts[i].x === 0) {
251
+ break;
252
+ }
253
+ }
254
+ return Math.max(i, 0);
255
+ }
256
+ }