@applicaster/zapp-react-native-ui-components 13.0.0-alpha.7210171818 → 13.0.0-alpha.7222542422

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 (97) hide show
  1. package/Components/AppContainer/__tests__/__snapshots__/AppContainer.test.js.snap +1 -1
  2. package/Components/AudioPlayer/__tests__/__snapshots__/Runtime.test.js.snap +4 -4
  3. package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +3 -3
  4. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +6 -6
  5. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +7 -7
  6. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +3 -3
  7. package/Components/AudioPlayer/__tests__/__snapshots__/summary.test.js.snap +2 -2
  8. package/Components/AudioPlayer/__tests__/__snapshots__/title.test.js.snap +2 -2
  9. package/Components/BaseFocusable/index.tsx +65 -28
  10. package/Components/Cell/Cell.tsx +11 -9
  11. package/Components/Cell/CellWithFocusable.tsx +1 -1
  12. package/Components/Cell/TvOSCellComponent.tsx +23 -30
  13. package/Components/Cell/index.js +3 -1
  14. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +20 -20
  15. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +5 -3
  16. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +5 -5
  17. package/Components/ComponentResolver/__tests__/componentResolver.test.js +11 -9
  18. package/Components/DisplayState/__tests__/__snapshots__/displayState.test.js.snap +2 -2
  19. package/Components/Focusable/Focusable.tsx +0 -54
  20. package/Components/Focusable/FocusableTvOS.tsx +6 -2
  21. package/Components/FocusableList/index.tsx +25 -10
  22. package/Components/FocusableScrollView/index.tsx +39 -12
  23. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +76 -7
  24. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +53 -9
  25. package/Components/Layout/TV/NavBarContainer.tsx +8 -7
  26. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +1 -0
  27. package/Components/Layout/TV/__tests__/__snapshots__/LayoutContainer.test.tsx.snap +1 -1
  28. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +3 -3
  29. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +9 -9
  30. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  31. package/Components/Layout/TV/__tests__/index.test.tsx +7 -3
  32. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +1 -1
  33. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +3 -3
  34. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  35. package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +180 -180
  36. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +7 -7
  37. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +34 -34
  38. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
  39. package/Components/NativeFocusables/{index.js → index.ts} +4 -2
  40. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +7 -7
  41. package/Components/OfflineHandler/__tests__/index.test.tsx +28 -25
  42. package/Components/PlayerContainer/PlayerContainer.tsx +5 -11
  43. package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
  44. package/Components/River/RefreshControl.tsx +1 -1
  45. package/Components/River/TV/index.tsx +6 -1
  46. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +17 -17
  47. package/Components/River/__tests__/__snapshots__/river.test.js.snap +12 -12
  48. package/Components/River/__tests__/componentsMap.test.js +47 -12
  49. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -1
  50. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +1 -1
  51. package/Components/Screen/__tests__/Screen.test.tsx +41 -27
  52. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +4 -4
  53. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +2 -2
  54. package/Components/ScreenResolver/__tests__/screenResolver.test.js +31 -27
  55. package/Components/Tabs/Tab.tsx +1 -0
  56. package/Components/TextInputTv/__tests__/TextInputTv.test.js +42 -42
  57. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +7 -0
  58. package/Components/TextInputTv/index.tsx +2 -2
  59. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +2 -2
  60. package/Components/Transitioner/__tests__/__snapshots__/AnimationManager.test.js.snap +26 -26
  61. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +9 -9
  62. package/Components/Transitioner/__tests__/__snapshots__/config.test.js.snap +20 -20
  63. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -2
  64. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +12 -7
  65. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +6 -6
  66. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +5 -1
  67. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +5 -1
  68. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +1 -1
  69. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +4 -10
  70. package/Components/VideoModal/ModalAnimation/index.ts +2 -1
  71. package/Components/VideoModal/ModalAnimation/useModalAnimationContext.ts +6 -0
  72. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -2
  73. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +12 -9
  74. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +4 -4
  75. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +78 -78
  76. package/Components/VideoModal/utils.ts +2 -4
  77. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +2 -2
  78. package/Components/Viewport/ViewportTracker/__tests__/__snapshots__/viewportTracker.test.js.snap +1 -1
  79. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +11 -11
  80. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +30 -30
  81. package/Contexts/ComponentsMapOffsetContext/index.tsx +41 -0
  82. package/Contexts/ConfigutaionContext/__tests__/__snapshots__/ConfigurationProvider.test.tsx.snap +1 -1
  83. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +18 -11
  84. package/Decorators/Analytics/{index.js → index.tsx} +11 -11
  85. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +2 -2
  86. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +77 -77
  87. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +34 -39
  88. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -9
  89. package/Decorators/RiverFeedLoader/index.tsx +1 -1
  90. package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +39 -0
  91. package/Decorators/RiverFeedLoader/utils/index.ts +29 -0
  92. package/Decorators/RiverFeedLoader/utils/usePipesContexts.ts +40 -0
  93. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +5 -5
  94. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +16 -10
  95. package/Decorators/ZappPipesDataConnector/index.tsx +1 -1
  96. package/package.json +12 -6
  97. package/Decorators/RiverFeedLoader/utils.ts +0 -100
