@applicaster/zapp-react-native-ui-components 12.0.0-alpha.7725319213 → 12.0.0-alpha.7754333813

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 (104) hide show
  1. package/Components/AudioPlayer/AudioPlayer.tsx +9 -1
  2. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +5 -0
  3. package/Components/AudioPlayer/helpers.tsx +1 -0
  4. package/Components/Cell/Cell.tsx +2 -2
  5. package/Components/Cell/CellWithFocusable.tsx +21 -14
  6. package/Components/Cell/TvOSCellComponent.tsx +2 -2
  7. package/Components/ErrorScreen/index.tsx +1 -1
  8. package/Components/FocusableCell/index.tsx +7 -7
  9. package/Components/FocusableList/FocusableChild.ts +24 -14
  10. package/Components/FocusableList/FocusableItem.tsx +1 -1
  11. package/Components/FocusableList/FocusableListItemWrapper.tsx +76 -0
  12. package/Components/FocusableList/hooks/useCellState.android.ts +3 -1
  13. package/Components/FocusableList/index.tsx +26 -25
  14. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +6 -3
  15. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +13 -6
  16. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  17. package/Components/HookRenderer/index.tsx +1 -6
  18. package/Components/Image/Image.android.tsx +3 -25
  19. package/Components/Image/Image.tsx +18 -2
  20. package/Components/Image/utils/index.ts +39 -0
  21. package/Components/Layout/TV/__tests__/index.test.tsx +1 -34
  22. package/Components/Layout/TV/index.tsx +20 -36
  23. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -0
  24. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  25. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -3
  26. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  27. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -1
  28. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +17 -2
  29. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  30. package/Components/MasterCell/DefaultComponents/Text/index.tsx +14 -2
  31. package/Components/MasterCell/DefaultComponents/Toggle.tsx +5 -1
  32. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  33. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +24 -9
  34. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +6 -14
  35. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +1 -1
  36. package/Components/MasterCell/utils/index.ts +16 -5
  37. package/Components/MeasurmentsPortal/BasicMeasurementsPortal.tsx +11 -7
  38. package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +10 -1
  39. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  40. package/Components/ModalComponent/Button/Item.tsx +82 -0
  41. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  42. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  43. package/Components/ModalComponent/Button/assets.ts +4 -0
  44. package/Components/ModalComponent/Button/index.tsx +111 -0
  45. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  46. package/Components/ModalComponent/Header/Title.tsx +70 -0
  47. package/Components/ModalComponent/Header/assets.ts +4 -0
  48. package/Components/ModalComponent/Header/index.tsx +71 -0
  49. package/Components/ModalComponent/Header/utils.ts +79 -0
  50. package/Components/ModalComponent/index.tsx +38 -0
  51. package/Components/ModalComponent/utils.ts +126 -0
  52. package/Components/PlayerContainer/PlayerContainer.tsx +60 -31
  53. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  54. package/Components/PlayerImageBackground/index.tsx +34 -8
  55. package/Components/River/ComponentsMap/ComponentsMap.tsx +91 -2
  56. package/Components/River/RefreshControl.tsx +55 -1
  57. package/Components/River/TV/River.tsx +4 -3
  58. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -1
  59. package/Components/River/__tests__/componentsMap.test.js +7 -0
  60. package/Components/River/useScreenConfiguration.ts +2 -2
  61. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -0
  62. package/Components/RouteManager/__tests__/routeManager.test.js +9 -2
  63. package/Components/RouteManager/index.tsx +5 -3
  64. package/Components/Screen/__tests__/Screen.test.tsx +88 -74
  65. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +24 -6
  66. package/Components/Screen/__tests__/navigationHandler.test.ts +1 -178
  67. package/Components/Screen/index.tsx +103 -43
  68. package/Components/Screen/navigationHandler.ts +0 -82
  69. package/Components/ScreenResolver/index.tsx +1 -1
  70. package/Components/Tabs/TV/styles.ts +1 -1
  71. package/Components/VideoLive/LiveImageManager.ts +2 -2
  72. package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -28
  73. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  74. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +18 -28
  75. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +78 -0
  76. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +342 -0
  77. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +151 -0
  78. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +438 -0
  79. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +154 -0
  80. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  81. package/Components/VideoModal/ModalAnimation/utils.ts +299 -0
  82. package/Components/VideoModal/PlayerDetails.tsx +3 -0
  83. package/Components/VideoModal/PlayerWrapper.tsx +66 -43
  84. package/Components/VideoModal/VideoModal.tsx +25 -42
  85. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  86. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +5 -1
  87. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +246 -166
  88. package/Components/VideoModal/utils.ts +3 -3
  89. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  90. package/Components/Viewport/ViewportTracker/ViewportTracker.tsx +1 -1
  91. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  92. package/Components/Viewport/ViewportTracker/index.tsx +1 -0
  93. package/Components/Viewport/utils.js +1 -1
  94. package/Components/ZappUIComponent/index.tsx +22 -12
  95. package/Components/index.js +2 -0
  96. package/Contexts/MenuToggleContext/{index.js → index.ts} +16 -0
  97. package/Contexts/ScreenContext/__tests__/__snapshots__/index.test.tsx.snap +3 -0
  98. package/Contexts/ScreenContext/__tests__/index.test.tsx +27 -0
  99. package/Contexts/ScreenContext/index.tsx +95 -29
  100. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  101. package/events/index.ts +1 -0
  102. package/package.json +5 -5
  103. package/Components/VideoModal/hooks/usePosition.ts +0 -50
  104. /package/Contexts/{index.js → index.ts} +0 -0
