@shopify/flash-list 2.0.4-alpha.1 → 2.2.0

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 (203) hide show
  1. package/dist/AnimatedFlashList.js +4 -6
  2. package/dist/AnimatedFlashList.js.map +1 -1
  3. package/dist/FlashList.js +1 -5
  4. package/dist/FlashList.js.map +1 -1
  5. package/dist/FlashListProps.d.ts +41 -1
  6. package/dist/FlashListProps.d.ts.map +1 -1
  7. package/dist/FlashListProps.js +1 -4
  8. package/dist/FlashListProps.js.map +1 -1
  9. package/dist/FlashListRef.js +1 -2
  10. package/dist/benchmark/AutoScrollHelper.js +22 -30
  11. package/dist/benchmark/AutoScrollHelper.js.map +1 -1
  12. package/dist/benchmark/JSFPSMonitor.js +27 -33
  13. package/dist/benchmark/JSFPSMonitor.js.map +1 -1
  14. package/dist/benchmark/roundToDecimalPlaces.js +2 -5
  15. package/dist/benchmark/roundToDecimalPlaces.js.map +1 -1
  16. package/dist/benchmark/useBenchmark.d.ts +9 -1
  17. package/dist/benchmark/useBenchmark.d.ts.map +1 -1
  18. package/dist/benchmark/useBenchmark.js +86 -95
  19. package/dist/benchmark/useBenchmark.js.map +1 -1
  20. package/dist/benchmark/useDataMultiplier.js +6 -10
  21. package/dist/benchmark/useDataMultiplier.js.map +1 -1
  22. package/dist/benchmark/useFlatListBenchmark.d.ts +4 -1
  23. package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -1
  24. package/dist/benchmark/useFlatListBenchmark.js +73 -81
  25. package/dist/benchmark/useFlatListBenchmark.js.map +1 -1
  26. package/dist/errors/ErrorMessages.js +1 -4
  27. package/dist/errors/ErrorMessages.js.map +1 -1
  28. package/dist/errors/WarningMessages.js +1 -4
  29. package/dist/errors/WarningMessages.js.map +1 -1
  30. package/dist/index.js +17 -35
  31. package/dist/index.js.map +1 -1
  32. package/dist/isNewArch.js +6 -9
  33. package/dist/isNewArch.js.map +1 -1
  34. package/dist/native/config/PlatformHelper.android.js +2 -5
  35. package/dist/native/config/PlatformHelper.android.js.map +1 -1
  36. package/dist/native/config/PlatformHelper.ios.js +2 -5
  37. package/dist/native/config/PlatformHelper.ios.js.map +1 -1
  38. package/dist/native/config/PlatformHelper.js +2 -5
  39. package/dist/native/config/PlatformHelper.js.map +1 -1
  40. package/dist/native/config/PlatformHelper.web.js +2 -5
  41. package/dist/native/config/PlatformHelper.web.js.map +1 -1
  42. package/dist/recyclerview/LayoutCommitObserver.js +20 -24
  43. package/dist/recyclerview/LayoutCommitObserver.js.map +1 -1
  44. package/dist/recyclerview/RecyclerView.d.ts.map +1 -1
  45. package/dist/recyclerview/RecyclerView.js +134 -111
  46. package/dist/recyclerview/RecyclerView.js.map +1 -1
  47. package/dist/recyclerview/RecyclerViewContextProvider.js +7 -12
  48. package/dist/recyclerview/RecyclerViewContextProvider.js.map +1 -1
  49. package/dist/recyclerview/RecyclerViewManager.js +138 -167
  50. package/dist/recyclerview/RecyclerViewManager.js.map +1 -1
  51. package/dist/recyclerview/RecyclerViewProps.js +1 -2
  52. package/dist/recyclerview/RenderStackManager.js +97 -188
  53. package/dist/recyclerview/RenderStackManager.js.map +1 -1
  54. package/dist/recyclerview/ViewHolder.d.ts +2 -0
  55. package/dist/recyclerview/ViewHolder.d.ts.map +1 -1
  56. package/dist/recyclerview/ViewHolder.js +19 -21
  57. package/dist/recyclerview/ViewHolder.js.map +1 -1
  58. package/dist/recyclerview/ViewHolderCollection.d.ts +4 -0
  59. package/dist/recyclerview/ViewHolderCollection.d.ts.map +1 -1
  60. package/dist/recyclerview/ViewHolderCollection.js +26 -30
  61. package/dist/recyclerview/ViewHolderCollection.js.map +1 -1
  62. package/dist/recyclerview/components/CompatScroller.js +6 -7
  63. package/dist/recyclerview/components/CompatScroller.js.map +1 -1
  64. package/dist/recyclerview/components/CompatView.js +6 -7
  65. package/dist/recyclerview/components/CompatView.js.map +1 -1
  66. package/dist/recyclerview/components/ScrollAnchor.js +10 -15
  67. package/dist/recyclerview/components/ScrollAnchor.js.map +1 -1
  68. package/dist/recyclerview/components/StickyHeaders.d.ts +5 -1
  69. package/dist/recyclerview/components/StickyHeaders.d.ts.map +1 -1
  70. package/dist/recyclerview/components/StickyHeaders.js +77 -51
  71. package/dist/recyclerview/components/StickyHeaders.js.map +1 -1
  72. package/dist/recyclerview/helpers/ConsecutiveNumbers.js +39 -66
  73. package/dist/recyclerview/helpers/ConsecutiveNumbers.js.map +1 -1
  74. package/dist/recyclerview/helpers/EngagedIndicesTracker.js +57 -63
  75. package/dist/recyclerview/helpers/EngagedIndicesTracker.js.map +1 -1
  76. package/dist/recyclerview/helpers/RenderTimeTracker.js +19 -24
  77. package/dist/recyclerview/helpers/RenderTimeTracker.js.map +1 -1
  78. package/dist/recyclerview/helpers/VelocityTracker.js +16 -22
  79. package/dist/recyclerview/helpers/VelocityTracker.js.map +1 -1
  80. package/dist/recyclerview/hooks/useBoundDetection.js +37 -40
  81. package/dist/recyclerview/hooks/useBoundDetection.js.map +1 -1
  82. package/dist/recyclerview/hooks/useLayoutState.js +9 -15
  83. package/dist/recyclerview/hooks/useLayoutState.js.map +1 -1
  84. package/dist/recyclerview/hooks/useMappingHelper.js +6 -10
  85. package/dist/recyclerview/hooks/useMappingHelper.js.map +1 -1
  86. package/dist/recyclerview/hooks/useOnLoad.js +16 -22
  87. package/dist/recyclerview/hooks/useOnLoad.js.map +1 -1
  88. package/dist/recyclerview/hooks/useRecyclerViewController.d.ts.map +1 -1
  89. package/dist/recyclerview/hooks/useRecyclerViewController.js +169 -188
  90. package/dist/recyclerview/hooks/useRecyclerViewController.js.map +1 -1
  91. package/dist/recyclerview/hooks/useRecyclerViewManager.js +12 -17
  92. package/dist/recyclerview/hooks/useRecyclerViewManager.js.map +1 -1
  93. package/dist/recyclerview/hooks/useRecyclingState.js +10 -14
  94. package/dist/recyclerview/hooks/useRecyclingState.js.map +1 -1
  95. package/dist/recyclerview/hooks/useSecondaryProps.d.ts +2 -0
  96. package/dist/recyclerview/hooks/useSecondaryProps.d.ts.map +1 -1
  97. package/dist/recyclerview/hooks/useSecondaryProps.js +39 -30
  98. package/dist/recyclerview/hooks/useSecondaryProps.js.map +1 -1
  99. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js +17 -22
  100. package/dist/recyclerview/hooks/useUnmountAwareCallbacks.js.map +1 -1
  101. package/dist/recyclerview/hooks/useUnmountFlag.js +5 -9
  102. package/dist/recyclerview/hooks/useUnmountFlag.js.map +1 -1
  103. package/dist/recyclerview/layout-managers/GridLayoutManager.js +61 -80
  104. package/dist/recyclerview/layout-managers/GridLayoutManager.js.map +1 -1
  105. package/dist/recyclerview/layout-managers/LayoutManager.js +83 -123
  106. package/dist/recyclerview/layout-managers/LayoutManager.js.map +1 -1
  107. package/dist/recyclerview/layout-managers/LinearLayoutManager.js +51 -91
  108. package/dist/recyclerview/layout-managers/LinearLayoutManager.js.map +1 -1
  109. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js +77 -96
  110. package/dist/recyclerview/layout-managers/MasonryLayoutManager.js.map +1 -1
  111. package/dist/recyclerview/utils/adjustOffsetForRTL.js +1 -4
  112. package/dist/recyclerview/utils/adjustOffsetForRTL.js.map +1 -1
  113. package/dist/recyclerview/utils/componentUtils.js +4 -9
  114. package/dist/recyclerview/utils/componentUtils.js.map +1 -1
  115. package/dist/recyclerview/utils/findVisibleIndex.js +9 -13
  116. package/dist/recyclerview/utils/findVisibleIndex.js.map +1 -1
  117. package/dist/recyclerview/utils/measureLayout.js +12 -20
  118. package/dist/recyclerview/utils/measureLayout.js.map +1 -1
  119. package/dist/recyclerview/utils/measureLayout.web.js +15 -23
  120. package/dist/recyclerview/utils/measureLayout.web.js.map +1 -1
  121. package/dist/recyclerview/viewability/ViewToken.js +1 -2
  122. package/dist/recyclerview/viewability/ViewabilityHelper.js +34 -41
  123. package/dist/recyclerview/viewability/ViewabilityHelper.js.map +1 -1
  124. package/dist/recyclerview/viewability/ViewabilityManager.js +48 -61
  125. package/dist/recyclerview/viewability/ViewabilityManager.js.map +1 -1
  126. package/dist/tsconfig.tsbuildinfo +1 -1
  127. package/dist/utils/AverageWindow.js +28 -39
  128. package/dist/utils/AverageWindow.js.map +1 -1
  129. package/package.json +4 -6
  130. package/src/FlashListProps.ts +51 -1
  131. package/src/benchmark/useBenchmark.ts +47 -4
  132. package/src/benchmark/useFlatListBenchmark.ts +38 -5
  133. package/src/recyclerview/RecyclerView.tsx +42 -8
  134. package/src/recyclerview/ViewHolder.tsx +6 -1
  135. package/src/recyclerview/ViewHolderCollection.tsx +10 -0
  136. package/src/recyclerview/components/StickyHeaders.tsx +54 -13
  137. package/src/recyclerview/hooks/useRecyclerViewController.tsx +7 -4
  138. package/src/recyclerview/hooks/useSecondaryProps.tsx +23 -0
  139. package/dist/__tests__/AverageWindow.test.d.ts +0 -2
  140. package/dist/__tests__/AverageWindow.test.d.ts.map +0 -1
  141. package/dist/__tests__/AverageWindow.test.js +0 -104
  142. package/dist/__tests__/AverageWindow.test.js.map +0 -1
  143. package/dist/__tests__/ConsecutiveNumbers.test.d.ts +0 -2
  144. package/dist/__tests__/ConsecutiveNumbers.test.d.ts.map +0 -1
  145. package/dist/__tests__/ConsecutiveNumbers.test.js +0 -224
  146. package/dist/__tests__/ConsecutiveNumbers.test.js.map +0 -1
  147. package/dist/__tests__/GridLayoutManager.test.d.ts +0 -2
  148. package/dist/__tests__/GridLayoutManager.test.d.ts.map +0 -1
  149. package/dist/__tests__/GridLayoutManager.test.js +0 -69
  150. package/dist/__tests__/GridLayoutManager.test.js.map +0 -1
  151. package/dist/__tests__/LayoutCommitObserver.test.d.ts +0 -2
  152. package/dist/__tests__/LayoutCommitObserver.test.d.ts.map +0 -1
  153. package/dist/__tests__/LayoutCommitObserver.test.js +0 -37
  154. package/dist/__tests__/LayoutCommitObserver.test.js.map +0 -1
  155. package/dist/__tests__/LinearLayoutManager.test.d.ts +0 -2
  156. package/dist/__tests__/LinearLayoutManager.test.d.ts.map +0 -1
  157. package/dist/__tests__/LinearLayoutManager.test.js +0 -140
  158. package/dist/__tests__/LinearLayoutManager.test.js.map +0 -1
  159. package/dist/__tests__/MasonryLayoutManager.test.d.ts +0 -2
  160. package/dist/__tests__/MasonryLayoutManager.test.d.ts.map +0 -1
  161. package/dist/__tests__/MasonryLayoutManager.test.js +0 -148
  162. package/dist/__tests__/MasonryLayoutManager.test.js.map +0 -1
  163. package/dist/__tests__/RecyclerView.test.d.ts +0 -2
  164. package/dist/__tests__/RecyclerView.test.d.ts.map +0 -1
  165. package/dist/__tests__/RecyclerView.test.js +0 -103
  166. package/dist/__tests__/RecyclerView.test.js.map +0 -1
  167. package/dist/__tests__/RecyclerViewManager.test.d.ts +0 -2
  168. package/dist/__tests__/RecyclerViewManager.test.d.ts.map +0 -1
  169. package/dist/__tests__/RecyclerViewManager.test.js +0 -56
  170. package/dist/__tests__/RecyclerViewManager.test.js.map +0 -1
  171. package/dist/__tests__/RenderStackManager.test.d.ts +0 -2
  172. package/dist/__tests__/RenderStackManager.test.d.ts.map +0 -1
  173. package/dist/__tests__/RenderStackManager.test.js +0 -485
  174. package/dist/__tests__/RenderStackManager.test.js.map +0 -1
  175. package/dist/__tests__/ViewabilityHelper.test.d.ts +0 -2
  176. package/dist/__tests__/ViewabilityHelper.test.d.ts.map +0 -1
  177. package/dist/__tests__/ViewabilityHelper.test.js +0 -186
  178. package/dist/__tests__/ViewabilityHelper.test.js.map +0 -1
  179. package/dist/__tests__/findVisibleIndex.test.d.ts +0 -2
  180. package/dist/__tests__/findVisibleIndex.test.d.ts.map +0 -1
  181. package/dist/__tests__/findVisibleIndex.test.js +0 -259
  182. package/dist/__tests__/findVisibleIndex.test.js.map +0 -1
  183. package/dist/__tests__/helpers/createLayoutManager.d.ts +0 -34
  184. package/dist/__tests__/helpers/createLayoutManager.d.ts.map +0 -1
  185. package/dist/__tests__/helpers/createLayoutManager.js +0 -110
  186. package/dist/__tests__/helpers/createLayoutManager.js.map +0 -1
  187. package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts +0 -2
  188. package/dist/__tests__/useUnmountAwareCallbacks.test.d.ts.map +0 -1
  189. package/dist/__tests__/useUnmountAwareCallbacks.test.js +0 -185
  190. package/dist/__tests__/useUnmountAwareCallbacks.test.js.map +0 -1
  191. package/src/__tests__/AverageWindow.test.ts +0 -128
  192. package/src/__tests__/ConsecutiveNumbers.test.ts +0 -232
  193. package/src/__tests__/GridLayoutManager.test.ts +0 -113
  194. package/src/__tests__/LayoutCommitObserver.test.tsx +0 -63
  195. package/src/__tests__/LinearLayoutManager.test.ts +0 -227
  196. package/src/__tests__/MasonryLayoutManager.test.ts +0 -202
  197. package/src/__tests__/RecyclerView.test.tsx +0 -144
  198. package/src/__tests__/RecyclerViewManager.test.ts +0 -74
  199. package/src/__tests__/RenderStackManager.test.ts +0 -574
  200. package/src/__tests__/ViewabilityHelper.test.ts +0 -282
  201. package/src/__tests__/findVisibleIndex.test.ts +0 -369
  202. package/src/__tests__/helpers/createLayoutManager.ts +0 -141
  203. package/src/__tests__/useUnmountAwareCallbacks.test.tsx +0 -285