@@ -3,7 +3,7 @@
3
3
  exports[`<AppContainer /> renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "backgroundColor": "rgba(255, 255, 255, 1)",
8
8
  "flex": 1,
9
9
  }
@@ -3,7 +3,7 @@
3
3
  exports[`<Runtime /> LTR renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "height": 40,
8
8
  "justifyContent": "flex-start",
9
9
  "width": 600,
@@ -12,7 +12,7 @@ exports[`<Runtime /> LTR renders correctly 1`] = `
12
12
  >
13
13
  <Text
14
14
  style={
15
- Object {
15
+ {
16
16
  "alignItems": "flex-end",
17
17
  "color": "white",
18
18
  "flexDirection": "row",
@@ -32,7 +32,7 @@ exports[`<Runtime /> LTR renders correctly 1`] = `
32
32
  exports[`<Runtime /> RTL renders correctly 1`] = `
33
33
  <View
34
34
  style={
35
- Object {
35
+ {
36
36
  "height": 40,
37
37
  "justifyContent": "flex-end",
38
38
  "width": 600,
@@ -41,7 +41,7 @@ exports[`<Runtime /> RTL renders correctly 1`] = `
41
41
  >
42
42
  <Text
43
43
  style={
44
- Object {
44
+ {
45
45
  "alignItems": "flex-start",
46
46
  "color": "white",
47
47
  "flexDirection": "row-reverse",
@@ -3,7 +3,7 @@
3
3
  exports[`<Artwork /> renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "marginHorizontal": 24,
8
8
  }
9
9
  }
@@ -12,12 +12,12 @@ exports[`<Artwork /> renders correctly 1`] = `
12
12
  fadeDuration={0}
13
13
  resizeMode="cover"
14
14
  source={
15
- Object {
15
+ {
16
16
  "uri": "https://example.com",
17
17
  }
18
18
  }
19
19
  style={
20
- Object {
20
+ {
21
21
  "height": 400,
22
22
  "width": 400,
23
23
  }
@@ -3,7 +3,7 @@
3
3
  exports[`<AudioPlayer /> renders correctly 1`] = `
4
4
  <AudioPlayerLayout
5
5
  config={
6
- Object {
6
+ {
7
7
  "artworkAspectRatio": "1:1",
8
8
  "audioPlayerBackgroundImageQuery": "",
9
9
  "backgroundColor": "black",
@@ -21,11 +21,11 @@ exports[`<AudioPlayer /> renders correctly 1`] = `
21
21
  "titleFontSize": undefined,
22
22
  }
23
23
  }
24
- style={Object {}}
24
+ style={{}}
25
25
  >
26
26
  <Channel
27
27
  config={
28
- Object {
28
+ {
29
29
  "artworkAspectRatio": "1:1",
30
30
  "audioPlayerBackgroundImageQuery": "",
31
31
  "backgroundColor": "black",
@@ -47,7 +47,7 @@ exports[`<AudioPlayer /> renders correctly 1`] = `
47
47
  />
48
48
  <Title
49
49
  config={
50
- Object {
50
+ {
51
51
  "artworkAspectRatio": "1:1",
52
52
  "audioPlayerBackgroundImageQuery": "",
53
53
  "backgroundColor": "black",
@@ -69,7 +69,7 @@ exports[`<AudioPlayer /> renders correctly 1`] = `
69
69
  />
70
70
  <Summary
71
71
  config={
72
- Object {
72
+ {
73
73
  "artworkAspectRatio": "1:1",
74
74
  "audioPlayerBackgroundImageQuery": "",
75
75
  "backgroundColor": "black",
@@ -98,7 +98,7 @@ exports[`<AudioPlayer /> renders correctly 1`] = `
98
98
  audio_player_summary_color="white"
99
99
  audio_player_title_color="white"
100
100
  config={
101
- Object {
101
+ {
102
102
  "artworkAspectRatio": "1:1",
103
103
  "audioPlayerBackgroundImageQuery": "",
104
104
  "backgroundColor": "black",
@@ -4,7 +4,7 @@ exports[`<AudioPlayerLayout /> renders correctly 1`] = `
4
4
  <View
5
5
  pointerEvents="none"
6
6
  style={
7
- Object {
7
+ {
8
8
  "backgroundColor": "transparent",
9
9
  "overflow": "hidden",
10
10
  }
@@ -12,12 +12,12 @@ exports[`<AudioPlayerLayout /> renders correctly 1`] = `
12
12
  >
13
13
  <ForwardRef(AnimatedComponentWrapper)
14
14
  style={
15
- Array [
16
- Object {
15
+ [
16
+ {
17
17
  "backgroundColor": "transparent",
18
18
  "overflow": "hidden",
19
19
  },
20
- Object {
20
+ {
21
21
  "opacity": 0,
22
22
  },
23
23
  ]
@@ -26,19 +26,19 @@ exports[`<AudioPlayerLayout /> renders correctly 1`] = `
26
26
  <ImageBackground
27
27
  resizeMode="cover"
28
28
  source={
29
- Object {
29
+ {
30
30
  "uri": "https://example.com",
31
31
  }
32
32
  }
33
33
  style={
34
- Object {
34
+ {
35
35
  "flex": 1,
36
36
  }
37
37
  }
38
38
  >
39
39
  <View
40
40
  style={
41
- Object {
41
+ {
42
42
  "backgroundColor": "transparent",
43
43
  "overflow": "hidden",
44
44
  }
@@ -3,7 +3,7 @@
3
3
  exports[`<Channel /> renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "height": 72,
8
8
  "marginBottom": 30,
9
9
  "width": 128,
@@ -13,12 +13,12 @@ exports[`<Channel /> renders correctly 1`] = `
13
13
  <Image
14
14
  fadeDuration={0}
15
15
  source={
16
- Object {
16
+ {
17
17
  "uri": "https://example.com",
18
18
  }
19
19
  }
20
20
  style={
21
- Object {
21
+ {
22
22
  "height": 72,
23
23
  "width": 128,
24
24
  }
@@ -3,7 +3,7 @@
3
3
  exports[`<Summary /> renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "height": 80,
8
8
  "marginBottom": 30,
9
9
  "width": 600,
@@ -13,7 +13,7 @@ exports[`<Summary /> renders correctly 1`] = `
13
13
  <Text
14
14
  numberOfLines={2}
15
15
  style={
16
- Object {
16
+ {
17
17
  "color": "white",
18
18
  "fontFamily": null,
19
19
  "fontSize": 20,
@@ -3,7 +3,7 @@
3
3
  exports[`<Title /> renders correctly 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "height": 100,
8
8
  "marginBottom": 12,
9
9
  "width": 600,
@@ -13,7 +13,7 @@ exports[`<Title /> renders correctly 1`] = `
13
13
  <Text
14
14
  numberOfLines={2}
15
15
  style={
16
- Object {
16
+ {
17
17
  "color": "white",
18
18
  "fontFamily": null,
19
19
  "fontSize": 38,
@@ -1,4 +1,5 @@
1
1
  import * as React from "react";
2
+ import * as R from "ramda";
2
3
 
3
4
  import {
4
5
  BaseFocusable as BaseFocusableInterface,
@@ -7,7 +8,6 @@ import {
7
8
 
8
9
  import { createReactRef } from "@applicaster/zapp-react-native-utils/reactUtils";
9
10
  import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils/focusManager";
10
- import * as FOCUS_EVENTS from "@applicaster/zapp-react-native-utils/appUtils/focusManager/events";
11
11
  import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
12
12
 
13
13
  type ScrollDirection = FocusManager.IOS.Direction | FocusManager.Web.Direction;
@@ -131,12 +131,6 @@ export class BaseFocusable<
131
131
  willLoseFocus: FocusManager.FocusEventCB = (focusable, scrollDirection) => {
132
132
  const { willLoseFocus = noop } = this.props;
133
133
  willLoseFocus(focusable, scrollDirection);
134
-
135
- focusManager.invokeHandler?.(
136
- FOCUS_EVENTS.WILL_LOSE_FOCUS,
137
- this,
138
- scrollDirection
139
- );
140
134
  };
141
135
 
142
136
  willReceiveFocus: FocusManager.FocusEventCB = (
@@ -145,12 +139,6 @@ export class BaseFocusable<
145
139
  ) => {
146
140
  const { willReceiveFocus = noop } = this.props;
147
141
  willReceiveFocus(focusable, scrollDirection);
148
-
149
- focusManager.invokeHandler?.(
150
- FOCUS_EVENTS.WILL_RECEIVE_FOCUS,
151
- this,
152
- scrollDirection
153
- );
154
142
  };
155
143
 
156
144
  /**
@@ -163,8 +151,6 @@ export class BaseFocusable<
163
151
  const { onFocus = noop } = this.props;
164
152
  this.setFocusedState(true);
165
153
  onFocus(focusable, scrollDirection);
166
-
167
- focusManager.invokeHandler?.(FOCUS_EVENTS.FOCUS, this, scrollDirection);
168
154
  };
169
155
 
170
156
  /**
@@ -179,12 +165,6 @@ export class BaseFocusable<
179
165
  ) => {
180
166
  const { hasReceivedFocus = noop } = this.props;
181
167
  hasReceivedFocus(focusable, scrollDirection);
182
-
183
- focusManager.invokeHandler?.(
184
- FOCUS_EVENTS.HAS_RECEIVED_FOCUS,
185
- this,
186
- scrollDirection
187
- );
188
168
  };
189
169
 
190
170
  /**
@@ -196,12 +176,6 @@ export class BaseFocusable<
196
176
  hasLostFocus: FocusManager.FocusEventCB = (focusable, scrollDirection) => {
197
177
  const { hasLostFocus = noop } = this.props;
198
178
  hasLostFocus(focusable, scrollDirection);
199
-
200
- focusManager.invokeHandler?.(
201
- FOCUS_EVENTS.HAS_LOST_FOCUS,
202
- this,
203
- scrollDirection
204
- );
205
179
  };
206
180
 
207
181
  /**
@@ -228,7 +202,6 @@ export class BaseFocusable<
228
202
  const { onBlur = noop } = this.props;
229
203
  this.setFocusedState(false);
230
204
  onBlur(focusable, scrollDirection);
231
- focusManager.invokeHandler?.(FOCUS_EVENTS.BLUR, this, scrollDirection);
232
205
  };
233
206
 
234
207
  onPress = (keyEvent?: Nullable<React.MouseEvent>) => {
@@ -269,4 +242,68 @@ export class BaseFocusable<
269
242
  this.setState({ focused });
270
243
  }
271
244
  };
245
+
246
+ /**
247
+ * will invoke the underlying component's focus method
248
+ * @param {Object} scrollDirection
249
+ * @returns {Promise}
250
+ */
251
+ focus(_, scrollDirection) {
252
+ return this.onFocus(this, scrollDirection); // invokeComponentMethod(this, "onFocus", scrollDirection);
253
+ }
254
+
255
+ /**
256
+ * will invoke the underlying component's blur method
257
+ * @param {Object} scrollDirection
258
+ * @returns {Promise}
259
+ */
260
+ blur(
261
+ _,
262
+ scrollDirection?: FocusManager.Web.Direction | FocusManager.IOS.Direction
263
+ ) {
264
+ return this.onBlur(this, scrollDirection);
265
+ }
266
+
267
+ /**
268
+ * Sets the focus on this item. Will trigger sequentially a sequence of
269
+ * functions (willReceiveFocus, focus, hasReceivedFocus). If these functions (defined in the Focusable
270
+ * Item underlying component) return promises, execution will wait before it proceeds to the next. This
271
+ * is useful for triggering sequential operations that specifically require to fully run before or after
272
+ * focus is actually set on that item.
273
+ * @param {string} scrollDirection string representation of the direction of the navigation which landed
274
+ * to this item being focused
275
+ */
276
+ _executeFocusSequence(methodNames, scrollDirection) {
277
+ return R.reduce(
278
+ (sequence, methodName) => {
279
+ const method = this[methodName]; // Access the method by name
280
+
281
+ if (typeof method !== "function") {
282
+ throw new Error(
283
+ `Method '${methodName}' not found or not a function.`
284
+ );
285
+ }
286
+
287
+ return sequence
288
+ .then(() => method.call(this, scrollDirection))
289
+ .catch((e) => {
290
+ throw e; // Re-throw for consistent error handling
291
+ });
292
+ },
293
+ Promise.resolve(),
294
+ methodNames
295
+ );
296
+ }
297
+
298
+ setFocus(scrollDirection) {
299
+ const focusMethods = ["willReceiveFocus", "focus", "hasReceivedFocus"];
300
+
301
+ return this._executeFocusSequence(focusMethods, scrollDirection);
302
+ }
303
+
304
+ setBlur(scrollDirection) {
305
+ const blurMethods = ["willLoseFocus", "blur", "hasLostFocus"];
306
+
307
+ return this._executeFocusSequence(blurMethods, scrollDirection);
308
+ }
272
309
  }
@@ -14,10 +14,7 @@ import { BaseFocusable } from "../BaseFocusable";
14
14
  import { AccessibilityManager } from "@applicaster/zapp-react-native-utils/appUtils/accessibilityManager";
15
15
 
16
16
  type Props = {
17
- item: {
18
- id: string;
19
- title: string;
20
- };
17
+ item: ZappEntry;
21
18
  index: number;
22
19
  shouldScrollHorizontally: (arg1: [any]) => boolean | null | undefined;
23
20
  shouldScrollVertically: (...args: any) => boolean | null | undefined;
@@ -33,10 +30,9 @@ type Props = {
33
30
  id: string;
34
31
  };
35
32
  selected?: boolean;
36
- CellRenderer: React.ComponentType<{
37
- item: any;
38
- state: string;
39
- }> & { hasFocusableInside: (item: Record<string, string>) => boolean };
33
+ CellRenderer: React.FunctionComponent<any> & {
34
+ hasFocusableInside: (item: ZappEntry) => boolean;
35
+ };
40
36
  preferredFocus: boolean;
41
37
  navigator: {
42
38
  push: (arg1: Record<any, any>) => void;
@@ -65,6 +61,7 @@ type Props = {
65
61
  skipFocusManagerRegistration?: boolean;
66
62
  shouldUpdate: boolean;
67
63
  behavior: Behavior;
64
+ componentsMapOffset: number;
68
65
  };
69
66
 
70
67
  type State = {
@@ -276,7 +273,12 @@ export class CellComponent extends React.Component<Props, State> {
276
273
 
277
274
  if (isFocused) {
278
275
  const accessibilityManager = AccessibilityManager.getInstance();
279
- accessibilityManager.readText({ text: item.title });
276
+
277
+ accessibilityManager.readText({
278
+ text: String(
279
+ item.extensions?.accessibility?.label || item.title
280
+ ),
281
+ });
280
282
  }
281
283
 
282
284
  return (
@@ -46,7 +46,7 @@ const useCellFocusedState = (
46
46
 
47
47
  type Props = {
48
48
  item: ZappEntry;
49
- CellRenderer: React.ComponentType<{ item: Object; state: string }>;
49
+ CellRenderer: React.FunctionComponent<any>;
50
50
  id: string;
51
51
  groupId: string;
52
52
  onFocus: Function;
@@ -2,7 +2,7 @@ import * as React from "react";
2
2
  import * as R from "ramda";
3
3
  import { View, StyleSheet } from "react-native";
4
4
 
5
- import { Focusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable";
5
+ import { Focusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable/FocusableTvOS";
6
6
  import { FocusableCell } from "@applicaster/zapp-react-native-ui-components/Components/FocusableCell";
7
7
  import { getItemType } from "@applicaster/zapp-react-native-utils/navigationUtils";
8
8
  import { SCREEN_TYPES } from "@applicaster/zapp-react-native-utils/navigationUtils/itemTypes";
@@ -10,10 +10,6 @@ import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils/focu
10
10
  import { sendSelectCellEvent } from "@applicaster/zapp-react-native-utils/analyticsUtils";
11
11
  import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
12
12
  import { CellWithFocusable } from "./CellWithFocusable";
13
- import { getCellState } from "./utils";
14
-
15
- const _getCellState = (focused, selected) =>
16
- getCellState({ focused, selected });
17
13
 
18
14
  type Props = {
19
15
  item: ZappEntry;
@@ -36,10 +32,9 @@ type Props = {
36
32
  component_type: string;
37
33
  };
38
34
  selected: boolean;
39
- CellRenderer: React.ComponentType<{
40
- item: any;
41
- state: string;
42
- }> & { hasFocusableInside: (item: any) => boolean };
35
+ CellRenderer: React.FunctionComponent<any> & {
36
+ hasFocusableInside: (item: any) => boolean;
37
+ };
43
38
  preferredFocus: boolean;
44
39
  navigator: {
45
40
  push: (arg1: Record<any, any>) => void;
@@ -70,6 +65,7 @@ type Props = {
70
65
  isFocusable: boolean;
71
66
  shouldUpdate: boolean;
72
67
  behavior: Behavior;
68
+ componentsMapOffset: number;
73
69
  };
74
70
 
75
71
  type State = {
@@ -184,6 +180,7 @@ export class TvOSCellComponent extends React.Component<Props, State> {
184
180
  groupId,
185
181
  component,
186
182
  index,
183
+ componentsMapOffset,
187
184
  } = this.props;
188
185
 
189
186
  this.setScreenLayout(componentAnchorPointY, screenLayout);
@@ -198,13 +195,11 @@ export class TvOSCellComponent extends React.Component<Props, State> {
198
195
  const extraAnchorPointYOffset =
199
196
  screenLayout?.extraAnchorPointYOffset || 0;
200
197
 
201
- const marginTop = screenLayout?.screenMarginTop || 0;
202
-
203
198
  const totalOffset =
204
199
  headerOffset +
205
- (componentAnchorPointY || 0) +
206
- extraAnchorPointYOffset -
207
- marginTop;
200
+ (componentAnchorPointY || 0) +
201
+ extraAnchorPointYOffset -
202
+ componentsMapOffset || 0;
208
203
 
209
204
  mainOffsetUpdater?.(
210
205
  { tag: this.target },
@@ -252,7 +247,7 @@ export class TvOSCellComponent extends React.Component<Props, State> {
252
247
 
253
248
  const focusableId = R.join("-", [component?.id, id, index]);
254
249
 
255
- const handleFocus = (arg1: any, index: number) => {
250
+ const handleFocus = (arg1: any, index?: number) => {
256
251
  const focusFn = onFocus || noop;
257
252
  focusFn(arg1, index);
258
253
 
@@ -285,7 +280,7 @@ export class TvOSCellComponent extends React.Component<Props, State> {
285
280
  <View onLayout={this.onLayout} style={styles.container}>
286
281
  <Focusable
287
282
  id={focusableId}
288
- groupId={groupId || component?.id}
283
+ groupId={String(groupId || component?.id)}
289
284
  onFocus={handleFocus}
290
285
  onBlur={onBlur || this.onBlur}
291
286
  isParallaxDisabled={this.layout?.width > 1740}
@@ -297,20 +292,18 @@ export class TvOSCellComponent extends React.Component<Props, State> {
297
292
  style={baseCellStyles}
298
293
  isFocusable={isFocusable}
299
294
  >
300
- {(focused) => {
301
- return (
302
- <FocusableCell
303
- {...{
304
- index,
305
- CellRenderer,
306
- item,
307
- focused: this.props.focused || selectedCell || focused,
308
- scrollTo: this.scrollTo,
309
- behavior,
310
- }}
311
- />
312
- );
313
- }}
295
+ {(focused) => (
296
+ <FocusableCell
297
+ {...{
298
+ index,
299
+ CellRenderer,
300
+ item,
301
+ focused: !!(this.props.focused || selectedCell || focused),
302
+ scrollTo: this.scrollTo,
303
+ behavior,
304
+ }}
305
+ />
306
+ )}
314
307
  </Focusable>
315
308
  </View>
316
309
  );
@@ -11,6 +11,7 @@ import { ScreenScrollingContext } from "../../Contexts/ScreenScrollingContext";
11
11
 
12
12
  import { ScreenLayoutContextConsumer } from "../../Contexts/ScreenLayoutContext";
13
13
  import { createContext } from "@applicaster/zapp-react-native-utils/reactUtils/createContext";
14
+ import { withComponentsMapOffsetContextConsumer } from "../../Contexts/ComponentsMapOffsetContext";
14
15
 
15
16
  // TODO | Gallery QB | Extract this
16
17
  export const ScrollInterceptorContext = createContext(
@@ -30,5 +31,6 @@ export const Cell = R.compose(
30
31
  RiverOffsetContext.withConsumer,
31
32
  HorizontalScrollContext.withConsumer,
32
33
  withConsumer,
33
- ScreenLayoutContextConsumer
34
+ ScreenLayoutContextConsumer,
35
+ withComponentsMapOffsetContextConsumer
34
36
  )(Component);
@@ -3,24 +3,24 @@
3
3
  exports[`CellRendererResolver renders correctly 1`] = `
4
4
  <View
5
5
  someProp={
6
- Object {
7
- "cellOptions": Object {},
8
- "cellStyles": Object {
9
- "ABCDE-123456": Object {
10
- "configuration": Object {},
6
+ {
7
+ "cellOptions": {},
8
+ "cellStyles": {
9
+ "ABCDE-123456": {
10
+ "configuration": {},
11
11
  "plugin_identifier": "custom_renderer_plugin",
12
12
  },
13
- "FGHIJ-123456": Object {
14
- "configuration": Object {},
13
+ "FGHIJ-123456": {
14
+ "configuration": {},
15
15
  "plugin_identifier": "unknown_plugin",
16
16
  },
17
17
  },
18
- "component": Object {
19
- "styles": Object {
18
+ "component": {
19
+ "styles": {
20
20
  "cell_plugin_configuration_id": "ABCDE-123456",
21
21
  },
22
22
  },
23
- "styles": Object {},
23
+ "styles": {},
24
24
  }
25
25
  }
26
26
  />
@@ -29,24 +29,24 @@ exports[`CellRendererResolver renders correctly 1`] = `
29
29
  exports[`CellRendererResolver with a default renderer plugin renders correctly 1`] = `
30
30
  <View
31
31
  someProp={
32
- Object {
33
- "cellOptions": Object {},
34
- "cellStyles": Object {
35
- "ABCDE-123456": Object {
36
- "configuration": Object {},
32
+ {
33
+ "cellOptions": {},
34
+ "cellStyles": {
35
+ "ABCDE-123456": {
36
+ "configuration": {},
37
37
  "plugin_identifier": "custom_renderer_plugin",
38
38
  },
39
- "FGHIJ-123456": Object {
40
- "configuration": Object {},
39
+ "FGHIJ-123456": {
40
+ "configuration": {},
41
41
  "plugin_identifier": "unknown_plugin",
42
42
  },
43
43
  },
44
- "component": Object {
45
- "styles": Object {
44
+ "component": {
45
+ "styles": {
46
46
  "cell_plugin_configuration_id": "ABCDE-123456",
47
47
  },
48
48
  },
49
- "styles": Object {},
49
+ "styles": {},
50
50
  }
51
51
  }
52
52
  />
@@ -2,9 +2,11 @@ import * as React from "react";
2
2
  import { View } from "react-native";
3
3
  import { shallow } from "enzyme";
4
4
 
5
- jest.mock("../../default-cell-renderer", () =>
6
- jest.fn((prop) => <View whoAmI="default renderer" someProp={prop} />)
7
- );
5
+ jest.mock("../../default-cell-renderer", () => {
6
+ const View = jest.requireActual("react-native").View;
7
+
8
+ return jest.fn((prop) => <View whoAmI="default renderer" someProp={prop} />);
9
+ });
8
10
 
9
11
  const { CellRendererResolver } = require("../index");
10
12
 
@@ -5,22 +5,22 @@ exports[`ComponentResolver renders correctly 1`] = `
5
5
  value={null}
6
6
  >
7
7
  <Memo(ComponentResolver)
8
- cellStyles={Object {}}
8
+ cellStyles={{}}
9
9
  component={
10
- Object {
10
+ {
11
11
  "component_type": "some_component",
12
12
  }
13
13
  }
14
14
  components={
15
- Object {
15
+ {
16
16
  "SomeComponent": [MockFunction],
17
17
  }
18
18
  }
19
19
  decorators={[MockFunction]}
20
20
  dispatch={[Function]}
21
- plugins={Array []}
21
+ plugins={[]}
22
22
  store={
23
- Object {
23
+ {
24
24
  "clearActions": [Function],
25
25
  "dispatch": [Function],
26
26
  "getActions": [Function],