@@ -1,249 +1,329 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`PlayerWrapper renders inline 1`] = `
4
- <RNCSafeAreaView
5
- edges={
6
- Object {
7
- "bottom": "off",
8
- "left": "off",
9
- "right": "off",
10
- "top": "additive",
11
- }
12
- }
4
+ <RNCSafeAreaProvider
5
+ onInsetsChange={[Function]}
13
6
  style={
14
7
  Array [
15
8
  Object {
16
- "flexDirection": "column",
17
- },
18
- Object {
19
- "backgroundColor": "transparent",
20
- },
21
- Object {
22
- "height": 800,
23
- "width": 300,
9
+ "flex": 1,
24
10
  },
25
- Object {},
11
+ undefined,
26
12
  ]
27
13
  }
28
14
  >
29
- <View
15
+ <RNCSafeAreaView
16
+ edges={
17
+ Object {
18
+ "bottom": "off",
19
+ "left": "off",
20
+ "right": "off",
21
+ "top": "additive",
22
+ }
23
+ }
30
24
  style={
31
25
  Array [
32
26
  Object {
33
- "alignSelf": "center",
34
- "position": "relative",
35
- "zIndex": 200,
27
+ "backgroundColor": "transparent",
36
28
  },
37
29
  Object {
38
- "aspectRatio": 1.7777777777777777,
39
- "height": undefined,
40
- "width": "100%",
30
+ "height": 800,
31
+ "width": 300,
41
32
  },
42
33
  Object {},
43
- Object {},
44
34
  ]
45
35
  }
46
- testID="test-player-container"
47
- />
48
- <View
49
- configuration={
50
- Object {
51
- "tablet_landscape_player_container_background_color": "red",
52
- "tablet_landscape_sidebar_width": "35%",
53
- }
54
- }
55
- entry={
56
- Object {
57
- "id": "test",
36
+ >
37
+ <View
38
+ additionalData={
39
+ Object {
40
+ "saveArea": true,
41
+ }
58
42
  }
59
- }
60
- isTabletLandscape={false}
61
- style={
62
- Object {
63
- "flex": 1,
64
- "paddingTop": 20,
43
+ animationType="moveUpComponent"
44
+ style={
45
+ Object {
46
+ "flexDirection": "column",
47
+ }
65
48
  }
66
- }
67
- />
68
- </RNCSafeAreaView>
49
+ >
50
+ <View
51
+ style={
52
+ Array [
53
+ Object {
54
+ "alignSelf": "center",
55
+ "position": "relative",
56
+ "zIndex": 200,
57
+ },
58
+ Object {
59
+ "aspectRatio": 1.7777777777777777,
60
+ "height": undefined,
61
+ "width": "100%",
62
+ },
63
+ Object {},
64
+ Object {},
65
+ ]
66
+ }
67
+ testID="test-player-container"
68
+ />
69
+ <View
70
+ style={
71
+ Object {
72
+ "flex": 1,
73
+ }
74
+ }
75
+ />
76
+ </View>
77
+ </RNCSafeAreaView>
78
+ </RNCSafeAreaProvider>
69
79
  `;