@@ -1,144 +0,0 @@
1
- import React, { createRef } from "react";
2
- import { Text } from "react-native";
3
- import "@quilted/react-testing/matchers";
4
- import { render } from "@quilted/react-testing";
5
-
6
- import { FlashListRef } from "../FlashListRef";
7
- import { FlashList } from "..";
8
-
9
- // Mock measureLayout to return fixed dimensions
10
- jest.mock("../recyclerview/utils/measureLayout", () => {
11
- const originalModule = jest.requireActual(
12
- "../recyclerview/utils/measureLayout"
13
- );
14
- return {
15
- ...originalModule,
16
- measureParentSize: jest.fn().mockImplementation(() => ({
17
- x: 0,
18
- y: 0,
19
- width: 399,
20
- height: 899,
21
- })),
22
- measureFirstChildLayout: jest.fn().mockImplementation(() => ({
23
- x: 0,
24
- y: 0,
25
- width: 399,
26
- height: 899,
27
- })),
28
- measureItemLayout: jest.fn().mockImplementation(() => ({
29
- x: 0,
30
- y: 0,
31
- width: 100,
32
- height: 100,
33
- })),
34
- };
35
- });
36
-
37
- const renderRecyclerView = (args: {
38
- numColumns?: number;
39
- masonry?: boolean;
40
- horizontal?: boolean;
41
- ref?: React.Ref<FlashListRef<number>>;
42
- data?: number[];
43
- }) => {
44
- const {
45
- numColumns = 1,
46
- masonry = false,
47
- horizontal = false,
48
- ref,
49
- data,
50
- } = args;
51
- return render(
52
- <FlashList
53
- ref={ref}
54
- data={
55
- data ?? [
56
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
57
- ]
58
- }
59
- masonry={masonry}
60
- overrideProps={{ initialDrawBatchSize: 1 }}
61
- drawDistance={0}
62
- numColumns={numColumns}
63
- horizontal={horizontal}
64
- renderItem={({ item }) => <Text>{item}</Text>}
65
- />
66
- );
67
- };
68
-
69
- describe("RecyclerView", () => {
70
- beforeEach(() => {
71
- jest.clearAllMocks();
72
- jest.useFakeTimers();
73
- });
74
- describe("Linear Layout", () => {
75
- it("renders items ", () => {
76
- const result = renderRecyclerView({});
77
-
78
- expect(result).toContainReactComponent(Text, { children: 0 });
79
- expect(result).not.toContainReactComponent(Text, { children: 11 });
80
- });
81
- });
82
-
83
- describe("Masonry Layout", () => {
84
- it("renders items with masonry", () => {
85
- const result = renderRecyclerView({ masonry: true });
86
-
87
- expect(result).toContainReactComponent(Text, { children: 0 });
88
- });
89
- it("should not render item 18, 19 with numColumns 2", () => {
90
- const result = renderRecyclerView({ numColumns: 2, masonry: true });
91
-
92
- expect(result).toContainReactComponent(Text, {
93
- children: 17,
94
- });
95
- expect(result).not.toContainReactComponent(Text, {
96
- children: 18,
97
- });
98
-
99
- expect(result).not.toContainReactComponent(Text, {
100
- children: 19,
101
- });
102
- });
103
- });
104
-
105
- describe("Grid Layout", () => {
106
- it("renders items with numColumns 2", () => {
107
- const result = renderRecyclerView({ numColumns: 2 });
108
-
109
- expect(result).toContainReactComponent(Text, { children: 0 });
110
- });
111
- it("should not render item 18, 19 with numColumns 2", () => {
112
- const result = renderRecyclerView({ numColumns: 2 });
113
-
114
- expect(result).toContainReactComponent(Text, {
115
- children: 17,
116
- });
117
- expect(result).not.toContainReactComponent(Text, {
118
- children: 18,
119
- });
120
-
121
- expect(result).not.toContainReactComponent(Text, {
122
- children: 19,
123
- });
124
- });
125
- });
126
-
127
- describe("Horizontal Layout", () => {
128
- it("renders items with horizontal", () => {
129
- const result = renderRecyclerView({ horizontal: true });
130
-
131
- expect(result).toContainReactComponent(Text, { children: 0 });
132
- expect(result).not.toContainReactComponent(Text, { children: 4 });
133
- });
134
- });
135
-
136
- describe("RecyclerView ref", () => {
137
- it("check if ref has updated props after re-renders", () => {
138
- const ref = createRef<FlashListRef<number>>();
139
- const result = renderRecyclerView({ ref, data: [0, 1, 2] });
140
- result.setProps({ data: [0, 1, 2, 3] });
141
- expect(ref.current?.props.data).toEqual([0, 1, 2, 3]);
142
- });
143
- });
144
- });
@@ -1,74 +0,0 @@
1
- import { RecyclerViewManager } from "../recyclerview/RecyclerViewManager";
2
- import { WarningMessages } from "../errors/WarningMessages";
3
- import { FlashListProps } from "../FlashListProps";
4
-
5
- describe("RecyclerViewManager", () => {
6
- let consoleWarnSpy: jest.SpyInstance;
7
-
8
- beforeEach(() => {
9
- consoleWarnSpy = jest.spyOn(console, "warn").mockImplementation();
10
- });
11
-
12
- afterEach(() => {
13
- consoleWarnSpy.mockRestore();
14
- });
15
-
16
- describe("keyExtractor warning with maintainVisibleContentPosition", () => {
17
- const createMockProps = (overrides = {}) =>
18
- ({
19
- data: [{ id: 1 }, { id: 2 }, { id: 3 }],
20
- renderItem: jest.fn(),
21
- ...overrides,
22
- } as FlashListProps<unknown>);
23
-
24
- const createManager = (props: FlashListProps<unknown>) => {
25
- return new RecyclerViewManager(props);
26
- };
27
-
28
- it("should warn when onStartReached is defined but keyExtractor is not", () => {
29
- const props = createMockProps({
30
- onStartReached: jest.fn(),
31
- keyExtractor: undefined,
32
- });
33
-
34
- createManager(props);
35
-
36
- expect(consoleWarnSpy).toHaveBeenCalledWith(
37
- WarningMessages.keyExtractorNotDefinedForMVCP
38
- );
39
- });
40
-
41
- it("should not warn when both onStartReached and keyExtractor are defined", () => {
42
- const props = createMockProps({
43
- onStartReached: jest.fn(),
44
- keyExtractor: (item: any) => item.id.toString(),
45
- });
46
-
47
- createManager(props);
48
-
49
- expect(consoleWarnSpy).not.toHaveBeenCalled();
50
- });
51
-
52
- it("should not warn when onStartReached is not defined", () => {
53
- const props = createMockProps({
54
- onStartReached: undefined,
55
- keyExtractor: undefined,
56
- });
57
-
58
- createManager(props);
59
-
60
- expect(consoleWarnSpy).not.toHaveBeenCalled();
61
- });
62
-
63
- it("should not warn when onStartReached is not defined but keyExtractor is", () => {
64
- const props = createMockProps({
65
- onStartReached: undefined,
66
- keyExtractor: (item: any) => item.id.toString(),
67
- });
68
-
69
- createManager(props);
70
-
71
- expect(consoleWarnSpy).not.toHaveBeenCalled();
72
- });
73
- });
74
- });