@shopify/flash-list 2.0.0 → 2.0.2-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 (289) hide show
  1. package/README.md +97 -27
  2. package/RNFlashList.podspec +37 -0
  3. package/android/build.gradle +89 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutShadow.kt +105 -0
  6. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutView.kt +158 -0
  7. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutViewManager.kt +70 -0
  8. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/BlankAreaEvent.kt +29 -0
  9. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainer.java +16 -0
  10. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerImpl.kt +16 -0
  11. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerManager.kt +34 -0
  12. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/FlashListPackage.kt +19 -0
  13. package/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerDelegate.java +47 -0
  14. package/android/src/paper/java/com/facebook/react/viewmanagers/AutoLayoutViewManagerInterface.java +21 -0
  15. package/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerDelegate.java +32 -0
  16. package/android/src/paper/java/com/facebook/react/viewmanagers/CellContainerManagerInterface.java +16 -0
  17. package/android/src/test/java/com/shopify/reactnative/flash_list/AutoLayoutShadowTest.kt +147 -0
  18. package/android/src/test/java/com/shopify/reactnative/flash_list/models/Rect.kt +61 -0
  19. package/android/src/test/java/com/shopify/reactnative/flash_list/models/TestCollection.kt +6 -0
  20. package/android/src/test/java/com/shopify/reactnative/flash_list/models/TestDataModel.kt +8 -0
  21. package/android/src/test/resources/LayoutTestData.json +788 -0
  22. package/dist/AnimatedFlashList.js +2 -2
  23. package/dist/AnimatedFlashList.js.map +1 -1
  24. package/dist/FlashList.d.ts +167 -1
  25. package/dist/FlashList.d.ts.map +1 -1
  26. package/dist/FlashList.js +595 -3
  27. package/dist/FlashList.js.map +1 -1
  28. package/dist/FlashListProps.d.ts +63 -2
  29. package/dist/FlashListProps.d.ts.map +1 -1
  30. package/dist/FlashListProps.js.map +1 -1
  31. package/dist/GridLayoutProviderWithProps.d.ts +42 -0
  32. package/dist/GridLayoutProviderWithProps.d.ts.map +1 -0
  33. package/dist/GridLayoutProviderWithProps.js +114 -0
  34. package/dist/GridLayoutProviderWithProps.js.map +1 -0
  35. package/dist/MasonryFlashList.d.ts +51 -0
  36. package/dist/MasonryFlashList.d.ts.map +1 -0
  37. package/dist/MasonryFlashList.js +252 -0
  38. package/dist/MasonryFlashList.js.map +1 -0
  39. package/dist/PureComponentWrapper.d.ts +22 -0
  40. package/dist/PureComponentWrapper.d.ts.map +1 -0
  41. package/dist/PureComponentWrapper.js +37 -0
  42. package/dist/PureComponentWrapper.js.map +1 -0
  43. package/dist/__tests__/ContentContainerUtils.test.d.ts +2 -0
  44. package/dist/__tests__/ContentContainerUtils.test.d.ts.map +1 -0
  45. package/dist/__tests__/ContentContainerUtils.test.js +85 -0
  46. package/dist/__tests__/ContentContainerUtils.test.js.map +1 -0
  47. package/dist/__tests__/FlashList.test.d.ts +2 -0
  48. package/dist/__tests__/FlashList.test.d.ts.map +1 -0
  49. package/dist/__tests__/FlashList.test.js +902 -0
  50. package/dist/__tests__/FlashList.test.js.map +1 -0
  51. package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts +2 -0
  52. package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts.map +1 -0
  53. package/dist/__tests__/GridLayoutProviderWithProps.test.js +143 -0
  54. package/dist/__tests__/GridLayoutProviderWithProps.test.js.map +1 -0
  55. package/dist/__tests__/MasonryFlashList.test.d.ts +2 -0
  56. package/dist/__tests__/MasonryFlashList.test.d.ts.map +1 -0
  57. package/dist/__tests__/MasonryFlashList.test.js +254 -0
  58. package/dist/__tests__/MasonryFlashList.test.js.map +1 -0
  59. package/dist/__tests__/PlatformHelper.web.test.d.ts +2 -0
  60. package/dist/__tests__/PlatformHelper.web.test.d.ts.map +1 -0
  61. package/dist/__tests__/PlatformHelper.web.test.js +33 -0
  62. package/dist/__tests__/PlatformHelper.web.test.js.map +1 -0
  63. package/dist/__tests__/ViewabilityHelper.test.js +4 -3
  64. package/dist/__tests__/ViewabilityHelper.test.js.map +1 -1
  65. package/dist/__tests__/helpers/mountFlashList.d.ts +19 -0
  66. package/dist/__tests__/helpers/mountFlashList.d.ts.map +1 -0
  67. package/dist/__tests__/helpers/mountFlashList.js +44 -0
  68. package/dist/__tests__/helpers/mountFlashList.js.map +1 -0
  69. package/dist/__tests__/helpers/mountMasonryFlashList.d.ts +18 -0
  70. package/dist/__tests__/helpers/mountMasonryFlashList.d.ts.map +1 -0
  71. package/dist/__tests__/helpers/mountMasonryFlashList.js +49 -0
  72. package/dist/__tests__/helpers/mountMasonryFlashList.js.map +1 -0
  73. package/dist/__tests__/useBlankAreaTracker.test.d.ts +2 -0
  74. package/dist/__tests__/useBlankAreaTracker.test.d.ts.map +1 -0
  75. package/dist/__tests__/useBlankAreaTracker.test.js +179 -0
  76. package/dist/__tests__/useBlankAreaTracker.test.js.map +1 -0
  77. package/dist/benchmark/JSFPSMonitor.d.ts.map +1 -1
  78. package/dist/benchmark/JSFPSMonitor.js +1 -2
  79. package/dist/benchmark/JSFPSMonitor.js.map +1 -1
  80. package/dist/benchmark/useBenchmark.d.ts +4 -2
  81. package/dist/benchmark/useBenchmark.d.ts.map +1 -1
  82. package/dist/benchmark/useBenchmark.js +24 -12
  83. package/dist/benchmark/useBenchmark.js.map +1 -1
  84. package/dist/benchmark/useBlankAreaTracker.d.ts +34 -0
  85. package/dist/benchmark/useBlankAreaTracker.d.ts.map +1 -0
  86. package/dist/benchmark/useBlankAreaTracker.js +66 -0
  87. package/dist/benchmark/useBlankAreaTracker.js.map +1 -0
  88. package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
  89. package/dist/benchmark/useFlatListBenchmark.js +1 -2
  90. package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
  91. package/dist/enableNewCore.d.ts +3 -0
  92. package/dist/enableNewCore.d.ts.map +1 -0
  93. package/dist/enableNewCore.js +25 -0
  94. package/dist/enableNewCore.js.map +1 -0
  95. package/dist/errors/CustomError.d.ts +8 -0
  96. package/dist/errors/CustomError.d.ts.map +1 -0
  97. package/dist/errors/CustomError.js +14 -0
  98. package/dist/errors/CustomError.js.map +1 -0
  99. package/dist/errors/ExceptionList.d.ts +24 -0
  100. package/dist/errors/ExceptionList.d.ts.map +1 -0
  101. package/dist/errors/ExceptionList.js +26 -0
  102. package/dist/errors/ExceptionList.js.map +1 -0
  103. package/dist/errors/Warnings.d.ts +9 -0
  104. package/dist/errors/Warnings.d.ts.map +1 -0
  105. package/dist/errors/Warnings.js +13 -0
  106. package/dist/errors/Warnings.js.map +1 -0
  107. package/dist/index.d.ts +9 -3
  108. package/dist/index.d.ts.map +1 -1
  109. package/dist/index.js +29 -7
  110. package/dist/index.js.map +1 -1
  111. package/dist/native/auto-layout/AutoLayoutView.d.ts +22 -0
  112. package/dist/native/auto-layout/AutoLayoutView.d.ts.map +1 -0
  113. package/dist/native/auto-layout/AutoLayoutView.js +48 -0
  114. package/dist/native/auto-layout/AutoLayoutView.js.map +1 -0
  115. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts +4 -0
  116. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.d.ts.map +1 -0
  117. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js +6 -0
  118. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.android.js.map +1 -0
  119. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts +5 -0
  120. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts.map +1 -0
  121. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts +4 -0
  122. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.d.ts.map +1 -0
  123. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js +6 -0
  124. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.ios.js.map +1 -0
  125. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js +6 -0
  126. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js.map +1 -0
  127. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts +16 -0
  128. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts.map +1 -0
  129. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js +3 -0
  130. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js.map +1 -0
  131. package/dist/native/cell-container/CellContainer.android.d.ts +6 -0
  132. package/dist/native/cell-container/CellContainer.android.d.ts.map +1 -0
  133. package/dist/native/cell-container/CellContainer.android.js +9 -0
  134. package/dist/native/cell-container/CellContainer.android.js.map +1 -0
  135. package/dist/native/cell-container/CellContainer.d.ts +8 -0
  136. package/dist/native/cell-container/CellContainer.d.ts.map +1 -0
  137. package/dist/native/cell-container/CellContainer.ios.d.ts +6 -0
  138. package/dist/native/cell-container/CellContainer.ios.d.ts.map +1 -0
  139. package/dist/native/cell-container/CellContainer.ios.js +9 -0
  140. package/dist/native/cell-container/CellContainer.ios.js.map +1 -0
  141. package/dist/native/cell-container/CellContainer.js +11 -0
  142. package/dist/native/cell-container/CellContainer.js.map +1 -0
  143. package/dist/native/cell-container/CellContainer.web.d.ts +7 -0
  144. package/dist/native/cell-container/CellContainer.web.d.ts.map +1 -0
  145. package/dist/native/cell-container/CellContainer.web.js +13 -0
  146. package/dist/native/cell-container/CellContainer.web.js.map +1 -0
  147. package/dist/native/config/PlatformHelper.android.d.ts +22 -1
  148. package/dist/native/config/PlatformHelper.android.d.ts.map +1 -1
  149. package/dist/native/config/PlatformHelper.android.js +16 -1
  150. package/dist/native/config/PlatformHelper.android.js.map +1 -1
  151. package/dist/native/config/PlatformHelper.d.ts +22 -1
  152. package/dist/native/config/PlatformHelper.d.ts.map +1 -1
  153. package/dist/native/config/PlatformHelper.ios.d.ts +22 -1
  154. package/dist/native/config/PlatformHelper.ios.d.ts.map +1 -1
  155. package/dist/native/config/PlatformHelper.ios.js +15 -1
  156. package/dist/native/config/PlatformHelper.ios.js.map +1 -1
  157. package/dist/native/config/PlatformHelper.js +16 -1
  158. package/dist/native/config/PlatformHelper.js.map +1 -1
  159. package/dist/native/config/PlatformHelper.web.d.ts +23 -1
  160. package/dist/native/config/PlatformHelper.web.d.ts.map +1 -1
  161. package/dist/native/config/PlatformHelper.web.js +18 -1
  162. package/dist/native/config/PlatformHelper.web.js.map +1 -1
  163. package/dist/recyclerview/RecyclerView.d.ts.map +1 -1
  164. package/dist/recyclerview/RecyclerView.js +6 -6
  165. package/dist/recyclerview/RecyclerView.js.map +1 -1
  166. package/dist/recyclerview/RecyclerViewManager.d.ts.map +1 -1
  167. package/dist/recyclerview/RecyclerViewManager.js +8 -9
  168. package/dist/recyclerview/RecyclerViewManager.js.map +1 -1
  169. package/dist/recyclerview/RecyclerViewProps.d.ts +8 -1
  170. package/dist/recyclerview/RecyclerViewProps.d.ts.map +1 -1
  171. package/dist/recyclerview/helpers/RenderTimeTracker.d.ts +3 -0
  172. package/dist/recyclerview/helpers/RenderTimeTracker.d.ts.map +1 -1
  173. package/dist/recyclerview/helpers/RenderTimeTracker.js +7 -0
  174. package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -1
  175. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -1
  176. package/dist/recyclerview/hooks/useRecyclerViewController.js +0 -4
  177. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -1
  178. package/dist/recyclerview/layout-managers/LayoutManager.d.ts.map +1 -1
  179. package/dist/recyclerview/layout-managers/LayoutManager.js +1 -2
  180. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -1
  181. package/dist/specs/AutoLayoutNativeComponent.d.ts +18 -0
  182. package/dist/specs/AutoLayoutNativeComponent.d.ts.map +1 -0
  183. package/dist/specs/AutoLayoutNativeComponent.js +6 -0
  184. package/dist/specs/AutoLayoutNativeComponent.js.map +1 -0
  185. package/dist/specs/CellContainerNativeComponent.d.ts +8 -0
  186. package/dist/specs/CellContainerNativeComponent.d.ts.map +1 -0
  187. package/dist/specs/CellContainerNativeComponent.js +6 -0
  188. package/dist/specs/CellContainerNativeComponent.js.map +1 -0
  189. package/dist/tsconfig.tsbuildinfo +1 -1
  190. package/dist/utils/ContentContainerUtils.d.ts +27 -0
  191. package/dist/utils/ContentContainerUtils.d.ts.map +1 -0
  192. package/dist/utils/ContentContainerUtils.js +48 -0
  193. package/dist/utils/ContentContainerUtils.js.map +1 -0
  194. package/dist/viewability/ViewToken.d.ts.map +1 -0
  195. package/dist/viewability/ViewToken.js.map +1 -0
  196. package/dist/{recyclerview/viewability → viewability}/ViewabilityHelper.d.ts +2 -2
  197. package/dist/viewability/ViewabilityHelper.d.ts.map +1 -0
  198. package/dist/{recyclerview/viewability → viewability}/ViewabilityHelper.js +4 -2
  199. package/dist/{recyclerview/viewability → viewability}/ViewabilityHelper.js.map +1 -1
  200. package/dist/{recyclerview/viewability → viewability}/ViewabilityManager.d.ts +3 -3
  201. package/dist/viewability/ViewabilityManager.d.ts.map +1 -0
  202. package/dist/{recyclerview/viewability → viewability}/ViewabilityManager.js +16 -16
  203. package/dist/viewability/ViewabilityManager.js.map +1 -0
  204. package/ios/RNFlashList.xcodeproj/project.pbxproj +3 -0
  205. package/ios/RNFlashList.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
  206. package/ios/Sources/AutoLayoutView.swift +294 -0
  207. package/ios/Sources/AutoLayoutViewComponentView.h +16 -0
  208. package/ios/Sources/AutoLayoutViewComponentView.mm +90 -0
  209. package/ios/Sources/AutoLayoutViewManager.mm +14 -0
  210. package/ios/Sources/AutoLayoutViewManager.swift +12 -0
  211. package/ios/Sources/CellContainerComponentView.h +18 -0
  212. package/ios/Sources/CellContainerComponentView.mm +62 -0
  213. package/ios/Sources/CellContainerManager.mm +8 -0
  214. package/ios/Sources/CellContainerManager.swift +12 -0
  215. package/ios/Sources/FlatListPro-Bridging-Header.h +11 -0
  216. package/ios/Tests/AutoLayoutViewTests.swift +113 -0
  217. package/package.json +14 -3
  218. package/src/AnimatedFlashList.ts +2 -2
  219. package/src/FlashList.tsx +953 -0
  220. package/src/FlashListProps.ts +79 -3
  221. package/src/GridLayoutProviderWithProps.ts +180 -0
  222. package/src/MasonryFlashList.tsx +476 -0
  223. package/src/PureComponentWrapper.tsx +42 -0
  224. package/src/__tests__/ContentContainerUtils.test.ts +130 -0
  225. package/src/__tests__/FlashList.test.tsx +1001 -0
  226. package/src/__tests__/GridLayoutProviderWithProps.test.ts +179 -0
  227. package/src/__tests__/MasonryFlashList.test.ts +292 -0
  228. package/src/__tests__/PlatformHelper.web.test.ts +45 -0
  229. package/src/__tests__/ViewabilityHelper.test.ts +14 -13
  230. package/src/__tests__/helpers/mountFlashList.tsx +62 -0
  231. package/src/__tests__/helpers/mountMasonryFlashList.tsx +70 -0
  232. package/src/__tests__/useBlankAreaTracker.test.tsx +206 -0
  233. package/src/benchmark/JSFPSMonitor.ts +3 -3
  234. package/src/benchmark/useBenchmark.ts +40 -12
  235. package/src/benchmark/useBlankAreaTracker.ts +117 -0
  236. package/src/benchmark/useFlatListBenchmark.ts +1 -3
  237. package/src/enableNewCore.ts +24 -0
  238. package/src/errors/CustomError.ts +10 -0
  239. package/src/errors/ExceptionList.ts +28 -0
  240. package/src/errors/Warnings.ts +15 -0
  241. package/src/index.ts +43 -7
  242. package/src/native/auto-layout/AutoLayoutView.tsx +73 -0
  243. package/src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts +7 -0
  244. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts +7 -0
  245. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ts +7 -0
  246. package/src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts +17 -0
  247. package/src/native/cell-container/CellContainer.android.ts +7 -0
  248. package/src/native/cell-container/CellContainer.ios.ts +7 -0
  249. package/src/native/cell-container/CellContainer.tsx +14 -0
  250. package/src/native/cell-container/CellContainer.web.tsx +9 -0
  251. package/src/native/config/PlatformHelper.android.ts +25 -1
  252. package/src/native/config/PlatformHelper.ios.ts +24 -1
  253. package/src/native/config/PlatformHelper.ts +25 -1
  254. package/src/native/config/PlatformHelper.web.ts +30 -1
  255. package/src/recyclerview/RecyclerView.tsx +11 -6
  256. package/src/recyclerview/RecyclerViewManager.ts +18 -9
  257. package/src/recyclerview/RecyclerViewProps.ts +11 -1
  258. package/src/recyclerview/helpers/RenderTimeTracker.ts +8 -0
  259. package/src/recyclerview/hooks/useRecyclerViewController.tsx +0 -4
  260. package/src/recyclerview/layout-managers/LayoutManager.ts +1 -2
  261. package/src/specs/AutoLayoutNativeComponent.ts +24 -0
  262. package/src/specs/CellContainerNativeComponent.ts +9 -0
  263. package/src/utils/ContentContainerUtils.ts +92 -0
  264. package/src/{recyclerview/viewability → viewability}/ViewabilityHelper.ts +9 -8
  265. package/src/{recyclerview/viewability → viewability}/ViewabilityManager.ts +20 -18
  266. package/dist/errors/ErrorMessages.d.ts +0 -16
  267. package/dist/errors/ErrorMessages.d.ts.map +0 -1
  268. package/dist/errors/ErrorMessages.js +0 -19
  269. package/dist/errors/ErrorMessages.js.map +0 -1
  270. package/dist/errors/WarningMessages.d.ts +0 -4
  271. package/dist/errors/WarningMessages.d.ts.map +0 -1
  272. package/dist/errors/WarningMessages.js +0 -7
  273. package/dist/errors/WarningMessages.js.map +0 -1
  274. package/dist/isNewArch.d.ts +0 -2
  275. package/dist/isNewArch.d.ts.map +0 -1
  276. package/dist/isNewArch.js +0 -25
  277. package/dist/isNewArch.js.map +0 -1
  278. package/dist/recyclerview/viewability/ViewToken.d.ts.map +0 -1
  279. package/dist/recyclerview/viewability/ViewToken.js.map +0 -1
  280. package/dist/recyclerview/viewability/ViewabilityHelper.d.ts.map +0 -1
  281. package/dist/recyclerview/viewability/ViewabilityManager.d.ts.map +0 -1
  282. package/dist/recyclerview/viewability/ViewabilityManager.js.map +0 -1
  283. package/src/FlashList.ts +0 -1
  284. package/src/errors/ErrorMessages.ts +0 -26
  285. package/src/errors/WarningMessages.ts +0 -4
  286. package/src/isNewArch.ts +0 -25
  287. /package/dist/{recyclerview/viewability → viewability}/ViewToken.d.ts +0 -0
  288. /package/dist/{recyclerview/viewability → viewability}/ViewToken.js +0 -0
  289. /package/src/{recyclerview/viewability → viewability}/ViewToken.ts +0 -0