70
80
 
71
81
  exports[`PlayerWrapper renders inline and docked 1`] = `
72
- <RNCSafeAreaView
73
- edges={
74
- Object {
75
- "bottom": "additive",
76
- "left": "off",
77
- "right": "off",
78
- "top": "off",
79
- }
80
- }
82
+ <RNCSafeAreaProvider
83
+ onInsetsChange={[Function]}
81
84
  style={
82
85
  Array [
83
86
  Object {
84
- "flexDirection": "column",
85
- },
86
- Object {
87
- "backgroundColor": "transparent",
88
- },
89
- Object {
90
- "height": 50,
91
- "width": 300,
87
+ "flex": 1,
92
88
  },
93
- Object {},
89
+ undefined,
94
90
  ]
95
91
  }
96
92
  >
97
- <View
93
+ <RNCSafeAreaView
94
+ edges={
95
+ Object {
96
+ "bottom": "off",
97
+ "left": "off",
98
+ "right": "off",
99
+ "top": "additive",
100
+ }
101
+ }
98
102
  style={
99
103
  Array [
100
104
  Object {
101
- "alignSelf": "center",
102
- "position": "relative",
103
- "zIndex": 200,
105
+ "backgroundColor": "transparent",
104
106
  },
105
107
  Object {
106
- "aspectRatio": undefined,
107
- "height": 50,
108
- "width": "100%",
108
+ "height": undefined,
109
+ "width": 300,
109
110
  },
110
111
  Object {},
111
- Object {},
112
112
  ]
113
113
  }
114
- testID="test-player-container"
115
- />
116
- <View
117
- style={
118
- Object {
119
- "flex": 1,
120
- "paddingTop": 20,
114
+ >
115
+ <View
116
+ additionalData={
117
+ Object {
118
+ "saveArea": true,
119
+ }
121
120
  }
122
- }
123
- />
124
- </RNCSafeAreaView>
121
+ animationType="moveUpComponent"
122
+ style={
123
+ Object {
124
+ "flexDirection": "column",
125
+ }
126
+ }
127
+ >
128
+ <View
129
+ style={
130
+ Array [
131
+ Object {
132
+ "alignSelf": "center",
133
+ "position": "relative",
134
+ "zIndex": 200,
135
+ },
136
+ Object {
137
+ "aspectRatio": undefined,
138
+ "height": undefined,
139
+ "width": "100%",
140
+ },
141
+ Object {},
142
+ Object {},
143
+ ]
144
+ }
145
+ testID="test-player-container"
146
+ />
147
+ <View
148
+ style={
149
+ Object {
150
+ "flex": 1,
151
+ }
152
+ }
153
+ />
154
+ </View>
155
+ </RNCSafeAreaView>
156
+ </RNCSafeAreaProvider>
125
157
  `;
126
158
 
127
159
  exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
128
- <RNCSafeAreaView
129
- edges={
130
- Object {
131
- "bottom": "off",
132
- "left": "off",
133
- "right": "off",
134
- "top": "additive",
135
- }
136
- }
160
+ <RNCSafeAreaProvider
161
+ onInsetsChange={[Function]}
137
162
  style={
138
163
  Array [
139
164
  Object {
140
- "flexDirection": "row",
141
- },
142
- Object {
143
- "backgroundColor": "red",
144
- },
145
- Object {
146
- "height": 800,
147
- "width": 300,
165
+ "flex": 1,
148
166
  },
149
- Object {},
167
+ undefined,
150
168
  ]
151
169
  }
