@shopify/flash-list 1.0.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 (206) hide show
  1. package/CHANGELOG.md +159 -0
  2. package/LICENSE.md +7 -0
  3. package/README.md +65 -0
  4. package/RNFlashList.podspec +26 -0
  5. package/android/build.gradle +59 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutShadow.kt +94 -0
  8. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutView.kt +79 -0
  9. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/AutoLayoutViewManager.kt +69 -0
  10. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainer.java +16 -0
  11. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerImpl.kt +16 -0
  12. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/CellContainerManager.kt +27 -0
  13. package/android/src/main/kotlin/com/shopify/reactnative/flash_list/FlashListPackage.kt +19 -0
  14. package/android/src/test/java/com/shopify/reactnative/flash_list/AutoLayoutShadowTest.kt +146 -0
  15. package/android/src/test/java/com/shopify/reactnative/flash_list/models/Rect.kt +59 -0
  16. package/android/src/test/java/com/shopify/reactnative/flash_list/models/TestCollection.kt +6 -0
  17. package/android/src/test/java/com/shopify/reactnative/flash_list/models/TestDataModel.kt +8 -0
  18. package/android/src/test/resources/LayoutTestData.json +708 -0
  19. package/dist/AnimatedFlashList.d.ts +6 -0
  20. package/dist/AnimatedFlashList.d.ts.map +1 -0
  21. package/dist/AnimatedFlashList.js +8 -0
  22. package/dist/AnimatedFlashList.js.map +1 -0
  23. package/dist/FlashList.d.ts +121 -0
  24. package/dist/FlashList.d.ts.map +1 -0
  25. package/dist/FlashList.js +502 -0
  26. package/dist/FlashList.js.map +1 -0
  27. package/dist/FlashListProps.d.ts +251 -0
  28. package/dist/FlashListProps.d.ts.map +1 -0
  29. package/dist/FlashListProps.js +3 -0
  30. package/dist/FlashListProps.js.map +1 -0
  31. package/dist/GridLayoutProviderWithProps.d.ts +30 -0
  32. package/dist/GridLayoutProviderWithProps.d.ts.map +1 -0
  33. package/dist/GridLayoutProviderWithProps.js +80 -0
  34. package/dist/GridLayoutProviderWithProps.js.map +1 -0
  35. package/dist/PureComponentWrapper.d.ts +22 -0
  36. package/dist/PureComponentWrapper.d.ts.map +1 -0
  37. package/dist/PureComponentWrapper.js +37 -0
  38. package/dist/PureComponentWrapper.js.map +1 -0
  39. package/dist/__tests__/AverageWindow.test.d.ts +2 -0
  40. package/dist/__tests__/AverageWindow.test.d.ts.map +1 -0
  41. package/dist/__tests__/AverageWindow.test.js +69 -0
  42. package/dist/__tests__/AverageWindow.test.js.map +1 -0
  43. package/dist/__tests__/FlashList.test.d.ts +2 -0
  44. package/dist/__tests__/FlashList.test.d.ts.map +1 -0
  45. package/dist/__tests__/FlashList.test.js +656 -0
  46. package/dist/__tests__/FlashList.test.js.map +1 -0
  47. package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts +2 -0
  48. package/dist/__tests__/GridLayoutProviderWithProps.test.d.ts.map +1 -0
  49. package/dist/__tests__/GridLayoutProviderWithProps.test.js +133 -0
  50. package/dist/__tests__/GridLayoutProviderWithProps.test.js.map +1 -0
  51. package/dist/__tests__/PlatformHelper.web.test.d.ts +2 -0
  52. package/dist/__tests__/PlatformHelper.web.test.d.ts.map +1 -0
  53. package/dist/__tests__/PlatformHelper.web.test.js +25 -0
  54. package/dist/__tests__/PlatformHelper.web.test.js.map +1 -0
  55. package/dist/__tests__/ViewabilityHelper.test.d.ts +2 -0
  56. package/dist/__tests__/ViewabilityHelper.test.d.ts.map +1 -0
  57. package/dist/__tests__/ViewabilityHelper.test.js +187 -0
  58. package/dist/__tests__/ViewabilityHelper.test.js.map +1 -0
  59. package/dist/__tests__/helpers/mountFlashList.d.ts +20 -0
  60. package/dist/__tests__/helpers/mountFlashList.d.ts.map +1 -0
  61. package/dist/__tests__/helpers/mountFlashList.js +44 -0
  62. package/dist/__tests__/helpers/mountFlashList.js.map +1 -0
  63. package/dist/__tests__/useBlankAreaTracker.test.d.ts +2 -0
  64. package/dist/__tests__/useBlankAreaTracker.test.d.ts.map +1 -0
  65. package/dist/__tests__/useBlankAreaTracker.test.js +179 -0
  66. package/dist/__tests__/useBlankAreaTracker.test.js.map +1 -0
  67. package/dist/benchmark/AutoScrollHelper.d.ts +18 -0
  68. package/dist/benchmark/AutoScrollHelper.d.ts.map +1 -0
  69. package/dist/benchmark/AutoScrollHelper.js +68 -0
  70. package/dist/benchmark/AutoScrollHelper.js.map +1 -0
  71. package/dist/benchmark/JSFPSMonitor.d.ts +23 -0
  72. package/dist/benchmark/JSFPSMonitor.d.ts.map +1 -0
  73. package/dist/benchmark/JSFPSMonitor.js +65 -0
  74. package/dist/benchmark/JSFPSMonitor.js.map +1 -0
  75. package/dist/benchmark/roundToDecimalPlaces.d.ts +2 -0
  76. package/dist/benchmark/roundToDecimalPlaces.d.ts.map +1 -0
  77. package/dist/benchmark/roundToDecimalPlaces.js +9 -0
  78. package/dist/benchmark/roundToDecimalPlaces.js.map +1 -0
  79. package/dist/benchmark/useBenchmark.d.ts +35 -0
  80. package/dist/benchmark/useBenchmark.d.ts.map +1 -0
  81. package/dist/benchmark/useBenchmark.js +167 -0
  82. package/dist/benchmark/useBenchmark.js.map +1 -0
  83. package/dist/benchmark/useBlankAreaTracker.d.ts +34 -0
  84. package/dist/benchmark/useBlankAreaTracker.d.ts.map +1 -0
  85. package/dist/benchmark/useBlankAreaTracker.js +67 -0
  86. package/dist/benchmark/useBlankAreaTracker.js.map +1 -0
  87. package/dist/benchmark/useDataMultiplier.d.ts +9 -0
  88. package/dist/benchmark/useDataMultiplier.d.ts.map +1 -0
  89. package/dist/benchmark/useDataMultiplier.js +25 -0
  90. package/dist/benchmark/useDataMultiplier.js.map +1 -0
  91. package/dist/benchmark/useFlatListBenchmark.d.ts +13 -0
  92. package/dist/benchmark/useFlatListBenchmark.d.ts.map +1 -0
  93. package/dist/benchmark/useFlatListBenchmark.js +100 -0
  94. package/dist/benchmark/useFlatListBenchmark.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 +20 -0
  100. package/dist/errors/ExceptionList.d.ts.map +1 -0
  101. package/dist/errors/ExceptionList.js +22 -0
  102. package/dist/errors/ExceptionList.js.map +1 -0
  103. package/dist/errors/Warnings.d.ts +10 -0
  104. package/dist/errors/Warnings.d.ts.map +1 -0
  105. package/dist/errors/Warnings.js +15 -0
  106. package/dist/errors/Warnings.js.map +1 -0
  107. package/dist/index.d.ts +13 -0
  108. package/dist/index.d.ts.map +1 -0
  109. package/dist/index.js +28 -0
  110. package/dist/index.js.map +1 -0
  111. package/dist/native/auto-layout/AutoLayoutView.d.ts +21 -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.d.ts +4 -0
  116. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.d.ts.map +1 -0
  117. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js +6 -0
  118. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.js.map +1 -0
  119. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.web.d.ts +5 -0
  120. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.web.d.ts.map +1 -0
  121. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.web.js +6 -0
  122. package/dist/native/auto-layout/AutoLayoutViewNativeComponent.web.js.map +1 -0
  123. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts +14 -0
  124. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.d.ts.map +1 -0
  125. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js +3 -0
  126. package/dist/native/auto-layout/AutoLayoutViewNativeComponentProps.js.map +1 -0
  127. package/dist/native/cell-container/CellContainer.d.ts +6 -0
  128. package/dist/native/cell-container/CellContainer.d.ts.map +1 -0
  129. package/dist/native/cell-container/CellContainer.js +9 -0
  130. package/dist/native/cell-container/CellContainer.js.map +1 -0
  131. package/dist/native/cell-container/CellContainer.web.d.ts +7 -0
  132. package/dist/native/cell-container/CellContainer.web.d.ts.map +1 -0
  133. package/dist/native/cell-container/CellContainer.web.js +13 -0
  134. package/dist/native/cell-container/CellContainer.web.js.map +1 -0
  135. package/dist/tsconfig.tsbuildinfo +1 -0
  136. package/dist/utils/AverageWindow.d.ts +21 -0
  137. package/dist/utils/AverageWindow.d.ts.map +1 -0
  138. package/dist/utils/AverageWindow.js +49 -0
  139. package/dist/utils/AverageWindow.js.map +1 -0
  140. package/dist/utils/PlatformHelper.d.ts +14 -0
  141. package/dist/utils/PlatformHelper.d.ts.map +1 -0
  142. package/dist/utils/PlatformHelper.js +16 -0
  143. package/dist/utils/PlatformHelper.js.map +1 -0
  144. package/dist/utils/PlatformHelper.web.d.ts +14 -0
  145. package/dist/utils/PlatformHelper.web.d.ts.map +1 -0
  146. package/dist/utils/PlatformHelper.web.js +18 -0
  147. package/dist/utils/PlatformHelper.web.js.map +1 -0
  148. package/dist/viewability/ViewToken.d.ts +8 -0
  149. package/dist/viewability/ViewToken.d.ts.map +1 -0
  150. package/dist/viewability/ViewToken.js +3 -0
  151. package/dist/viewability/ViewToken.js.map +1 -0
  152. package/dist/viewability/ViewabilityHelper.d.ts +25 -0
  153. package/dist/viewability/ViewabilityHelper.d.ts.map +1 -0
  154. package/dist/viewability/ViewabilityHelper.js +104 -0
  155. package/dist/viewability/ViewabilityHelper.js.map +1 -0
  156. package/dist/viewability/ViewabilityManager.d.ts +24 -0
  157. package/dist/viewability/ViewabilityManager.d.ts.map +1 -0
  158. package/dist/viewability/ViewabilityManager.js +94 -0
  159. package/dist/viewability/ViewabilityManager.js.map +1 -0
  160. package/ios/RNFlashList.xcodeproj/project.pbxproj +3 -0
  161. package/ios/RNFlashList.xcodeproj/project.xcworkspace/contents.xcworkspacedata +4 -0
  162. package/ios/Sources/AutoLayoutView.swift +218 -0
  163. package/ios/Sources/AutoLayoutViewManager.m +14 -0
  164. package/ios/Sources/AutoLayoutViewManager.swift +12 -0
  165. package/ios/Sources/CellContainer.swift +9 -0
  166. package/ios/Sources/CellContainerManager.m +8 -0
  167. package/ios/Sources/CellContainerManager.swift +12 -0
  168. package/ios/Sources/FlatListPro-Bridging-Header.h +8 -0
  169. package/ios/Tests/AutoLayoutViewTests.swift +113 -0
  170. package/jestSetup.js +15 -0
  171. package/package.json +75 -0
  172. package/src/AnimatedFlashList.ts +11 -0
  173. package/src/FlashList.tsx +801 -0
  174. package/src/FlashListProps.ts +312 -0
  175. package/src/GridLayoutProviderWithProps.ts +137 -0
  176. package/src/PureComponentWrapper.tsx +42 -0
  177. package/src/__tests__/AverageWindow.test.ts +80 -0
  178. package/src/__tests__/FlashList.test.tsx +738 -0
  179. package/src/__tests__/GridLayoutProviderWithProps.test.ts +150 -0
  180. package/src/__tests__/PlatformHelper.web.test.ts +29 -0
  181. package/src/__tests__/ViewabilityHelper.test.ts +283 -0
  182. package/src/__tests__/helpers/mountFlashList.tsx +62 -0
  183. package/src/__tests__/useBlankAreaTracker.test.tsx +206 -0
  184. package/src/benchmark/AutoScrollHelper.ts +70 -0
  185. package/src/benchmark/JSFPSMonitor.ts +74 -0
  186. package/src/benchmark/roundToDecimalPlaces.ts +4 -0
  187. package/src/benchmark/useBenchmark.ts +240 -0
  188. package/src/benchmark/useBlankAreaTracker.ts +117 -0
  189. package/src/benchmark/useDataMultiplier.ts +19 -0
  190. package/src/benchmark/useFlatListBenchmark.ts +107 -0
  191. package/src/errors/CustomError.ts +10 -0
  192. package/src/errors/ExceptionList.ts +23 -0
  193. package/src/errors/Warnings.ts +18 -0
  194. package/src/index.ts +32 -0
  195. package/src/native/auto-layout/AutoLayoutView.tsx +72 -0
  196. package/src/native/auto-layout/AutoLayoutViewNativeComponent.ts +7 -0
  197. package/src/native/auto-layout/AutoLayoutViewNativeComponent.web.ts +8 -0
  198. package/src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts +14 -0
  199. package/src/native/cell-container/CellContainer.ts +7 -0
  200. package/src/native/cell-container/CellContainer.web.tsx +9 -0
  201. package/src/utils/AverageWindow.ts +49 -0
  202. package/src/utils/PlatformHelper.ts +16 -0
  203. package/src/utils/PlatformHelper.web.ts +20 -0
  204. package/src/viewability/ViewToken.ts +7 -0
  205. package/src/viewability/ViewabilityHelper.ts +162 -0
  206. package/src/viewability/ViewabilityManager.ts +133 -0
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var react_1 = tslib_1.__importStar(require("react"));
5
+ var react_testing_1 = require("@quilted/react-testing");
6
+ var useBlankAreaTracker_1 = require("../benchmark/useBlankAreaTracker");
7
+ var mountFlashList_1 = require("./helpers/mountFlashList");
8
+ var BlankTrackingFlashList = function (props) {
9
+ var _a, _b, _c, _d;
10
+ var ref = props === null || props === void 0 ? void 0 : props.instance;
11
+ var _e = tslib_1.__read((0, useBlankAreaTracker_1.useBlankAreaTracker)(ref, props === null || props === void 0 ? void 0 : props.onCumulativeBlankAreaChange, {
12
+ startDelayInMs: (_b = (_a = props === null || props === void 0 ? void 0 : props.blankAreaTrackerConfig) === null || _a === void 0 ? void 0 : _a.startDelayInMs) !== null && _b !== void 0 ? _b : 500,
13
+ sumNegativeValues: (_d = (_c = props === null || props === void 0 ? void 0 : props.blankAreaTrackerConfig) === null || _c === void 0 ? void 0 : _c.sumNegativeValues) !== null && _d !== void 0 ? _d : false,
14
+ }), 2), blankAreaTrackerResult = _e[0], onBlankArea = _e[1];
15
+ (0, react_1.useEffect)(function () {
16
+ return function () {
17
+ var _a;
18
+ (_a = props === null || props === void 0 ? void 0 : props.onCumulativeBlankAreaResult) === null || _a === void 0 ? void 0 : _a.call(props, blankAreaTrackerResult);
19
+ };
20
+ // eslint-disable-next-line react-hooks/exhaustive-deps
21
+ }, []);
22
+ return (0, mountFlashList_1.renderFlashList)(tslib_1.__assign(tslib_1.__assign({}, props), { onBlankArea: onBlankArea, estimatedItemSize: 400 }), ref);
23
+ };
24
+ var mountBlankTrackingFlashList = function (props) {
25
+ var flashListRef = {
26
+ current: null,
27
+ };
28
+ var blankTrackingFlashList = (0, react_testing_1.mount)(react_1.default.createElement(BlankTrackingFlashList, tslib_1.__assign({}, props, { instance: flashListRef })));
29
+ return {
30
+ root: blankTrackingFlashList,
31
+ instance: flashListRef.current,
32
+ };
33
+ };
34
+ describe("useBlankAreaTracker Hook", function () {
35
+ beforeEach(function () {
36
+ jest.clearAllMocks();
37
+ jest.useFakeTimers();
38
+ });
39
+ it("ignores blank events for 500ms on mount and if content is not enough to fill the list", function () {
40
+ var onCumulativeBlankAreaChange = jest.fn();
41
+ var flashList = mountBlankTrackingFlashList({
42
+ onCumulativeBlankAreaChange: onCumulativeBlankAreaChange,
43
+ });
44
+ flashList.instance.props.onBlankArea({
45
+ blankArea: 100,
46
+ offsetEnd: 100,
47
+ offsetStart: 0,
48
+ });
49
+ flashList.instance.props.onBlankArea({
50
+ blankArea: 100,
51
+ offsetEnd: 100,
52
+ offsetStart: 0,
53
+ });
54
+ jest.advanceTimersByTime(400);
55
+ flashList.instance.props.onBlankArea({
56
+ blankArea: 100,
57
+ offsetEnd: 100,
58
+ offsetStart: 0,
59
+ });
60
+ expect(onCumulativeBlankAreaChange).toHaveBeenCalledTimes(0);
61
+ jest.advanceTimersByTime(100);
62
+ flashList.instance.props.onBlankArea({
63
+ blankArea: 100,
64
+ offsetEnd: 100,
65
+ offsetStart: 0,
66
+ });
67
+ expect(onCumulativeBlankAreaChange).toHaveBeenCalledTimes(1);
68
+ onCumulativeBlankAreaChange.mockClear();
69
+ flashList.root.setProps({ data: ["1"] });
70
+ flashList.instance.props.onBlankArea({
71
+ blankArea: 100,
72
+ offsetEnd: 100,
73
+ offsetStart: 0,
74
+ });
75
+ expect(onCumulativeBlankAreaChange).toHaveBeenCalledTimes(0);
76
+ flashList.root.unmount();
77
+ });
78
+ it("keeps result object updated with correct values on unmount", function () {
79
+ var resultObjectCopy;
80
+ var onCumulativeBlankAreaChange = jest.fn(function (result) {
81
+ if (!resultObjectCopy) {
82
+ resultObjectCopy = result;
83
+ }
84
+ });
85
+ var onCumulativeBlankAreaResult = jest.fn();
86
+ var flashList = mountBlankTrackingFlashList({
87
+ onCumulativeBlankAreaResult: onCumulativeBlankAreaResult,
88
+ onCumulativeBlankAreaChange: onCumulativeBlankAreaChange,
89
+ blankAreaTrackerConfig: { startDelayInMs: 300 },
90
+ });
91
+ flashList.instance.props.onBlankArea({
92
+ blankArea: 100,
93
+ offsetEnd: 100,
94
+ offsetStart: 0,
95
+ });
96
+ jest.advanceTimersByTime(300);
97
+ flashList.instance.props.onBlankArea({
98
+ blankArea: 100,
99
+ offsetEnd: 100,
100
+ offsetStart: 0,
101
+ });
102
+ expect(resultObjectCopy.cumulativeBlankArea).toBe(100);
103
+ expect(resultObjectCopy.maxBlankArea).toBe(100);
104
+ flashList.instance.props.onBlankArea({
105
+ blankArea: 200,
106
+ offsetEnd: 200,
107
+ offsetStart: 0,
108
+ });
109
+ flashList.instance.props.onBlankArea({
110
+ blankArea: -200,
111
+ offsetEnd: -200,
112
+ offsetStart: 0,
113
+ });
114
+ expect(resultObjectCopy.cumulativeBlankArea).toBe(300);
115
+ expect(resultObjectCopy.maxBlankArea).toBe(200);
116
+ flashList.root.unmount();
117
+ expect(onCumulativeBlankAreaResult).toHaveBeenCalledWith(resultObjectCopy);
118
+ });
119
+ it("can track negative values on demand", function () {
120
+ var onCumulativeBlankAreaResult = jest.fn();
121
+ var flashList = mountBlankTrackingFlashList({
122
+ onCumulativeBlankAreaResult: onCumulativeBlankAreaResult,
123
+ blankAreaTrackerConfig: { sumNegativeValues: true },
124
+ });
125
+ flashList.instance.props.onBlankArea({
126
+ blankArea: -200,
127
+ offsetEnd: -200,
128
+ offsetStart: 0,
129
+ });
130
+ jest.advanceTimersByTime(500);
131
+ flashList.instance.props.onBlankArea({
132
+ blankArea: -200,
133
+ offsetEnd: -200,
134
+ offsetStart: 0,
135
+ });
136
+ flashList.instance.props.onBlankArea({
137
+ blankArea: -200,
138
+ offsetEnd: -200,
139
+ offsetStart: 0,
140
+ });
141
+ flashList.root.unmount();
142
+ expect(onCumulativeBlankAreaResult).toHaveBeenCalledWith({
143
+ cumulativeBlankArea: -400,
144
+ maxBlankArea: 0,
145
+ });
146
+ });
147
+ it("only calls onCumulativeBlankAreaChange when values have a change", function () {
148
+ var onCumulativeBlankAreaChange = jest.fn();
149
+ var flashList = mountBlankTrackingFlashList({
150
+ onCumulativeBlankAreaChange: onCumulativeBlankAreaChange,
151
+ });
152
+ flashList.instance.props.onBlankArea({
153
+ blankArea: -200,
154
+ offsetEnd: -200,
155
+ offsetStart: 0,
156
+ });
157
+ jest.advanceTimersByTime(500);
158
+ flashList.instance.props.onBlankArea({
159
+ blankArea: -200,
160
+ offsetEnd: -200,
161
+ offsetStart: 0,
162
+ });
163
+ expect(onCumulativeBlankAreaChange).toHaveBeenCalledTimes(0);
164
+ flashList.instance.props.onBlankArea({
165
+ blankArea: -100,
166
+ offsetEnd: -100,
167
+ offsetStart: 0,
168
+ });
169
+ expect(onCumulativeBlankAreaChange).toHaveBeenCalledTimes(0);
170
+ flashList.instance.props.onBlankArea({
171
+ blankArea: 100,
172
+ offsetEnd: 100,
173
+ offsetStart: 0,
174
+ });
175
+ expect(onCumulativeBlankAreaChange).toHaveBeenCalledTimes(1);
176
+ flashList.root.unmount();
177
+ });
178
+ });
179
+ //# sourceMappingURL=useBlankAreaTracker.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBlankAreaTracker.test.js","sourceRoot":"","sources":["../../src/__tests__/useBlankAreaTracker.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * This method can be used to trigger scroll events that can be forwarded to an element. Anything that implements scrollable can leverage this.
3
+ * @param scroll The scrollable element
4
+ * @param fromX The x offset to start from
5
+ * @param fromY The y offset to start from
6
+ * @param toX the x offset to end scroll at
7
+ * @param toY the y offset to end scroll at
8
+ * @param speedMultiplier the speed multiplier to use
9
+ * @param cancellable can be used to cancel the scroll
10
+ * @returns Promise that resolves when the scroll is complete
11
+ */
12
+ export declare function autoScroll(scroll: (x: number, y: number, animated: boolean) => void, fromX: number, fromY: number, toX: number, toY: number, speedMultiplier?: number, cancellable?: Cancellable): Promise<boolean>;
13
+ export declare class Cancellable {
14
+ cancel(): void;
15
+ isCancelled(): boolean;
16
+ _isCancelled: boolean;
17
+ }
18
+ //# sourceMappingURL=AutoScrollHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoScrollHelper.d.ts","sourceRoot":"","sources":["../../src/benchmark/AutoScrollHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,EACzD,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,eAAe,SAAI,EACnB,WAAW,GAAE,WAA+B,GAC3C,OAAO,CAAC,OAAO,CAAC,CAsClB;AAED,qBAAa,WAAW;IACf,MAAM;IAIN,WAAW,IAAI,OAAO;IAItB,YAAY,EAAE,OAAO,CAAS;CACtC"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Cancellable = exports.autoScroll = void 0;
4
+ /**
5
+ * This method can be used to trigger scroll events that can be forwarded to an element. Anything that implements scrollable can leverage this.
6
+ * @param scroll The scrollable element
7
+ * @param fromX The x offset to start from
8
+ * @param fromY The y offset to start from
9
+ * @param toX the x offset to end scroll at
10
+ * @param toY the y offset to end scroll at
11
+ * @param speedMultiplier the speed multiplier to use
12
+ * @param cancellable can be used to cancel the scroll
13
+ * @returns Promise that resolves when the scroll is complete
14
+ */
15
+ function autoScroll(scroll, fromX, fromY, toX, toY, speedMultiplier, cancellable) {
16
+ if (speedMultiplier === void 0) { speedMultiplier = 1; }
17
+ if (cancellable === void 0) { cancellable = new Cancellable(); }
18
+ return new Promise(function (resolve) {
19
+ scroll(fromX, fromY, false);
20
+ // Very fast scrolls on Android/iOS typically move content 7px every millisecond.
21
+ var incrementPerMs = 7 * speedMultiplier;
22
+ var directionMultiplierX = toX > fromX ? 1 : -1;
23
+ var directionMultiplierY = toY > fromY ? 1 : -1;
24
+ var comparatorX = toX > fromX ? Math.min : Math.max;
25
+ var comparatorY = toY > fromY ? Math.min : Math.max;
26
+ var startTime = Date.now();
27
+ var startX = fromX;
28
+ var startY = fromY;
29
+ // Computes the number of pixels to scroll in the given time
30
+ // Also invokes the scrollable to update the scroll position
31
+ var animationLoop = function () {
32
+ requestAnimationFrame(function () {
33
+ if (cancellable.isCancelled()) {
34
+ resolve(false);
35
+ return;
36
+ }
37
+ var currentTime = Date.now();
38
+ var timeElapsed = currentTime - startTime;
39
+ var distanceToCover = incrementPerMs * timeElapsed;
40
+ startX += distanceToCover * directionMultiplierX;
41
+ startY += distanceToCover * directionMultiplierY;
42
+ scroll(comparatorX(toX, startX), comparatorY(toY, startY), false);
43
+ startTime = currentTime;
44
+ if (comparatorX(toX, startX) !== toX ||
45
+ comparatorY(toY, startY) !== toY) {
46
+ return animationLoop();
47
+ }
48
+ resolve(true);
49
+ });
50
+ };
51
+ animationLoop();
52
+ });
53
+ }
54
+ exports.autoScroll = autoScroll;
55
+ var Cancellable = /** @class */ (function () {
56
+ function Cancellable() {
57
+ this._isCancelled = false;
58
+ }
59
+ Cancellable.prototype.cancel = function () {
60
+ this._isCancelled = true;
61
+ };
62
+ Cancellable.prototype.isCancelled = function () {
63
+ return this._isCancelled;
64
+ };
65
+ return Cancellable;
66
+ }());
67
+ exports.Cancellable = Cancellable;
68
+ //# sourceMappingURL=AutoScrollHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoScrollHelper.js","sourceRoot":"","sources":["../../src/benchmark/AutoScrollHelper.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CACxB,MAAyD,EACzD,KAAa,EACb,KAAa,EACb,GAAW,EACX,GAAW,EACX,eAAmB,EACnB,WAA4C;IAD5C,gCAAA,EAAA,mBAAmB;IACnB,4BAAA,EAAA,kBAA+B,WAAW,EAAE;IAE5C,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO;QACzB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC5B,iFAAiF;QACjF,IAAM,cAAc,GAAG,CAAC,GAAG,eAAe,CAAC;QAC3C,IAAM,oBAAoB,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAM,oBAAoB,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAM,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACtD,IAAM,WAAW,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QACtD,IAAI,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,IAAI,MAAM,GAAG,KAAK,CAAC;QACnB,4DAA4D;QAC5D,4DAA4D;QAC5D,IAAM,aAAa,GAAG;YACpB,qBAAqB,CAAC;gBACpB,IAAI,WAAW,CAAC,WAAW,EAAE,EAAE;oBAC7B,OAAO,CAAC,KAAK,CAAC,CAAC;oBACf,OAAO;iBACR;gBACD,IAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC/B,IAAM,WAAW,GAAG,WAAW,GAAG,SAAS,CAAC;gBAC5C,IAAM,eAAe,GAAG,cAAc,GAAG,WAAW,CAAC;gBACrD,MAAM,IAAI,eAAe,GAAG,oBAAoB,CAAC;gBACjD,MAAM,IAAI,eAAe,GAAG,oBAAoB,CAAC;gBACjD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;gBAClE,SAAS,GAAG,WAAW,CAAC;gBACxB,IACE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,GAAG;oBAChC,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,GAAG,EAChC;oBACA,OAAO,aAAa,EAAE,CAAC;iBACxB;gBACD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QACF,aAAa,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AA9CD,gCA8CC;AAED;IAAA;QASS,iBAAY,GAAY,KAAK,CAAC;IACvC,CAAC;IATQ,4BAAM,GAAb;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAEM,iCAAW,GAAlB;QACE,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAGH,kBAAC;AAAD,CAAC,AAVD,IAUC;AAVY,kCAAW"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Can be used to monitor JS thread performance
3
+ * Use startTracking() and stopAndGetData() to start and stop tracking
4
+ */
5
+ export declare class JSFPSMonitor {
6
+ private startTime;
7
+ private frameCount;
8
+ private timeWindow;
9
+ private minFPS;
10
+ private maxFPS;
11
+ private averageFPS;
12
+ private clearAnimationNumber;
13
+ private measureLoop;
14
+ private updateLoopCompute;
15
+ startTracking(): void;
16
+ stopAndGetData(): JSFPSResult;
17
+ }
18
+ export interface JSFPSResult {
19
+ minFPS: number;
20
+ maxFPS: number;
21
+ averageFPS: number;
22
+ }
23
+ //# sourceMappingURL=JSFPSMonitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSFPSMonitor.d.ts","sourceRoot":"","sources":["../../src/benchmark/JSFPSMonitor.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,UAAU,CAGhB;IAEF,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,oBAAoB,CAAK;IAEjC,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,iBAAiB,CAiBvB;IAEK,aAAa;IAWb,cAAc,IAAI,WAAW;CAYrC;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB"}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JSFPSMonitor = void 0;
4
+ var roundToDecimalPlaces_1 = require("./roundToDecimalPlaces");
5
+ /**
6
+ * Can be used to monitor JS thread performance
7
+ * Use startTracking() and stopAndGetData() to start and stop tracking
8
+ */
9
+ var JSFPSMonitor = /** @class */ (function () {
10
+ function JSFPSMonitor() {
11
+ var _this = this;
12
+ this.startTime = 0;
13
+ this.frameCount = 0;
14
+ this.timeWindow = {
15
+ frameCount: 0,
16
+ startTime: 0,
17
+ };
18
+ this.minFPS = Number.MAX_SAFE_INTEGER;
19
+ this.maxFPS = 0;
20
+ this.averageFPS = 0;
21
+ this.clearAnimationNumber = 0;
22
+ this.updateLoopCompute = function () {
23
+ _this.frameCount++;
24
+ var elapsedTime = (Date.now() - _this.startTime) / 1000;
25
+ _this.averageFPS = elapsedTime > 0 ? _this.frameCount / elapsedTime : 0;
26
+ _this.timeWindow.frameCount++;
27
+ var timeWindowElapsedTime = (Date.now() - _this.timeWindow.startTime) / 1000;
28
+ if (timeWindowElapsedTime >= 1) {
29
+ var timeWindowAverageFPS = _this.timeWindow.frameCount / timeWindowElapsedTime;
30
+ _this.minFPS = Math.min(_this.minFPS, timeWindowAverageFPS);
31
+ _this.maxFPS = Math.max(_this.maxFPS, timeWindowAverageFPS);
32
+ _this.timeWindow.frameCount = 0;
33
+ _this.timeWindow.startTime = Date.now();
34
+ }
35
+ _this.measureLoop();
36
+ };
37
+ }
38
+ JSFPSMonitor.prototype.measureLoop = function () {
39
+ // This looks weird but I'm avoiding a new closure
40
+ this.clearAnimationNumber = requestAnimationFrame(this.updateLoopCompute);
41
+ };
42
+ JSFPSMonitor.prototype.startTracking = function () {
43
+ if (this.startTime !== 0) {
44
+ throw new Error("This FPS Monitor has already been run, please create a new instance");
45
+ }
46
+ this.startTime = Date.now();
47
+ this.timeWindow.startTime = Date.now();
48
+ this.measureLoop();
49
+ };
50
+ JSFPSMonitor.prototype.stopAndGetData = function () {
51
+ cancelAnimationFrame(this.clearAnimationNumber);
52
+ if (this.minFPS === Number.MAX_SAFE_INTEGER) {
53
+ this.minFPS = this.averageFPS;
54
+ this.maxFPS = this.averageFPS;
55
+ }
56
+ return {
57
+ minFPS: (0, roundToDecimalPlaces_1.roundToDecimalPlaces)(this.minFPS, 1),
58
+ maxFPS: (0, roundToDecimalPlaces_1.roundToDecimalPlaces)(this.maxFPS, 1),
59
+ averageFPS: (0, roundToDecimalPlaces_1.roundToDecimalPlaces)(this.averageFPS, 1),
60
+ };
61
+ };
62
+ return JSFPSMonitor;
63
+ }());
64
+ exports.JSFPSMonitor = JSFPSMonitor;
65
+ //# sourceMappingURL=JSFPSMonitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JSFPSMonitor.js","sourceRoot":"","sources":["../../src/benchmark/JSFPSMonitor.ts"],"names":[],"mappings":";;;AAAA,+DAA8D;AAE9D;;;GAGG;AACH;IAAA;QAAA,iBA6DC;QA5DS,cAAS,GAAG,CAAC,CAAC;QACd,eAAU,GAAG,CAAC,CAAC;QACf,eAAU,GAAG;YACnB,UAAU,EAAE,CAAC;YACb,SAAS,EAAE,CAAC;SACb,CAAC;QAEM,WAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;QACjC,WAAM,GAAG,CAAC,CAAC;QACX,eAAU,GAAG,CAAC,CAAC;QAEf,yBAAoB,GAAG,CAAC,CAAC;QAOzB,sBAAiB,GAAG;YAC1B,KAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAM,WAAW,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YACzD,KAAI,CAAC,UAAU,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,KAAI,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtE,KAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC7B,IAAM,qBAAqB,GACzB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;YAClD,IAAI,qBAAqB,IAAI,CAAC,EAAE;gBAC9B,IAAM,oBAAoB,GACxB,KAAI,CAAC,UAAU,CAAC,UAAU,GAAG,qBAAqB,CAAC;gBACrD,KAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;gBAC1D,KAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAI,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;gBAC1D,KAAI,CAAC,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC;gBAC/B,KAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;aACxC;YACD,KAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC,CAAC;IAyBJ,CAAC;IA/CS,kCAAW,GAAnB;QACE,kDAAkD;QAClD,IAAI,CAAC,oBAAoB,GAAG,qBAAqB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5E,CAAC;IAqBM,oCAAa,GAApB;QACE,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE;YACxB,MAAM,IAAI,KAAK,CACb,qEAAqE,CACtE,CAAC;SACH;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvC,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAEM,qCAAc,GAArB;QACE,oBAAoB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,gBAAgB,EAAE;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;YAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;SAC/B;QACD,OAAO;YACL,MAAM,EAAE,IAAA,2CAAoB,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,IAAA,2CAAoB,EAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,UAAU,EAAE,IAAA,2CAAoB,EAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;SACrD,CAAC;IACJ,CAAC;IACH,mBAAC;AAAD,CAAC,AA7DD,IA6DC;AA7DY,oCAAY"}
@@ -0,0 +1,2 @@
1
+ export declare function roundToDecimalPlaces(value: number, decimalPlaces: number): number;
2
+ //# sourceMappingURL=roundToDecimalPlaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundToDecimalPlaces.d.ts","sourceRoot":"","sources":["../../src/benchmark/roundToDecimalPlaces.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAGxE"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.roundToDecimalPlaces = void 0;
4
+ function roundToDecimalPlaces(value, decimalPlaces) {
5
+ var multiplier = Math.pow(10, decimalPlaces);
6
+ return Math.round(value * multiplier) / multiplier;
7
+ }
8
+ exports.roundToDecimalPlaces = roundToDecimalPlaces;
9
+ //# sourceMappingURL=roundToDecimalPlaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roundToDecimalPlaces.js","sourceRoot":"","sources":["../../src/benchmark/roundToDecimalPlaces.ts"],"names":[],"mappings":";;;AAAA,SAAgB,oBAAoB,CAAC,KAAa,EAAE,aAAqB;IACvE,IAAM,UAAU,GAAG,SAAA,EAAE,EAAI,aAAa,CAAA,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACrD,CAAC;AAHD,oDAGC"}
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import FlashList from "../FlashList";
3
+ import { JSFPSResult } from "./JSFPSMonitor";
4
+ import { BlankAreaTrackerResult } from "./useBlankAreaTracker";
5
+ export interface BenchmarkParams {
6
+ startDelayInMs?: number;
7
+ /**
8
+ * Can be used to increase or decrease speed of scrolling
9
+ */
10
+ speedMultiplier?: number;
11
+ /**
12
+ * Specify the number of times benchmark should repeat itself
13
+ */
14
+ repeatCount?: number;
15
+ /**
16
+ * When set to true, cumulative blank area will include sum of negative blank area values
17
+ * Blank area is negative when list is able to draw faster than the scroll speed.
18
+ */
19
+ sumNegativeBlankAreaValues?: boolean;
20
+ }
21
+ export interface BenchmarkResult {
22
+ js?: JSFPSResult;
23
+ interrupted: boolean;
24
+ suggestions: string[];
25
+ blankArea?: BlankAreaTrackerResult;
26
+ formattedString?: string;
27
+ }
28
+ /**
29
+ * Runs the benchmark on FlashList.
30
+ * Response object has a formatted string that can be printed to the console or shown as an alert.
31
+ * Result is posted to the callback method passed to the hook.
32
+ */
33
+ export declare function useBenchmark(flashListRef: React.RefObject<FlashList<any>>, callback: (benchmarkResult: BenchmarkResult) => void, params?: BenchmarkParams): ((event: import("..").BlankAreaEvent) => void)[];
34
+ export declare function getFormattedString(res: BenchmarkResult): string;
35
+ //# sourceMappingURL=useBenchmark.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBenchmark.d.ts","sourceRoot":"","sources":["../../src/benchmark/useBenchmark.ts"],"names":[],"mappings":"AAAA,OAAO,KAAoB,MAAM,OAAO,CAAC;AAEzC,OAAO,SAAS,MAAM,cAAc,CAAC;AAGrC,OAAO,EAAgB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EACL,sBAAsB,EAEvB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;OAGG;IACH,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,CAAC,EAAE,WAAW,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,sBAAsB,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AAEH,wBAAgB,YAAY,CAC1B,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAC7C,QAAQ,EAAE,CAAC,eAAe,EAAE,eAAe,KAAK,IAAI,EACpD,MAAM,GAAE,eAAoB,oDAkD7B;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,UAiBtD"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getFormattedString = exports.useBenchmark = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var react_1 = require("react");
6
+ var AutoScrollHelper_1 = require("./AutoScrollHelper");
7
+ var JSFPSMonitor_1 = require("./JSFPSMonitor");
8
+ var roundToDecimalPlaces_1 = require("./roundToDecimalPlaces");
9
+ var useBlankAreaTracker_1 = require("./useBlankAreaTracker");
10
+ /**
11
+ * Runs the benchmark on FlashList.
12
+ * Response object has a formatted string that can be printed to the console or shown as an alert.
13
+ * Result is posted to the callback method passed to the hook.
14
+ */
15
+ function useBenchmark(flashListRef, callback, params) {
16
+ var _this = this;
17
+ if (params === void 0) { params = {}; }
18
+ var _a = tslib_1.__read((0, useBlankAreaTracker_1.useBlankAreaTracker)(flashListRef, undefined, { sumNegativeValues: params.sumNegativeBlankAreaValues, startDelayInMs: 0 }), 2), blankAreaResult = _a[0], blankAreaTracker = _a[1];
19
+ (0, react_1.useEffect)(function () {
20
+ var _a;
21
+ var cancellable = new AutoScrollHelper_1.Cancellable();
22
+ var suggestions = [];
23
+ if (flashListRef.current) {
24
+ if (!(Number((_a = flashListRef.current.props.data) === null || _a === void 0 ? void 0 : _a.length) > 0)) {
25
+ throw new Error("Data is empty, cannot run benchmark");
26
+ }
27
+ }
28
+ var cancelTimeout = setTimeout(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
29
+ var jsFPSMonitor, i, jsProfilerResponse, result;
30
+ return tslib_1.__generator(this, function (_a) {
31
+ switch (_a.label) {
32
+ case 0:
33
+ jsFPSMonitor = new JSFPSMonitor_1.JSFPSMonitor();
34
+ jsFPSMonitor.startTracking();
35
+ i = 0;
36
+ _a.label = 1;
37
+ case 1:
38
+ if (!(i < (params.repeatCount || 1))) return [3 /*break*/, 4];
39
+ return [4 /*yield*/, runScrollBenchmark(flashListRef, cancellable, params.speedMultiplier || 1)];
40
+ case 2:
41
+ _a.sent();
42
+ _a.label = 3;
43
+ case 3:
44
+ i++;
45
+ return [3 /*break*/, 1];
46
+ case 4:
47
+ jsProfilerResponse = jsFPSMonitor.stopAndGetData();
48
+ if (jsProfilerResponse.averageFPS < 35) {
49
+ suggestions.push("Your average JS FPS is low. This can indicate that your components are doing too much work. Try to optimize your components and reduce re-renders if any");
50
+ }
51
+ computeSuggestions(flashListRef, suggestions);
52
+ result = generateResult(jsProfilerResponse, blankAreaResult, suggestions, cancellable);
53
+ if (!cancellable.isCancelled()) {
54
+ result.formattedString = getFormattedString(result);
55
+ }
56
+ callback(result);
57
+ return [2 /*return*/];
58
+ }
59
+ });
60
+ }); }, params.startDelayInMs || 3000);
61
+ return function () {
62
+ clearTimeout(cancelTimeout);
63
+ cancellable.cancel();
64
+ };
65
+ // eslint-disable-next-line react-hooks/exhaustive-deps
66
+ }, []);
67
+ return [blankAreaTracker];
68
+ }
69
+ exports.useBenchmark = useBenchmark;
70
+ function getFormattedString(res) {
71
+ var _a, _b, _c, _d, _e;
72
+ return ("Results:\n\n" +
73
+ "JS FPS: Avg: ".concat((_a = res.js) === null || _a === void 0 ? void 0 : _a.averageFPS, " | Min: ").concat((_b = res.js) === null || _b === void 0 ? void 0 : _b.minFPS, " | Max: ").concat((_c = res.js) === null || _c === void 0 ? void 0 : _c.maxFPS, "\n\n") +
74
+ "".concat(res.blankArea
75
+ ? "Blank Area: Max: ".concat((_d = res.blankArea) === null || _d === void 0 ? void 0 : _d.maxBlankArea, " Cumulative: ").concat((_e = res.blankArea) === null || _e === void 0 ? void 0 : _e.cumulativeBlankArea, "\n\n")
76
+ : "") +
77
+ "".concat(res.suggestions.length > 0
78
+ ? "Suggestions:\n\n".concat(res.suggestions
79
+ .map(function (value, index) { return "".concat(index + 1, ". ").concat(value); })
80
+ .join("\n"))
81
+ : ""));
82
+ }
83
+ exports.getFormattedString = getFormattedString;
84
+ function generateResult(jsProfilerResponse, blankAreaResult, suggestions, cancellable) {
85
+ return {
86
+ js: jsProfilerResponse,
87
+ blankArea: blankAreaResult.maxBlankArea >= 0
88
+ ? {
89
+ maxBlankArea: (0, roundToDecimalPlaces_1.roundToDecimalPlaces)(blankAreaResult.maxBlankArea, 0),
90
+ cumulativeBlankArea: (0, roundToDecimalPlaces_1.roundToDecimalPlaces)(blankAreaResult.cumulativeBlankArea, 0),
91
+ }
92
+ : undefined,
93
+ suggestions: suggestions,
94
+ interrupted: cancellable.isCancelled(),
95
+ };
96
+ }
97
+ /**
98
+ * Scrolls to the end of the list and then back to the top
99
+ */
100
+ function runScrollBenchmark(flashListRef, cancellable, scrollSpeedMultiplier) {
101
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
102
+ var horizontal_1, rlv, rlvSize, rlvContentSize, fromX, fromY, toX, toY, scrollNow;
103
+ return tslib_1.__generator(this, function (_a) {
104
+ switch (_a.label) {
105
+ case 0:
106
+ if (!flashListRef.current) return [3 /*break*/, 3];
107
+ horizontal_1 = flashListRef.current.props.horizontal;
108
+ rlv = flashListRef.current.recyclerlistview_unsafe;
109
+ if (!rlv) return [3 /*break*/, 3];
110
+ rlvSize = rlv.getRenderedSize();
111
+ rlvContentSize = rlv.getContentDimension();
112
+ fromX = 0;
113
+ fromY = 0;
114
+ toX = rlvContentSize.width - rlvSize.width;
115
+ toY = rlvContentSize.height - rlvSize.height;
116
+ scrollNow = function (x, y) {
117
+ var _a;
118
+ (_a = flashListRef.current) === null || _a === void 0 ? void 0 : _a.scrollToOffset({
119
+ offset: horizontal_1 ? x : y,
120
+ animated: false,
121
+ });
122
+ };
123
+ return [4 /*yield*/, (0, AutoScrollHelper_1.autoScroll)(scrollNow, fromX, fromY, toX, toY, scrollSpeedMultiplier, cancellable)];
124
+ case 1:
125
+ _a.sent();
126
+ return [4 /*yield*/, (0, AutoScrollHelper_1.autoScroll)(scrollNow, toX, toY, fromX, fromY, scrollSpeedMultiplier, cancellable)];
127
+ case 2:
128
+ _a.sent();
129
+ _a.label = 3;
130
+ case 3: return [2 /*return*/];
131
+ }
132
+ });
133
+ });
134
+ }
135
+ function computeSuggestions(flashListRef, suggestions) {
136
+ var _a;
137
+ if (flashListRef.current) {
138
+ if (flashListRef.current.props.data.length < 200) {
139
+ suggestions.push("Data count is low. Try to increase it to a large number (e.g 200) using the 'useDataMultiplier' hook.");
140
+ }
141
+ var distanceFromWindow = (0, roundToDecimalPlaces_1.roundToDecimalPlaces)(flashListRef.current.firstItemOffset, 0);
142
+ if ((flashListRef.current.props.estimatedFirstItemOffset || 0) !==
143
+ distanceFromWindow) {
144
+ suggestions.push("estimatedFirstItemOffset can be set to ".concat(distanceFromWindow));
145
+ }
146
+ var rlv_1 = flashListRef.current.recyclerlistview_unsafe;
147
+ var horizontal_2 = flashListRef.current.props.horizontal;
148
+ if (rlv_1) {
149
+ var sizeArray = rlv_1.props.dataProvider
150
+ .getAllData()
151
+ .map(function (_, index) {
152
+ var _a, _b, _c, _d;
153
+ return horizontal_2
154
+ ? ((_b = (_a = rlv_1.getLayout) === null || _a === void 0 ? void 0 : _a.call(rlv_1, index)) === null || _b === void 0 ? void 0 : _b.width) || 0
155
+ : ((_d = (_c = rlv_1.getLayout) === null || _c === void 0 ? void 0 : _c.call(rlv_1, index)) === null || _d === void 0 ? void 0 : _d.height) || 0;
156
+ });
157
+ var averageSize = Math.round(sizeArray.reduce(function (prev, current) { return prev + current; }, 0) /
158
+ sizeArray.length);
159
+ if (Math.abs(averageSize -
160
+ ((_a = flashListRef.current.props.estimatedItemSize) !== null && _a !== void 0 ? _a : flashListRef.current.state.layoutProvider
161
+ .defaultEstimatedItemSize)) > 5) {
162
+ suggestions.push("estimatedItemSize can be set to ".concat(averageSize));
163
+ }
164
+ }
165
+ }
166
+ }
167
+ //# sourceMappingURL=useBenchmark.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBenchmark.js","sourceRoot":"","sources":["../../src/benchmark/useBenchmark.ts"],"names":[],"mappings":";;;;AAAA,+BAAyC;AAIzC,uDAA6D;AAC7D,+CAA2D;AAC3D,+DAA8D;AAC9D,6DAG+B;AA8B/B;;;;GAIG;AAEH,SAAgB,YAAY,CAC1B,YAA6C,EAC7C,QAAoD,EACpD,MAA4B;IAH9B,iBAqDC;IAlDC,uBAAA,EAAA,WAA4B;IAEtB,IAAA,KAAA,eAAsC,IAAA,yCAAmB,EAC7D,YAAY,EACZ,SAAS,EACT,EAAE,iBAAiB,EAAE,MAAM,CAAC,0BAA0B,EAAE,cAAc,EAAE,CAAC,EAAE,CAC5E,IAAA,EAJM,eAAe,QAAA,EAAE,gBAAgB,QAIvC,CAAC;IACF,IAAA,iBAAS,EAAC;;QACR,IAAM,WAAW,GAAG,IAAI,8BAAW,EAAE,CAAC;QACtC,IAAM,WAAW,GAAa,EAAE,CAAC;QACjC,IAAI,YAAY,CAAC,OAAO,EAAE;YACxB,IAAI,CAAC,CAAC,MAAM,CAAC,MAAA,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,0CAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC1D,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;aACxD;SACF;QACD,IAAM,aAAa,GAAG,UAAU,CAAC;;;;;wBACzB,YAAY,GAAG,IAAI,2BAAY,EAAE,CAAC;wBACxC,YAAY,CAAC,aAAa,EAAE,CAAC;wBACpB,CAAC,GAAG,CAAC;;;6BAAE,CAAA,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,CAAA;wBAC3C,qBAAM,kBAAkB,CACtB,YAAY,EACZ,WAAW,EACX,MAAM,CAAC,eAAe,IAAI,CAAC,CAC5B,EAAA;;wBAJD,SAIC,CAAC;;;wBAL2C,CAAC,EAAE,CAAA;;;wBAO5C,kBAAkB,GAAG,YAAY,CAAC,cAAc,EAAE,CAAC;wBACzD,IAAI,kBAAkB,CAAC,UAAU,GAAG,EAAE,EAAE;4BACtC,WAAW,CAAC,IAAI,CACd,0JAA0J,CAC3J,CAAC;yBACH;wBACD,kBAAkB,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;wBACxC,MAAM,GAAoB,cAAc,CAC5C,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,WAAW,CACZ,CAAC;wBACF,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE;4BAC9B,MAAM,CAAC,eAAe,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;yBACrD;wBACD,QAAQ,CAAC,MAAM,CAAC,CAAC;;;;aAClB,EAAE,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;QAClC,OAAO;YACL,YAAY,CAAC,aAAa,CAAC,CAAC;YAC5B,WAAW,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC,CAAC;QACF,uDAAuD;IACzD,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC5B,CAAC;AArDD,oCAqDC;AAED,SAAgB,kBAAkB,CAAC,GAAoB;;IACrD,OAAO,CACL,cAAc;QACd,uBAAgB,MAAA,GAAG,CAAC,EAAE,0CAAE,UAAU,qBAAW,MAAA,GAAG,CAAC,EAAE,0CAAE,MAAM,qBAAW,MAAA,GAAG,CAAC,EAAE,0CAAE,MAAM,SAAM;QAC1F,UACE,GAAG,CAAC,SAAS;YACX,CAAC,CAAC,2BAAoB,MAAA,GAAG,CAAC,SAAS,0CAAE,YAAY,0BAAgB,MAAA,GAAG,CAAC,SAAS,0CAAE,mBAAmB,SAAM;YACzG,CAAC,CAAC,EAAE,CACN;QACF,UACE,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YACxB,CAAC,CAAC,0BAAmB,GAAG,CAAC,WAAW;iBAC/B,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK,IAAK,OAAA,UAAG,KAAK,GAAG,CAAC,eAAK,KAAK,CAAE,EAAxB,CAAwB,CAAC;iBAC/C,IAAI,CAAC,IAAI,CAAC,CAAE;YACjB,CAAC,CAAC,EAAE,CACN,CACH,CAAC;AACJ,CAAC;AAjBD,gDAiBC;AAED,SAAS,cAAc,CACrB,kBAA+B,EAC/B,eAAuC,EACvC,WAAqB,EACrB,WAAwB;IAExB,OAAO;QACL,EAAE,EAAE,kBAAkB;QACtB,SAAS,EACP,eAAe,CAAC,YAAY,IAAI,CAAC;YAC/B,CAAC,CAAC;gBACE,YAAY,EAAE,IAAA,2CAAoB,EAAC,eAAe,CAAC,YAAY,EAAE,CAAC,CAAC;gBACnE,mBAAmB,EAAE,IAAA,2CAAoB,EACvC,eAAe,CAAC,mBAAmB,EACnC,CAAC,CACF;aACF;YACH,CAAC,CAAC,SAAS;QACf,WAAW,aAAA;QACX,WAAW,EAAE,WAAW,CAAC,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAe,kBAAkB,CAC/B,YAAgE,EAChE,WAAwB,EACxB,qBAA6B;;;;;;yBAEzB,YAAY,CAAC,OAAO,EAApB,wBAAoB;oBAChB,eAAa,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;oBACnD,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC;yBACrD,GAAG,EAAH,wBAAG;oBACC,OAAO,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;oBAChC,cAAc,GAAG,GAAG,CAAC,mBAAmB,EAAE,CAAC;oBAE3C,KAAK,GAAG,CAAC,CAAC;oBACV,KAAK,GAAG,CAAC,CAAC;oBACV,GAAG,GAAG,cAAc,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;oBAC3C,GAAG,GAAG,cAAc,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;oBAE7C,SAAS,GAAG,UAAC,CAAS,EAAE,CAAS;;wBACrC,MAAA,YAAY,CAAC,OAAO,0CAAE,cAAc,CAAC;4BACnC,MAAM,EAAE,YAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BAC1B,QAAQ,EAAE,KAAK;yBAChB,CAAC,CAAC;oBACL,CAAC,CAAC;oBAEF,qBAAM,IAAA,6BAAU,EACd,SAAS,EACT,KAAK,EACL,KAAK,EACL,GAAG,EACH,GAAG,EACH,qBAAqB,EACrB,WAAW,CACZ,EAAA;;oBARD,SAQC,CAAC;oBACF,qBAAM,IAAA,6BAAU,EACd,SAAS,EACT,GAAG,EACH,GAAG,EACH,KAAK,EACL,KAAK,EACL,qBAAqB,EACrB,WAAW,CACZ,EAAA;;oBARD,SAQC,CAAC;;;;;;CAGP;AACD,SAAS,kBAAkB,CACzB,YAAgE,EAChE,WAAqB;;IAErB,IAAI,YAAY,CAAC,OAAO,EAAE;QACxB,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,IAAM,CAAC,MAAM,GAAG,GAAG,EAAE;YAClD,WAAW,CAAC,IAAI,CACd,uGAAuG,CACxG,CAAC;SACH;QACD,IAAM,kBAAkB,GAAG,IAAA,2CAAoB,EAC7C,YAAY,CAAC,OAAO,CAAC,eAAe,EACpC,CAAC,CACF,CAAC;QACF,IACE,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,wBAAwB,IAAI,CAAC,CAAC;YAC1D,kBAAkB,EAClB;YACA,WAAW,CAAC,IAAI,CACd,iDAA0C,kBAAkB,CAAE,CAC/D,CAAC;SACH;QACD,IAAM,KAAG,GAAG,YAAY,CAAC,OAAO,CAAC,uBAAuB,CAAC;QACzD,IAAM,YAAU,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;QACzD,IAAI,KAAG,EAAE;YACP,IAAM,SAAS,GAAG,KAAG,CAAC,KAAK,CAAC,YAAY;iBACrC,UAAU,EAAE;iBACZ,GAAG,CAAC,UAAC,CAAC,EAAE,KAAK;;gBACZ,OAAA,YAAU;oBACR,CAAC,CAAC,CAAA,MAAA,MAAA,KAAG,CAAC,SAAS,sDAAG,KAAK,CAAC,0CAAE,KAAK,KAAI,CAAC;oBACpC,CAAC,CAAC,CAAA,MAAA,MAAA,KAAG,CAAC,SAAS,sDAAG,KAAK,CAAC,0CAAE,MAAM,KAAI,CAAC,CAAA;aAAA,CACxC,CAAC;YACJ,IAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,SAAS,CAAC,MAAM,CAAC,UAAC,IAAI,EAAE,OAAO,IAAK,OAAA,IAAI,GAAG,OAAO,EAAd,CAAc,EAAE,CAAC,CAAC;gBACpD,SAAS,CAAC,MAAM,CACnB,CAAC;YACF,IACE,IAAI,CAAC,GAAG,CACN,WAAW;gBACT,CAAC,MAAA,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,mCAC3C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc;qBACtC,wBAAwB,CAAC,CACjC,GAAG,CAAC,EACL;gBACA,WAAW,CAAC,IAAI,CAAC,0CAAmC,WAAW,CAAE,CAAC,CAAC;aACpE;SACF;KACF;AACH,CAAC"}