@@ -1,6 +1,7 @@
1
1
  import type React from "react";
2
2
  import { StyleProp, ScrollViewProps, ViewabilityConfig, ViewStyle } from "react-native";
3
- import ViewToken from "./recyclerview/viewability/ViewToken";
3
+ import { BlankAreaEventHandler } from "./native/auto-layout/AutoLayoutView";
4
+ import ViewToken from "./viewability/ViewToken";
4
5
  export interface ListRenderItemInfo<TItem> {
5
6
  item: TItem;
6
7
  index: number;
@@ -20,6 +21,7 @@ export interface OverrideProps {
20
21
  export type RenderTarget = "Cell" | "StickyHeader" | "Measurement";
21
22
  export declare const RenderTargetOptions: Record<string, RenderTarget>;
22
23
  export type ListRenderItem<TItem> = (info: ListRenderItemInfo<TItem>) => React.ReactElement | null;
24
+ export type ContentStyle = Pick<ViewStyle, "backgroundColor" | "paddingTop" | "paddingLeft" | "paddingRight" | "paddingBottom" | "padding" | "paddingVertical" | "paddingHorizontal">;
23
25
  export interface ViewabilityConfigCallbackPair<TItem> {
24
26
  viewabilityConfig: ViewabilityConfig;
25
27
  onViewableItemsChanged: ((info: {
@@ -49,6 +51,13 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
49
51
  * For simplicity, data is a plain array of items of a given type.
50
52
  */
51
53
  data: ReadonlyArray<TItem> | null | undefined;
54
+ /**
55
+ * Average or median size for elements in the list. Doesn't have to be very accurate but a good estimate can improve performance.
56
+ * A quick look at `Element Inspector` can help you determine this. If you're confused between two values, the smaller value is a better choice.
57
+ * For vertical lists provide average height and for horizontal average width.
58
+ * Read more about it here: https://shopify.github.io/flash-list/docs/estimated-item-size
59
+ */
60
+ estimatedItemSize?: number;
52
61
  /**
53
62
  * Each cell is rendered using this element.
54
63
  * Can be a React Component Class, or a render function.
@@ -95,10 +104,29 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
95
104
  * Rendered as the main scrollview.
96
105
  */
97
106
  renderScrollComponent?: React.ComponentType<ScrollViewProps> | React.FC<ScrollViewProps>;
107
+ /**
108
+ * You can use `contentContainerStyle` to apply padding that will be applied to the whole content itself.
109
+ * For example, you can apply this padding, so that all of your items have leading and trailing space.
110
+ */
111
+ contentContainerStyle?: ContentStyle;
98
112
  /**
99
113
  * Draw distance for advanced rendering (in dp/px)
100
114
  */
101
115
  drawDistance?: number;
116
+ /**
117
+ * Specifies how far the first item is drawn from start of the list window or, offset of the first item of the list (not the header).
118
+ * Needed if you're using initialScrollIndex prop. Before the initial draw the list cannot figure out the size of header or, any special margin/padding that might have been applied
119
+ * using header styles etc.
120
+ * If this isn't provided initialScrollIndex might not scroll to the provided index.
121
+ */
122
+ estimatedFirstItemOffset?: number;
123
+ /**
124
+ * Visible height and width of the list. This is not the scroll content size.
125
+ */
126
+ estimatedListSize?: {
127
+ height: number;
128
+ width: number;
129
+ };
102
130
  /**
103
131
  * A marker property for telling the list to re-render (since it implements PureComponent).
104
132
  * If any of your `renderItem`, Header, Footer, etc. functions depend on anything outside of the `data` prop,
@@ -113,6 +141,10 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
113
141
  * Instead of starting at the top with the first item, start at initialScrollIndex.
114
142
  */
115
143
  initialScrollIndex?: number | null | undefined;
144
+ /**
145
+ * Reverses the direction of scroll. Uses scale transforms of -1.
146
+ */
147
+ inverted?: boolean | null | undefined;
116
148
  /**
117
149
  * Used to extract a unique key for a given item at the specified index.
118
150
  * Key is used for optimizing performance. Defining `keyExtractor` is also necessary
@@ -125,6 +157,17 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
125
157
  * Items should all be the same height - masonry layouts are not supported.
126
158
  */
127
159
  numColumns?: number | undefined;
160
+ /**
161
+ * Computes blank space that is visible to the user during scroll or list load. If list doesn't have enough items to fill the screen even then this will be raised.
162
+ * Values reported: {
163
+ * offsetStart -> visible blank space on top of the screen (while going up). If value is greater than 0 then it's visible to user.
164
+ * offsetEnd -> visible blank space at the end of the screen (while going down). If value is greater than 0 then it's visible to user.
165
+ * blankArea -> max(offsetStart, offsetEnd) use this directly and look for values > 0
166
+ * }
167
+ * Please note that this event isn't synced with onScroll event but works with native onDraw/layoutSubviews. Events with values > 0 are blanks.
168
+ * This event is raised even when there is no visible blank with negative values for extensibility however, for most use cases check blankArea > 0 and use the value.
169
+ */
170
+ onBlankArea?: BlankAreaEventHandler;
128
171
  /**
129
172
  * Called once when the scroll position gets within onEndReachedThreshold of the rendered content.
130
173
  */
@@ -169,7 +212,11 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
169
212
  */
170
213
  getItemType?: (item: TItem, index: number, extraData?: any) => string | number | undefined;
171
214
  /**
172
- * This method can be used to change column span of an item.
215
+ * This method can be used to provide explicit size estimates or change column span of an item.
216
+ *
217
+ * Providing specific estimates is a good idea when you can calculate sizes reliably. FlashList will prefer this value over `estimatedItemSize` for that specific item.
218
+ * Precise estimates will also improve precision of `scrollToIndex` method and `initialScrollIndex` prop. If you have a `separator` below your items you can include its size in the estimate.
219
+ *
173
220
  * Changing item span is useful when you have grid layouts (numColumns > 1) and you want few items to be bigger than the rest.
174
221
  *
175
222
  * Modify the given layout. Do not return. FlashList will fallback to default values if this is ignored.
@@ -178,6 +225,7 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
178
225
  */
179
226
  overrideItemLayout?: (layout: {
180
227
  span?: number;
228
+ size?: number;
181
229
  }, item: TItem, index: number, maxColumns: number, extraData?: any) => void;
182
230
  /**
183
231
  * For debugging and exception use cases, internal props will be overriden with these values if used
@@ -203,6 +251,19 @@ export interface FlashListProps<TItem> extends Omit<ScrollViewProps, "maintainVi
203
251
  * A specific `onViewableItemsChanged` will be called when its corresponding `ViewabilityConfig`'s conditions are met.
204
252
  */
205
253
  viewabilityConfigCallbackPairs?: ViewabilityConfigCallbackPairs<TItem> | undefined;
254
+ /**
255
+ * FlashList attempts to measure size of horizontal lists by drawing an extra list item in advance. This can sometimes cause issues when used with `initialScrollIndex` in lists
256
+ * with very little content. You might see some amount of over scroll. When set to true the list's rendered size needs to be deterministic (i.e., height and width greater than 0)
257
+ * as FlashList will skip rendering the extra item for measurement. Default value is `false`.
258
+ */
259
+ disableHorizontalListHeightMeasurement?: boolean;
260
+ /**
261
+ * FlashList applies some fixes to layouts of its children which can conflict with custom `CellRendererComponent`
262
+ * implementations. You can disable this behavior by setting this to `true`.
263
+ * Recommendation: Set this to `true` while you apply special behavior to the `CellRendererComponent`. Once done set this to
264
+ * `false` again.
265
+ */
266
+ disableAutoLayout?: boolean;
206
267
  /**
207
268
  * New arch only
208
269
  * Maximum number of items in the recycle pool. These are the items that are cached in the recycle pool when they are scrolled off the screen.
@@ -1 +1 @@
1
- {"version":3,"file":"FlashListProps.d.ts","sourceRoot":"","sources":["../src/FlashListProps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FlashListProps.d.ts","sourceRoot":"","sources":["../src/FlashListProps.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"FlashListProps.js","sourceRoot":"","sources":["../src/FlashListProps.ts"],"names":[],"mappings":";;;AA+Ba,QAAA,mBAAmB,GAAiC;IAC/D,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;CAC3B,CAAC"}
1
+ {"version":3,"file":"FlashListProps.js","sourceRoot":"","sources":["../src/FlashListProps.ts"],"names":[],"mappings":";;;AAgCa,QAAA,mBAAmB,GAAiC;IAC/D,IAAI,EAAE,MAAM;IACZ,YAAY,EAAE,cAAc;IAC5B,WAAW,EAAE,aAAa;CAC3B,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { Dimension, GridLayoutProvider, Layout, LayoutManager } from "recyclerlistview";
2
+ import { FlashListProps } from "./FlashListProps";
3
+ export default class GridLayoutProviderWithProps<T> extends GridLayoutProvider {
4
+ private props;
5
+ private layoutObject;
6
+ private averageWindow;
7
+ private renderWindowInsets;
8
+ private _hasExpired;
9
+ defaultEstimatedItemSize: number;
10
+ constructor(maxSpan: number, getLayoutType: (index: number, props: FlashListProps<T>, mutableLayout: {
11
+ span?: number;
12
+ size?: number;
13
+ }) => string | number, getSpan: (index: number, props: FlashListProps<T>, mutableLayout: {
14
+ span?: number;
15
+ size?: number;
16
+ }) => number, getHeightOrWidth: (index: number, props: FlashListProps<T>, mutableLayout: {
17
+ span?: number;
18
+ size?: number;
19
+ }) => number | undefined, props: FlashListProps<T>, acceptableRelayoutDelta?: number);
20
+ updateProps(props: FlashListProps<T>): GridLayoutProviderWithProps<T>;
21
+ /**
22
+ * This methods returns true if the layout provider has expired and needs to be recreated.
23
+ * This can happen if the number of columns has changed or the render window size has changed in a way that cannot be handled by the layout provider internally.
24
+ */
25
+ get hasExpired(): boolean;
26
+ /**
27
+ * Calling this method will mark the layout provider as expired. As a result, a new one will be created by FlashList and old cached layouts will be discarded.
28
+ */
29
+ markExpired(): void;
30
+ /**
31
+ * Calling this method will help the layout provider track average item sizes on its own
32
+ * Overriding layout manager can help achieve the same thing without relying on this method being called however, it will make implementation very complex for a simple use case
33
+ * @param index Index of the item being reported
34
+ */
35
+ reportItemLayout(index: number): void;
36
+ get averageItemSize(): number;
37
+ newLayoutManager(renderWindowSize: Dimension, isHorizontal?: boolean, cachedLayouts?: Layout[]): LayoutManager;
38
+ private updateCachedDimensions;
39
+ private getCleanLayoutObj;
40
+ private getAdjustedRenderWindowSize;
41
+ }
42
+ //# sourceMappingURL=GridLayoutProviderWithProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridLayoutProviderWithProps.d.ts","sourceRoot":"","sources":["../src/GridLayoutProviderWithProps.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIlD,MAAM,CAAC,OAAO,OAAO,2BAA2B,CAAC,CAAC,CAAE,SAAQ,kBAAkB;IAC5E,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,YAAY,CAAwC;IAC5D,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,kBAAkB,CAAsC;IAChE,OAAO,CAAC,WAAW,CAAS;IACrB,wBAAwB,SAAO;gBAGpC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,CACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EACxB,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5C,MAAM,GAAG,MAAM,EACpB,OAAO,EAAE,CACP,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EACxB,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5C,MAAM,EACX,gBAAgB,EAAE,CAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EACxB,aAAa,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5C,MAAM,GAAG,SAAS,EACvB,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,EACxB,uBAAuB,CAAC,EAAE,MAAM;IA6B3B,WAAW,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,2BAA2B,CAAC,CAAC,CAAC;IAmB5E;;;OAGG;IACH,IAAW,UAAU,YAEpB;IAED;;OAEG;IACI,WAAW;IAIlB;;;;OAIG;IACI,gBAAgB,CAAC,KAAK,EAAE,MAAM;IAYrC,IAAW,eAAe,WAEzB;IAEM,gBAAgB,CACrB,gBAAgB,EAAE,SAAS,EAC3B,YAAY,CAAC,EAAE,OAAO,EACtB,aAAa,CAAC,EAAE,MAAM,EAAE,GACvB,aAAa;IA0BhB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,2BAA2B;CAOpC"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var recyclerlistview_1 = require("recyclerlistview");
5
+ var AverageWindow_1 = require("./utils/AverageWindow");
6
+ var ContentContainerUtils_1 = require("./utils/ContentContainerUtils");
7
+ var GridLayoutProviderWithProps = /** @class */ (function (_super) {
8
+ tslib_1.__extends(GridLayoutProviderWithProps, _super);
9
+ function GridLayoutProviderWithProps(maxSpan, getLayoutType, getSpan, getHeightOrWidth, props, acceptableRelayoutDelta) {
10
+ var _a;
11
+ var _this = _super.call(this, maxSpan, function (i) {
12
+ return getLayoutType(i, _this.props, _this.getCleanLayoutObj());
13
+ }, function (i) {
14
+ return getSpan(i, _this.props, _this.getCleanLayoutObj());
15
+ }, function (i) {
16
+ var _a;
17
+ return (
18
+ // Using average item size if no override has been provided by the developer
19
+ (_a = getHeightOrWidth(i, _this.props, _this.getCleanLayoutObj())) !== null && _a !== void 0 ? _a : _this.averageItemSize);
20
+ }, acceptableRelayoutDelta) || this;
21
+ _this.layoutObject = { span: undefined, size: undefined };
22
+ _this.renderWindowInsets = { width: 0, height: 0 };
23
+ _this._hasExpired = false;
24
+ _this.defaultEstimatedItemSize = 100;
25
+ _this.props = props;
26
+ _this.averageWindow = new AverageWindow_1.AverageWindow(1, (_a = props.estimatedItemSize) !== null && _a !== void 0 ? _a : _this.defaultEstimatedItemSize);
27
+ _this.renderWindowInsets = _this.getAdjustedRenderWindowSize(_this.renderWindowInsets);
28
+ return _this;
29
+ }
30
+ GridLayoutProviderWithProps.prototype.updateProps = function (props) {
31
+ var newInsetValues = (0, ContentContainerUtils_1.applyContentContainerInsetForLayoutManager)({
32
+ height: 0,
33
+ width: 0,
34
+ }, props.contentContainerStyle, Boolean(props.horizontal));
35
+ this._hasExpired =
36
+ this._hasExpired ||
37
+ this.props.numColumns !== props.numColumns ||
38
+ newInsetValues.height !== this.renderWindowInsets.height ||
39
+ newInsetValues.width !== this.renderWindowInsets.width;
40
+ this.renderWindowInsets = newInsetValues;
41
+ this.props = props;
42
+ return this;
43
+ };
44
+ Object.defineProperty(GridLayoutProviderWithProps.prototype, "hasExpired", {
45
+ /**
46
+ * This methods returns true if the layout provider has expired and needs to be recreated.
47
+ * This can happen if the number of columns has changed or the render window size has changed in a way that cannot be handled by the layout provider internally.
48
+ */
49
+ get: function () {
50
+ return this._hasExpired;
51
+ },
52
+ enumerable: false,
53
+ configurable: true
54
+ });
55
+ /**
56
+ * Calling this method will mark the layout provider as expired. As a result, a new one will be created by FlashList and old cached layouts will be discarded.
57
+ */
58
+ GridLayoutProviderWithProps.prototype.markExpired = function () {
59
+ this._hasExpired = true;
60
+ };
61
+ /**
62
+ * Calling this method will help the layout provider track average item sizes on its own
63
+ * Overriding layout manager can help achieve the same thing without relying on this method being called however, it will make implementation very complex for a simple use case
64
+ * @param index Index of the item being reported
65
+ */
66
+ GridLayoutProviderWithProps.prototype.reportItemLayout = function (index) {
67
+ var _a;
68
+ var layout = (_a = this.getLayoutManager()) === null || _a === void 0 ? void 0 : _a.getLayouts()[index];
69
+ if (layout) {
70
+ // For the same index we can now return different estimates because average is updated in realtime
71
+ // Marking the layout as overridden will help layout manager avoid using the average after initial measurement
72
+ layout.isOverridden = true;
73
+ this.averageWindow.addValue(this.props.horizontal ? layout.width : layout.height);
74
+ }
75
+ };
76
+ Object.defineProperty(GridLayoutProviderWithProps.prototype, "averageItemSize", {
77
+ get: function () {
78
+ return this.averageWindow.currentValue;
79
+ },
80
+ enumerable: false,
81
+ configurable: true
82
+ });
83
+ GridLayoutProviderWithProps.prototype.newLayoutManager = function (renderWindowSize, isHorizontal, cachedLayouts) {
84
+ var _a;
85
+ // Average window is updated whenever a new layout manager is created. This is because old values are not relevant anymore.
86
+ var estimatedItemCount = Math.max(3, Math.round((this.props.horizontal
87
+ ? renderWindowSize.width
88
+ : renderWindowSize.height) /
89
+ ((_a = this.props.estimatedItemSize) !== null && _a !== void 0 ? _a : this.defaultEstimatedItemSize)));
90
+ this.averageWindow = new AverageWindow_1.AverageWindow(2 * (this.props.numColumns || 1) * estimatedItemCount, this.averageWindow.currentValue);
91
+ var newLayoutManager = _super.prototype.newLayoutManager.call(this, this.getAdjustedRenderWindowSize(renderWindowSize), isHorizontal, cachedLayouts);
92
+ if (cachedLayouts) {
93
+ this.updateCachedDimensions(cachedLayouts, newLayoutManager);
94
+ }
95
+ return newLayoutManager;
96
+ };
97
+ GridLayoutProviderWithProps.prototype.updateCachedDimensions = function (cachedLayouts, layoutManager) {
98
+ var layoutCount = cachedLayouts.length;
99
+ for (var i = 0; i < layoutCount; i++) {
100
+ cachedLayouts[i] = tslib_1.__assign(tslib_1.__assign({}, cachedLayouts[i]), layoutManager.getStyleOverridesForIndex(i));
101
+ }
102
+ };
103
+ GridLayoutProviderWithProps.prototype.getCleanLayoutObj = function () {
104
+ this.layoutObject.size = undefined;
105
+ this.layoutObject.span = undefined;
106
+ return this.layoutObject;
107
+ };
108
+ GridLayoutProviderWithProps.prototype.getAdjustedRenderWindowSize = function (renderWindowSize) {
109
+ return (0, ContentContainerUtils_1.applyContentContainerInsetForLayoutManager)(tslib_1.__assign({}, renderWindowSize), this.props.contentContainerStyle, Boolean(this.props.horizontal));
110
+ };
111
+ return GridLayoutProviderWithProps;
112
+ }(recyclerlistview_1.GridLayoutProvider));
113
+ exports.default = GridLayoutProviderWithProps;
114
+ //# sourceMappingURL=GridLayoutProviderWithProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GridLayoutProviderWithProps.js","sourceRoot":"","sources":["../src/GridLayoutProviderWithProps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import React from "react";
2
+ import { NativeScrollEvent } from "react-native";
3
+ import FlashList from "./FlashList";
4
+ import { FlashListProps, ListRenderItemInfo } from "./FlashListProps";
5
+ export interface MasonryListRenderItemInfo<TItem> extends ListRenderItemInfo<TItem> {
6
+ columnSpan: number;
7
+ columnIndex: number;
8
+ }
9
+ export type MasonryListRenderItem<TItem> = (info: MasonryListRenderItemInfo<TItem>) => React.ReactElement | null;
10
+ export interface MasonryFlashListProps<T> extends Omit<FlashListProps<T>, "horizontal" | "initialScrollIndex" | "inverted" | "onBlankArea" | "renderItem" | "viewabilityConfigCallbackPairs"> {
11
+ /**
12
+ * Allows you to change the column widths of the list. This is helpful if you want some columns to be wider than the others.
13
+ * e.g, if `numColumns` is `3`, you can return `2` for `index 1` and `1` for the rest to achieve a `1:2:1` split by width.
14
+ */
15
+ getColumnFlex?: (items: MasonryListItem<T>[], columnIndex: number, maxColumns: number, extraData?: any) => number;
16
+ /**
17
+ * If enabled, MasonryFlashList will try to reduce difference in column height by modifying item order.
18
+ * `overrideItemLayout` is required to make this work.
19
+ */
20
+ optimizeItemArrangement?: boolean;
21
+ /**
22
+ * Extends typical `renderItem` to include `columnIndex` and `columnSpan` (number of columns the item spans).
23
+ * `columnIndex` gives the consumer column information in case they might need to treat items differently based on column.
24
+ * This information may not otherwise be derived if using the `optimizeItemArrangement` feature, as the items will no
25
+ * longer be linearly distributed across the columns; instead they are allocated to the column with the least estimated height.
26
+ */
27
+ renderItem: MasonryListRenderItem<T> | null | undefined;
28
+ }
29
+ export interface MasonryFlashListScrollEvent extends NativeScrollEvent {
30
+ doNotPropagate?: boolean;
31
+ }
32
+ export interface MasonryListItem<T> {
33
+ originalIndex: number;
34
+ originalItem: T;
35
+ }
36
+ /**
37
+ * MasonryFlashListRef with support for scroll related methods
38
+ */
39
+ export interface MasonryFlashListRef<T> {
40
+ scrollToOffset: FlashList<T>["scrollToOffset"];
41
+ scrollToEnd: FlashList<T>["scrollToEnd"];
42
+ getScrollableNode: FlashList<T>["getScrollableNode"];
43
+ }
44
+ /**
45
+ * FlashList variant that enables rendering of masonry layouts.
46
+ * If you want `MasonryFlashList` to optimize item arrangement, enable `optimizeItemArrangement` and pass a valid `overrideItemLayout` function.
47
+ */
48
+ export declare const MasonryFlashList: <T>(props: MasonryFlashListProps<T> & {
49
+ ref?: React.RefObject<MasonryFlashListRef<T>>;
50
+ }) => React.ReactElement;
51
+ //# sourceMappingURL=MasonryFlashList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MasonryFlashList.d.ts","sourceRoot":"","sources":["../src/MasonryFlashList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,EAKL,iBAAiB,EAElB,MAAM,cAAc,CAAC;AAItB,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAItE,MAAM,WAAW,yBAAyB,CAAC,KAAK,CAC9C,SAAQ,kBAAkB,CAAC,KAAK,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,qBAAqB,CAAC,KAAK,IAAI,CACzC,IAAI,EAAE,yBAAyB,CAAC,KAAK,CAAC,KACnC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;AAE/B,MAAM,WAAW,qBAAqB,CAAC,CAAC,CACtC,SAAQ,IAAI,CACV,cAAc,CAAC,CAAC,CAAC,EACf,YAAY,GACZ,oBAAoB,GACpB,UAAU,GACV,aAAa,GACb,YAAY,GACZ,gCAAgC,CACnC;IACD;;;OAGG;IACH,aAAa,CAAC,EAAE,CACd,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,EAC3B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,GAAG,KACZ,MAAM,CAAC;IAEZ;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;OAKG;IACH,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC;CACzD;AAKD,MAAM,WAAW,2BAA4B,SAAQ,iBAAiB;IACpE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,CAAC,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC/C,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IACzC,iBAAiB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC;CACtD;AAiYD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAgC,CAAC,CAAC,EAC7D,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,GAAG;IAChC,GAAG,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC;CAC/C,KACE,KAAK,CAAC,YAAY,CAAC"}
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MasonryFlashList = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = tslib_1.__importStar(require("react"));
6
+ var react_native_1 = require("react-native");
7
+ var CustomError_1 = tslib_1.__importDefault(require("./errors/CustomError"));
8
+ var ExceptionList_1 = tslib_1.__importDefault(require("./errors/ExceptionList"));
9
+ var FlashList_1 = tslib_1.__importDefault(require("./FlashList"));
10
+ var ContentContainerUtils_1 = require("./utils/ContentContainerUtils");
11
+ var defaultEstimatedItemSize = 100;
12
+ /**
13
+ * FlashList variant that enables rendering of masonry layouts.
14
+ * If you want `MasonryFlashList` to optimize item arrangement, enable `optimizeItemArrangement` and pass a valid `overrideItemLayout` function.
15
+ */
16
+ var MasonryFlashListComponent = react_1.default.forwardRef(function (
17
+ /**
18
+ * Forward Ref will force cast generic parament T to unknown. Export has a explicit cast to solve this.
19
+ */
20
+ props, forwardRef) {
21
+ var _a, _b, _c, _d, _e;
22
+ var columnCount = props.numColumns || 1;
23
+ var drawDistance = props.drawDistance;
24
+ var estimatedListSize = (_b = (_a = props.estimatedListSize) !== null && _a !== void 0 ? _a : react_native_1.Dimensions.get("window")) !== null && _b !== void 0 ? _b : { height: 500, width: 500 };
25
+ if (props.optimizeItemArrangement && !props.overrideItemLayout) {
26
+ throw new CustomError_1.default(ExceptionList_1.default.overrideItemLayoutRequiredForMasonryOptimization);
27
+ }
28
+ var dataSet = useDataSet(columnCount, Boolean(props.optimizeItemArrangement), props.data, props.overrideItemLayout, props.extraData);
29
+ var totalColumnFlex = useTotalColumnFlex(dataSet, props);
30
+ var propsRef = (0, react_1.useRef)(props);
31
+ propsRef.current = props;
32
+ var onScrollRef = (0, react_1.useRef)([]);
33
+ var emptyScrollEvent = (0, react_1.useRef)(getEmptyScrollEvent())
34
+ .current;
35
+ var ScrollComponent = (0, react_1.useRef)(getFlashListScrollView(onScrollRef, function () {
36
+ var _a;
37
+ return (((_a = getListRenderedSize(parentFlashList)) === null || _a === void 0 ? void 0 : _a.height) ||
38
+ estimatedListSize.height);
39
+ })).current;
40
+ var onScrollProxy = (0, react_1.useRef)(function (scrollEvent) {
41
+ var _a, _b, _c, _d, _e;
42
+ emptyScrollEvent.nativeEvent.contentOffset.y =
43
+ scrollEvent.nativeEvent.contentOffset.y -
44
+ ((_b = (_a = parentFlashList.current) === null || _a === void 0 ? void 0 : _a.firstItemOffset) !== null && _b !== void 0 ? _b : 0);
45
+ (_c = onScrollRef.current) === null || _c === void 0 ? void 0 : _c.forEach(function (onScrollCallback) {
46
+ onScrollCallback === null || onScrollCallback === void 0 ? void 0 : onScrollCallback(emptyScrollEvent);
47
+ });
48
+ if (!scrollEvent.nativeEvent.doNotPropagate) {
49
+ (_e = (_d = propsRef.current).onScroll) === null || _e === void 0 ? void 0 : _e.call(_d, scrollEvent);
50
+ }
51
+ }).current;
52
+ /**
53
+ * We're triggering an onScroll on internal lists so that they register the correct offset which is offset - header size.
54
+ * This will make sure viewability callbacks are triggered correctly.
55
+ * 32 ms is equal to two frames at 60 fps. Faster framerates will not cause any problems.
56
+ */
57
+ var onLoadForNestedLists = (0, react_1.useRef)(function (args) {
58
+ var _a, _b;
59
+ setTimeout(function () {
60
+ emptyScrollEvent.nativeEvent.doNotPropagate = true;
61
+ onScrollProxy === null || onScrollProxy === void 0 ? void 0 : onScrollProxy(emptyScrollEvent);
62
+ emptyScrollEvent.nativeEvent.doNotPropagate = false;
63
+ }, 32);
64
+ (_b = (_a = propsRef.current).onLoad) === null || _b === void 0 ? void 0 : _b.call(_a, args);
65
+ }).current;
66
+ var _f = tslib_1.__read(useRefWithForwardRef(forwardRef), 2), parentFlashList = _f[0], getFlashList = _f[1];
67
+ var renderItem = props.renderItem, getItemType = props.getItemType, getColumnFlex = props.getColumnFlex, overrideItemLayout = props.overrideItemLayout, viewabilityConfig = props.viewabilityConfig, keyExtractor = props.keyExtractor, onLoad = props.onLoad, onViewableItemsChanged = props.onViewableItemsChanged, data = props.data, stickyHeaderIndices = props.stickyHeaderIndices, CellRendererComponent = props.CellRendererComponent, ItemSeparatorComponent = props.ItemSeparatorComponent, remainingProps = tslib_1.__rest(props, ["renderItem", "getItemType", "getColumnFlex", "overrideItemLayout", "viewabilityConfig", "keyExtractor", "onLoad", "onViewableItemsChanged", "data", "stickyHeaderIndices", "CellRendererComponent", "ItemSeparatorComponent"]);
68
+ var firstColumnHeight = ((_d = (_c = dataSet[0]) === null || _c === void 0 ? void 0 : _c.length) !== null && _d !== void 0 ? _d : 0) *
69
+ ((_e = props.estimatedItemSize) !== null && _e !== void 0 ? _e : defaultEstimatedItemSize);
70
+ var insetForLayoutManager = (0, ContentContainerUtils_1.applyContentContainerInsetForLayoutManager)({ height: 0, width: 0 }, props.contentContainerStyle, false);
71
+ return (react_1.default.createElement(FlashList_1.default, tslib_1.__assign({ ref: getFlashList }, remainingProps, { horizontal: false, numColumns: columnCount, data: dataSet, onScroll: onScrollProxy, estimatedItemSize: firstColumnHeight || estimatedListSize.height, renderItem: function (args) {
72
+ var _a, _b;
73
+ return (react_1.default.createElement(FlashList_1.default, { renderScrollComponent: ScrollComponent, estimatedItemSize: props.estimatedItemSize, data: args.item, onLoad: args.index === 0 ? onLoadForNestedLists : undefined, renderItem: function (innerArgs) {
74
+ var _a;
75
+ return ((_a = renderItem === null || renderItem === void 0 ? void 0 : renderItem(tslib_1.__assign(tslib_1.__assign({}, innerArgs), { item: innerArgs.item.originalItem, index: innerArgs.item.originalIndex, columnSpan: 1, columnIndex: args.index }))) !== null && _a !== void 0 ? _a : null);
76
+ }, keyExtractor: keyExtractor
77
+ ? function (item, _) {
78
+ return keyExtractor === null || keyExtractor === void 0 ? void 0 : keyExtractor(item.originalItem, item.originalIndex);
79
+ }
80
+ : undefined, getItemType: getItemType
81
+ ? function (item, _, extraData) {
82
+ return getItemType === null || getItemType === void 0 ? void 0 : getItemType(item.originalItem, item.originalIndex, extraData);
83
+ }
84
+ : undefined, drawDistance: drawDistance, estimatedListSize: {
85
+ height: estimatedListSize.height,
86
+ width: (((((_a = getListRenderedSize(parentFlashList)) === null || _a === void 0 ? void 0 : _a.width) ||
87
+ estimatedListSize.width) +
88
+ insetForLayoutManager.width) /
89
+ totalColumnFlex) *
90
+ ((_b = getColumnFlex === null || getColumnFlex === void 0 ? void 0 : getColumnFlex(args.item, args.index, columnCount, props.extraData)) !== null && _b !== void 0 ? _b : 1),
91
+ }, extraData: props.extraData, CellRendererComponent: CellRendererComponent, ItemSeparatorComponent: ItemSeparatorComponent, viewabilityConfig: viewabilityConfig, onViewableItemsChanged: onViewableItemsChanged
92
+ ? function (info) {
93
+ updateViewTokens(info.viewableItems);
94
+ updateViewTokens(info.changed);
95
+ onViewableItemsChanged === null || onViewableItemsChanged === void 0 ? void 0 : onViewableItemsChanged(info);
96
+ }
97
+ : undefined, overrideItemLayout: overrideItemLayout
98
+ ? function (layout, item, _, __, extraData) {
99
+ overrideItemLayout === null || overrideItemLayout === void 0 ? void 0 : overrideItemLayout(layout, item.originalItem, item.originalIndex, columnCount, extraData);
100
+ layout.span = undefined;
101
+ }
102
+ : undefined }));
103
+ }, overrideItemLayout: getColumnFlex
104
+ ? function (layout, item, index, maxColumns, extraData) {
105
+ layout.span =
106
+ (columnCount *
107
+ getColumnFlex(item, index, maxColumns, extraData)) /
108
+ totalColumnFlex;
109
+ }
110
+ : undefined })));
111
+ });
112
+ /**
113
+ * Splits data for each column's FlashList
114
+ */
115
+ var useDataSet = function (columnCount, optimizeItemArrangement, sourceData, overrideItemLayout, extraData) {
116
+ return (0, react_1.useMemo)(function () {
117
+ var _a;
118
+ if (!sourceData || sourceData.length === 0) {
119
+ return [];
120
+ }
121
+ var columnHeightTracker = new Array(columnCount).fill(0);
122
+ var layoutObject = { size: undefined };
123
+ var dataSet = new Array(columnCount);
124
+ var dataSize = sourceData.length;
125
+ for (var i = 0; i < columnCount; i++) {
126
+ dataSet[i] = [];
127
+ }
128
+ for (var i = 0; i < dataSize; i++) {
129
+ var nextColumnIndex = i % columnCount;
130
+ if (optimizeItemArrangement) {
131
+ for (var j = 0; j < columnCount; j++) {
132
+ if (columnHeightTracker[j] < columnHeightTracker[nextColumnIndex]) {
133
+ nextColumnIndex = j;
134
+ }
135
+ }
136
+ // update height of column
137
+ layoutObject.size = undefined;
138
+ overrideItemLayout(layoutObject, sourceData[i], i, columnCount, extraData);
139
+ columnHeightTracker[nextColumnIndex] +=
140
+ (_a = layoutObject.size) !== null && _a !== void 0 ? _a : defaultEstimatedItemSize;
141
+ }
142
+ dataSet[nextColumnIndex].push({
143
+ originalItem: sourceData[i],
144
+ originalIndex: i,
145
+ });
146
+ }
147
+ return dataSet;
148
+ // eslint-disable-next-line react-hooks/exhaustive-deps
149
+ }, [sourceData, columnCount, optimizeItemArrangement, extraData]);
150
+ };
151
+ var useTotalColumnFlex = function (dataSet, props) {
152
+ return (0, react_1.useMemo)(function () {
153
+ var columnCount = props.numColumns || 1;
154
+ if (!props.getColumnFlex) {
155
+ return columnCount;
156
+ }
157
+ var totalFlexSum = 0;
158
+ var dataSize = dataSet.length;
159
+ for (var i = 0; i < dataSize; i++) {
160
+ totalFlexSum += props.getColumnFlex(dataSet[i], i, columnCount, props.extraData);
161
+ }
162
+ return totalFlexSum;
163
+ // eslint-disable-next-line react-hooks/exhaustive-deps
164
+ }, [dataSet, props.getColumnFlex, props.extraData]);
165
+ };
166
+ /**
167
+ * Handle both function refs and refs with current property
168
+ */
169
+ var useRefWithForwardRef = function (forwardRef) {
170
+ var ref = (0, react_1.useRef)(null);
171
+ return [
172
+ ref,
173
+ (0, react_1.useCallback)(function (instance) {
174
+ ref.current = instance;
175
+ if (typeof forwardRef === "function") {
176
+ forwardRef(instance);
177
+ }
178
+ else if (forwardRef) {
179
+ forwardRef.current = instance;
180
+ }
181
+ }, [forwardRef]),
182
+ ];
183
+ };
184
+ /**
185
+ * This ScrollView is actually just a view mimicking a scrollview. We block the onScroll event from being passed to the parent list directly.
186
+ * We manually drive onScroll from the parent and thus, achieve recycling.
187
+ */
188
+ var getFlashListScrollView = function (onScrollRef, getParentHeight) {
189
+ var FlashListScrollView = react_1.default.forwardRef(function (props, ref) {
190
+ var onLayout = props.onLayout, onScroll = props.onScroll, rest = tslib_1.__rest(props, ["onLayout", "onScroll"]);
191
+ var onLayoutProxy = (0, react_1.useCallback)(function (layoutEvent) {
192
+ onLayout === null || onLayout === void 0 ? void 0 : onLayout({
193
+ nativeEvent: {
194
+ layout: {
195
+ height: getParentHeight(),
196
+ width: layoutEvent.nativeEvent.layout.width,
197
+ },
198
+ },
199
+ });
200
+ }, [onLayout]);
201
+ (0, react_1.useEffect)(function () {
202
+ var _a;
203
+ if (onScroll) {
204
+ (_a = onScrollRef.current) === null || _a === void 0 ? void 0 : _a.push(onScroll);
205
+ }
206
+ return function () {
207
+ if (!onScrollRef.current || !onScroll) {
208
+ return;
209
+ }
210
+ var indexToDelete = onScrollRef.current.indexOf(onScroll);
211
+ if (indexToDelete > -1) {
212
+ onScrollRef.current.splice(indexToDelete, 1);
213
+ }
214
+ };
215
+ }, [onScroll]);
216
+ return react_1.default.createElement(react_native_1.View, tslib_1.__assign({ ref: ref }, rest, { onLayout: onLayoutProxy }));
217
+ });
218
+ FlashListScrollView.displayName = "FlashListScrollView";
219
+ return FlashListScrollView;
220
+ };
221
+ var updateViewTokens = function (tokens) {
222
+ var length = tokens.length;
223
+ for (var i = 0; i < length; i++) {
224
+ var token = tokens[i];
225
+ if (token.index !== null && token.index !== undefined) {
226
+ if (token.item) {
227
+ token.index = token.item.originalIndex;
228
+ token.item = token.item.originalItem;
229
+ }
230
+ else {
231
+ token.index = null;
232
+ token.item = undefined;
233
+ }
234
+ }
235
+ }
236
+ };
237
+ var getEmptyScrollEvent = function () {
238
+ return {
239
+ nativeEvent: { contentOffset: { y: 0, x: 0 } },
240
+ };
241
+ };
242
+ var getListRenderedSize = function (parentFlashList) {
243
+ var _a, _b;
244
+ return (_b = (_a = parentFlashList === null || parentFlashList === void 0 ? void 0 : parentFlashList.current) === null || _a === void 0 ? void 0 : _a.recyclerlistview_unsafe) === null || _b === void 0 ? void 0 : _b.getRenderedSize();
245
+ };
246
+ MasonryFlashListComponent.displayName = "MasonryFlashList";
247
+ /**
248
+ * FlashList variant that enables rendering of masonry layouts.
249
+ * If you want `MasonryFlashList` to optimize item arrangement, enable `optimizeItemArrangement` and pass a valid `overrideItemLayout` function.
250
+ */
251
+ exports.MasonryFlashList = MasonryFlashListComponent;
252
+ //# sourceMappingURL=MasonryFlashList.js.map