152
170
  >
153
- <View
171
+ <RNCSafeAreaView
172
+ edges={
173
+ Object {
174
+ "bottom": "off",
175
+ "left": "off",
176
+ "right": "off",
177
+ "top": "additive",
178
+ }
179
+ }
154
180
  style={
155
181
  Array [
156
182
  Object {
157
- "alignSelf": "center",
158
- "position": "relative",
159
- "zIndex": 200,
183
+ "backgroundColor": "red",
160
184
  },
161
185
  Object {
162
- "aspectRatio": 1.7777777777777777,
163
- "height": undefined,
164
- "width": 195,
186
+ "height": 800,
187
+ "width": 300,
165
188
  },
166
189
  Object {},
167
- Object {},
168
190
  ]
169
191
  }
170
- testID="test-player-container"
171
- />
172
- <View
173
- configuration={
174
- Object {
175
- "tablet_landscape_player_container_background_color": "red",
176
- "tablet_landscape_sidebar_width": "35%",
177
- }
178
- }
179
- entry={
180
- Object {
181
- "id": "test",
192
+ >
193
+ <View
194
+ additionalData={
195
+ Object {
196
+ "saveArea": true,
197
+ }
182
198
  }
183
- }
184
- isTabletLandscape={true}
185
- style={
186
- Object {
187
- "flex": 1,
188
- "paddingTop": 20,
199
+ animationType="moveUpComponent"
200
+ style={
201
+ Object {
202
+ "flexDirection": "row",
203
+ }
189
204
  }
190
- }
191
- />
192
- </RNCSafeAreaView>
205
+ >
206
+ <View
207
+ style={
208
+ Array [
209
+ Object {
210
+ "alignSelf": "center",
211
+ "position": "relative",
212
+ "zIndex": 200,
213
+ },
214
+ Object {
215
+ "aspectRatio": 1.7777777777777777,
216
+ "height": undefined,
217
+ "width": 195,
218
+ },
219
+ Object {},
220
+ Object {},
221
+ ]
222
+ }
223
+ testID="test-player-container"
224
+ >
225
+ <View
226
+ additionalData={
227
+ Object {
228
+ "disableAnimatedComponent": false,
229
+ "resetAnimationValue": undefined,
230
+ "useLayoutMeasure": true,
231
+ }
232
+ }
233
+ animationType="moveUpComponent"
234
+ style={
235
+ Object {
236
+ "flex": 1,
237
+ }
238
+ }
239
+ />
240
+ </View>
241
+ <View
242
+ style={
243
+ Object {
244
+ "flex": 1,
245
+ }
246
+ }
247
+ />
248
+ </View>
249
+ </RNCSafeAreaView>
250
+ </RNCSafeAreaProvider>
193
251
  `;
194
252
 
195
253
  exports[`PlayerWrapper renders properly 1`] = `
196
- <RNCSafeAreaView
197
- edges={
198
- Object {
199
- "bottom": "off",
200
- "left": "off",
201
- "right": "off",
202
- "top": "additive",
203
- }
204
- }
254
+ <RNCSafeAreaProvider
255
+ onInsetsChange={[Function]}
205
256
  style={
206
257
  Array [
207
258
  Object {
208
- "flexDirection": "column",
209
- },
210
- Object {
211
- "backgroundColor": "transparent",
212
- },
213
- Object {
214
- "height": 800,
215
- "width": 300,
259
+ "flex": 1,
216
260
  },
217
- Object {},
261
+ undefined,
218
262
  ]
219
263
  }
220
264
  >
221
- <View
265
+ <RNCSafeAreaView
266
+ edges={
267
+ Object {
268
+ "bottom": "off",
269
+ "left": "off",
270
+ "right": "off",
271
+ "top": "additive",
272
+ }
273
+ }
222
274
  style={
223
275
  Array [
224
276
  Object {
225
- "alignSelf": "center",
226
- "position": "relative",
227
- "zIndex": 200,
277
+ "backgroundColor": "transparent",
228
278
  },
229
279
  Object {
230
- "aspectRatio": 1.7786666666666666,
231
- "height": undefined,
232
- "width": "100%",
280
+ "height": 800,
281
+ "width": 300,
233
282
  },
234
283
  Object {},
235
- Object {},
236
284
  ]
237
285
  }
238
- testID="test-player-container"
239
- />
240
- <View
241
- style={
242
- Object {
243
- "flex": 1,
244
- "paddingTop": 20,
286
+ >
287
+ <View
288
+ additionalData={
289
+ Object {
290
+ "saveArea": true,
291
+ }
245
292
  }
246
- }
247
- />
248
- </RNCSafeAreaView>
293
+ animationType="moveUpComponent"
294
+ style={
295
+ Object {
296
+ "flexDirection": "column",
297
+ }
298
+ }
299
+ >
300
+ <View
301
+ style={
302
+ Array [
303
+ Object {
304
+ "alignSelf": "center",
305
+ "position": "relative",
306
+ "zIndex": 200,
307
+ },
308
+ Object {
309
+ "aspectRatio": 1.7786666666666666,
310
+ "height": undefined,
311
+ "width": "100%",
312
+ },
313
+ Object {},
314
+ Object {},
315
+ ]
316
+ }
317
+ testID="test-player-container"
318
+ />
319
+ <View
320
+ style={
321
+ Object {
322
+ "flex": 1,
323
+ }
324
+ }
325
+ />
326
+ </View>
327
+ </RNCSafeAreaView>
328
+ </RNCSafeAreaProvider>
249
329
  `;
@@ -23,13 +23,13 @@ export const useConfiguration = () => {
23
23
  const targetScreenConfiguration = rivers?.[targetScreenId];
24
24
 
25
25
  const pluginConfiguration =
26
- pluginConfigurations[targetScreenConfiguration.type].configuration_json;
26
+ pluginConfigurations[targetScreenConfiguration?.type]?.configuration_json;
27
27
 
28
28
  const playerPluginConfig = playerManager.getPluginConfiguration();
29
29
 
30
30
  const config = R.mergeRight(playerPluginConfig, {
31
- ...targetScreenConfiguration.general,
32
- ...targetScreenConfiguration.styles,
31
+ ...targetScreenConfiguration?.general,
32
+ ...targetScreenConfiguration?.styles,
33
33
  ...pluginConfiguration,
34
34
  });
35
35
 
@@ -1,35 +1,38 @@
1
1
  /* eslint-disable react/prop-types */
2
2
 
3
- jest.mock("react-native", () => {
4
- const { ScrollView } = jest.requireActual("react-native");
3
+ import * as React from "react";
4
+
5
+ import { shallow } from "enzyme";
6
+ import { create, act } from "react-test-renderer";
7
+ import { shallowToJson } from "enzyme-to-json";
8
+
9
+ import { ViewportEvents } from "../../ViewportEvents";
10
+
11
+ jest.useFakeTimers();
5
12
 
13
+ jest.mock("react-native/Libraries/ReactNative/UIManager", () => {
6
14
  return {
7
- ScrollView,
8
- UIManager: {
9
- measureLayout: jest.fn((handle, parent, error, success) => {
10
- success(100, 100, 400, 400);
11
- }),
12
- },
13
- findNodeHandle: jest.fn(() => 1234),
14
- Animated: {
15
- timing: jest.fn(() => ({ start: jest.fn() })),
15
+ ...jest.requireActual("react-native/Libraries/ReactNative/NativeUIManager"),
16
+ measureLayout: (handle, parent, error, success) => {
17
+ success(100, 100, 400, 400);
16
18
  },
17
19
  };
18
20
  });
19
21
 
20
- import * as React from "react";
22
+ jest.mock("react-native/Libraries/Renderer/shims/ReactNative", () => ({
23
+ ...jest.requireActual("react-native/Libraries/Renderer/shims/ReactNative"),
24
+ findNodeHandle: () => 1234,
25
+ }));
21
26
 
22
- import { shallow } from "enzyme";
23
- import TestRenderer from "react-test-renderer";
24
- import { act } from "@testing-library/react-hooks";
25
- import { shallowToJson } from "enzyme-to-json";
27
+ const ReactNative = require("react-native");
26
28
 
27
- import { ViewportEvents } from "../../ViewportEvents";
29
+ const { Animated, ScrollView } = ReactNative;
30
+
31
+ Animated.timing = jest.fn(() => ({ start: jest.fn() }));
28
32
 
29
33
  const viewportEventsManager = new ViewportEvents(true);
30
34
 
31
- const { ScrollView } = require("react-native");
32
- const { ViewportAware } = require("../index");
35
+ const { ViewportAware } = require("../");
33
36
  const { ViewportTracker } = require("../../ViewportTracker");
34
37
 
35
38
  const TestComponent = (props) => {
@@ -116,7 +119,7 @@ describe("<ViewportAware />", () => {
116
119
  });
117
120
 
118
121
  it("invokes the onViewportEnter function when entering the viewport", () => {
119
- const wrapper = TestRenderer.create(
122
+ const wrapper = create(
120
123
  getWrapper(() => (
121
124
  <TestComponent
122
125
  preTriggerRatio={0.1}
@@ -134,6 +137,8 @@ describe("<ViewportAware />", () => {
134
137
  width: 1920,
135
138
  height: 1080,
136
139
  });
140
+
141
+ jest.runAllTimers();
137
142
  });
138
143
 
139
144
  expect(wrapper.toJSON()).toMatchSnapshot();
@@ -151,7 +156,7 @@ describe("<ViewportAware />", () => {
151
156
  });
152
157
 
153
158
  it("invokes the onViewportLeave function when leaving the viewport", () => {
154
- const wrapper = TestRenderer.create(
159
+ const wrapper = create(
155
160
  getWrapper(() => (
156
161
  <TestComponent
157
162
  preTriggerRatio={0.1}
@@ -15,7 +15,7 @@ export function ViewportTracker(props) {
15
15
 
16
16
  const assignRef = React.useCallback(
17
17
  (ref) => {
18
- callOnChildren(children, "ref", ref);
18
+ children?.ref?.(ref);
19
19
  setNodeHandle(findNodeHandle(ref));
20
20
  },
21
21
  [children]
@@ -5,11 +5,10 @@ import { ViewportEvents } from "../../ViewportEvents";
5
5
 
6
6
  const TestComponent = () => <ScrollView />;
7
7
 
8
- jest.mock("react-native", () => {
9
- return {
10
- findNodeHandle: jest.fn(() => 1234),
11
- };
12
- });
8
+ jest.mock("react-native/Libraries/Renderer/shims/ReactNative", () => ({
9
+ ...jest.requireActual("react-native/Libraries/Renderer/shims/ReactNative"),
10
+ findNodeHandle: () => 1234,
11
+ }));
13
12
 
14
13
  const viewportEventsManager = new ViewportEvents(true);
15
14
 
@@ -6,6 +6,7 @@ import { ViewportEventContext, ViewportEvents } from "../ViewportEvents";
6
6
  type Props = {
7
7
  viewportEventsManager?: any;
8
8
  children: React.ReactNode;
9
+ flatListRef?: any; // this ref is used to bind to children component
9
10
  };
10
11
 
11
12
  export function ViewportTracker(props: Props) {
@@ -2,7 +2,7 @@ import * as React from "react";
2
2
 
3
3
  export function callOnChildren(children, method, ...args) {
4
4
  const childMethod = React.Children.only(children).props[method];
5
- childMethod && childMethod(...args);
5
+ typeof childMethod === "function" && childMethod?.(...args);
6
6
  }
7
7
 
8
8
  export function isInViewport(