@applicaster/zapp-react-native-ui-components 13.0.0-alpha.4120155420 → 13.0.0-alpha.4133940547

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 (184) hide show
  1. package/Components/AppContainer/__tests__/AppContainer.test.js +4 -6
  2. package/Components/AppContainer/__tests__/__snapshots__/AppContainer.test.js.snap +1 -1
  3. package/Components/AudioPlayer/AudioPlayer.tsx +7 -0
  4. package/Components/AudioPlayer/__tests__/Runtime.test.js +5 -8
  5. package/Components/AudioPlayer/__tests__/__snapshots__/Runtime.test.js.snap +4 -4
  6. package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +3 -3
  7. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +56 -113
  8. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayerLayout.test.js.snap +39 -23
  9. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +3 -3
  10. package/Components/AudioPlayer/__tests__/__snapshots__/summary.test.js.snap +2 -2
  11. package/Components/AudioPlayer/__tests__/__snapshots__/title.test.js.snap +2 -2
  12. package/Components/AudioPlayer/__tests__/artWork.test.js +3 -5
  13. package/Components/AudioPlayer/__tests__/audioPlayer.test.js +3 -5
  14. package/Components/AudioPlayer/__tests__/audioPlayerLayout.test.js +7 -8
  15. package/Components/AudioPlayer/__tests__/channel.test.js +3 -5
  16. package/Components/AudioPlayer/__tests__/summary.test.js +3 -5
  17. package/Components/AudioPlayer/__tests__/title.test.js +3 -5
  18. package/Components/AudioPlayer/helpers.tsx +1 -0
  19. package/Components/BaseFocusable/index.ios.ts +1 -1
  20. package/Components/BaseFocusable/index.tsx +67 -31
  21. package/Components/Cell/Cell.tsx +15 -9
  22. package/Components/Cell/CellWithFocusable.tsx +44 -59
  23. package/Components/Cell/TvOSCellComponent.tsx +22 -29
  24. package/Components/Cell/__tests__/CellWIthFocusable.test.js +13 -6
  25. package/Components/Cell/index.js +3 -1
  26. package/Components/CellRendererResolver/__tests__/cellRendererResolver.test.js +50 -50
  27. package/Components/ComponentResolver/__tests__/__snapshots__/componentResolver.test.js.snap +1 -42
  28. package/Components/ComponentResolver/__tests__/componentResolver.test.js +26 -30
  29. package/Components/ContentScreen/__tests__/contentScreen.test.js +3 -3
  30. package/Components/DisplayState/__tests__/__snapshots__/displayState.test.js.snap +2 -2
  31. package/Components/ErrorScreen/index.tsx +6 -6
  32. package/Components/Focusable/Focusable.tsx +1 -54
  33. package/Components/Focusable/FocusableTvOS.tsx +6 -2
  34. package/Components/Focusable/Touchable.tsx +19 -20
  35. package/Components/Focusable/index.android.tsx +10 -3
  36. package/Components/FocusableGroup/FocusableTvOS.tsx +34 -86
  37. package/Components/FocusableGroup/index.tsx +0 -3
  38. package/Components/FocusableList/index.tsx +26 -10
  39. package/Components/FocusableScrollView/index.tsx +23 -8
  40. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +76 -7
  41. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +53 -9
  42. package/Components/Layout/TV/NavBarContainer.tsx +19 -23
  43. package/Components/Layout/TV/ScreenContainer.tsx +8 -1
  44. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +5 -0
  45. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +3 -1
  46. package/Components/Layout/TV/__tests__/__snapshots__/LayoutContainer.test.tsx.snap +1 -1
  47. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +6 -5
  48. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +12 -11
  49. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  50. package/Components/Layout/TV/__tests__/index.test.tsx +7 -3
  51. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -3
  52. package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +66 -0
  53. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +4 -1
  54. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +6 -12
  55. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/__tests__/index.test.ts +93 -0
  56. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +2 -2
  57. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +3 -3
  58. package/Components/MasterCell/DefaultComponents/SecondaryImage/utils.ts +1 -1
  59. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  60. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/__snapshots__/index.test.tsx.snap +1 -1
  61. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +2 -8
  62. package/Components/MasterCell/__tests__/__snapshots__/dataAdapter.test.js.snap +180 -180
  63. package/Components/MasterCell/__tests__/__snapshots__/elementMapper.test.js.snap +11 -19
  64. package/Components/MasterCell/__tests__/__snapshots__/masterCell.test.js.snap +6 -235
  65. package/Components/MasterCell/__tests__/elementMapper.test.js +18 -5
  66. package/Components/MasterCell/__tests__/masterCell.test.js +26 -26
  67. package/Components/MasterCell/hooks/useAsyncRendering/MasterCellAsyncRenderManager.ts +2 -2
  68. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +2 -2
  69. package/Components/MasterCell/utils/behaviorProvider.ts +133 -0
  70. package/Components/MasterCell/utils/index.ts +4 -130
  71. package/Components/ModalComponent/Button/index.tsx +6 -6
  72. package/Components/ModalComponent/Header/index.tsx +3 -3
  73. package/Components/NativeFocusables/{index.js → index.ts} +4 -2
  74. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +2 -2
  75. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +2 -2
  76. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +0 -5
  77. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +7 -7
  78. package/Components/OfflineHandler/__tests__/index.test.tsx +28 -25
  79. package/Components/PlayerContainer/PlayerContainer.tsx +31 -24
  80. package/Components/PlayerContainer/PlayerContainerContext.tsx +9 -0
  81. package/Components/PlayerContainer/ProgramInfo/index.tsx +2 -2
  82. package/Components/PlayerImageBackground/index.tsx +1 -1
  83. package/Components/River/ComponentsMap/ComponentsMap.tsx +42 -65
  84. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +78 -51
  85. package/Components/River/RefreshControl.tsx +1 -1
  86. package/Components/River/RiverFooter.tsx +39 -9
  87. package/Components/River/RiverItem.tsx +37 -2
  88. package/Components/River/TV/index.tsx +6 -1
  89. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +114 -45
  90. package/Components/River/__tests__/__snapshots__/river.test.js.snap +21 -83
  91. package/Components/River/__tests__/componentsMap.test.js +64 -17
  92. package/Components/River/__tests__/river.test.js +75 -40
  93. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +12 -5
  94. package/Components/RouteManager/__tests__/routeManager.test.js +29 -14
  95. package/Components/RouteManager/__tests__/testId.test.js +8 -6
  96. package/Components/Screen/TV/index.web.tsx +7 -6
  97. package/Components/Screen/__tests__/Screen.test.tsx +41 -27
  98. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +4 -4
  99. package/Components/Screen/hooks.ts +53 -0
  100. package/Components/Screen/index.tsx +16 -42
  101. package/Components/ScreenResolver/__tests__/screenResolver.test.js +95 -70
  102. package/Components/Tabs/Tab.tsx +12 -9
  103. package/Components/TextInputTv/__tests__/TextInputTv.test.js +42 -42
  104. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +7 -0
  105. package/Components/TextInputTv/index.tsx +6 -5
  106. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +2 -2
  107. package/Components/TrackedView/index.tsx +1 -0
  108. package/Components/Transitioner/AnimationManager.js +15 -15
  109. package/Components/Transitioner/Scene.tsx +53 -24
  110. package/Components/Transitioner/Transitioner.tsx +3 -3
  111. package/Components/Transitioner/__tests__/Scene.test.js +25 -14
  112. package/Components/Transitioner/__tests__/__snapshots__/AnimationManager.test.js.snap +26 -26
  113. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +10 -50
  114. package/Components/Transitioner/__tests__/__snapshots__/config.test.js.snap +20 -20
  115. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +4 -4
  116. package/Components/Transitioner/__tests__/transitioner.test.js +13 -4
  117. package/Components/Transitioner/index.js +8 -4
  118. package/Components/VideoLive/LiveImageManager.ts +27 -1
  119. package/Components/VideoLive/PlayerLiveImageComponent.tsx +36 -24
  120. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +63 -8
  121. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +6 -10
  122. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +1 -1
  123. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +49 -31
  124. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +8 -4
  125. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +32 -18
  126. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +8 -15
  127. package/Components/VideoModal/ModalAnimation/index.ts +2 -1
  128. package/Components/VideoModal/ModalAnimation/useModalAnimationContext.ts +6 -0
  129. package/Components/VideoModal/ModalAnimation/utils.ts +2 -2
  130. package/Components/VideoModal/OpaqueLayer.tsx +33 -0
  131. package/Components/VideoModal/PlayerDetails.tsx +9 -6
  132. package/Components/VideoModal/PlayerWrapper.tsx +17 -36
  133. package/Components/VideoModal/VideoModal.tsx +14 -23
  134. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -2
  135. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +13 -10
  136. package/Components/VideoModal/__tests__/__snapshots__/PlayerDetails.test.tsx.snap +4 -4
  137. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +66 -156
  138. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +89 -0
  139. package/Components/VideoModal/hooks/index.ts +7 -0
  140. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +49 -0
  141. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +91 -0
  142. package/Components/VideoModal/hooks/utils/index.ts +33 -0
  143. package/Components/VideoModal/utils.ts +3 -5
  144. package/Components/Viewport/ViewportAware/__tests__/__snapshots__/viewportAware.test.js.snap +24 -36
  145. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -18
  146. package/Components/Viewport/ViewportTracker/__tests__/__snapshots__/viewportTracker.test.js.snap +1 -1
  147. package/Components/Viewport/__tests__/utils.test.js +5 -4
  148. package/Components/ZappFrameworkComponents/BarView/BarView.tsx +1 -0
  149. package/Components/ZappUIComponent/Placeholder.tsx +3 -1
  150. package/Components/ZappUIComponent/__tests__/{ZappUIComponent.test.js → ZappUIComponent.test.tsx} +26 -10
  151. package/Components/ZappUIComponent/index.tsx +3 -16
  152. package/Components/default-cell-renderer/__tests__/defaultCellRenderer.test.tsx +20 -17
  153. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/__tests__/DefaultCell.test.tsx +15 -11
  154. package/Contexts/ComponentsMapOffsetContext/index.tsx +49 -0
  155. package/Contexts/ConfigutaionContext/__tests__/__snapshots__/ConfigurationProvider.test.tsx.snap +1 -1
  156. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +12 -11
  157. package/Contexts/HeaderOffsetContext/index.tsx +4 -6
  158. package/Contexts/ScreenContext/index.tsx +6 -12
  159. package/Contexts/ScreenLayoutContext/index.tsx +5 -3
  160. package/Decorators/Analytics/{index.js → index.tsx} +11 -11
  161. package/Decorators/Navigator/__tests__/navigator.test.js +16 -16
  162. package/Decorators/Navigator/index.tsx +1 -1
  163. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +77 -77
  164. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +34 -39
  165. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -9
  166. package/Decorators/RiverFeedLoader/index.tsx +1 -1
  167. package/Decorators/RiverFeedLoader/utils/getDatasourceUrl.ts +39 -0
  168. package/Decorators/RiverFeedLoader/utils/index.ts +29 -0
  169. package/Decorators/RiverFeedLoader/utils/usePipesContexts.ts +40 -0
  170. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +27 -27
  171. package/Decorators/RiverResolver/index.tsx +6 -8
  172. package/Decorators/ZappPipesDataConnector/__tests__/Hero.js +1 -1
  173. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +29 -22
  174. package/Decorators/ZappPipesDataConnector/index.tsx +5 -2
  175. package/package.json +13 -10
  176. package/tsconfig.json +2 -3
  177. package/Components/CellRendererResolver/__tests__/__snapshots__/cellRendererResolver.test.js.snap +0 -53
  178. package/Components/RouteManager/__tests__/__snapshots__/testId.test.js.snap +0 -17
  179. package/Components/ScreenResolver/__tests__/__snapshots__/screenResolver.test.js.snap +0 -17
  180. package/Components/ZappUIComponent/__tests__/__snapshots__/ZappUIComponent.test.js.snap +0 -91
  181. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +0 -338
  182. package/Decorators/Navigator/__tests__/__snapshots__/navigator.test.js.snap +0 -18
  183. package/Decorators/RiverFeedLoader/utils.ts +0 -100
  184. package/Decorators/RiverResolver/__tests__/__snapshots__/riverResolver.test.tsx.snap +0 -28
@@ -1,16 +1,13 @@
1
- import React, { useEffect, useMemo } from "react";
1
+ import React, { useMemo } from "react";
2
2
  import * as R from "ramda";
3
3
  import validateColor from "validate-color";
4
4
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
5
5
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
6
6
 
7
7
  import { masterCellLogger } from "../logger";
8
- import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
9
- import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
10
- import { PushTopicManager } from "@applicaster/zapp-react-native-bridge/PushNotifications/PushTopicManager";
11
- import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-bridge/ZappStorage/StorageMultiSelectProvider";
12
8
  import { getCellState } from "../../Cell/utils";
13
9
  import { getColorFromData } from "@applicaster/zapp-react-native-utils/cellUtils";
10
+ import { isCellSelected, useBehaviorUpdate } from "./behaviorProvider";
14
11
 
15
12
  const hasElementSpecificViewType = (viewType) => (element) => {
16
13
  if (R.isNil(element)) {
@@ -103,7 +100,7 @@ export const useFilterChildren = <
103
100
  item: any;
104
101
  pluginIdentifier: string;
105
102
  };
106
- }
103
+ },
107
104
  >(
108
105
  children: T[]
109
106
  ): T[] => {
@@ -194,130 +191,7 @@ export const getFocusedButtonId = (focusable) => {
194
191
  };
195
192
 
196
193
  export const isSelected = (id: string | number, behavior?: Behavior) => {
197
- if (!behavior) {
198
- return false;
199
- }
200
-
201
- if (behavior?.selection_source === "now_playing") {
202
- const player = playerManager.getActivePlayer();
203
-
204
- if (player?.entry?.id === id) {
205
- return true;
206
- }
207
- }
208
-
209
- if (behavior?.select_mode === "single") {
210
- return behavior.current_selection === id;
211
- }
212
-
213
- if (behavior?.select_mode === "multi") {
214
- // TODO: Use generic resolver source
215
-
216
- if (behavior.selection_source === "@{push/topics}") {
217
- const tags = PushTopicManager.getInstance().getRegisteredTags();
218
-
219
- return tags.includes(String(id));
220
- }
221
-
222
- if (Array.isArray(behavior.current_selection)) {
223
- return behavior.current_selection.includes(id);
224
- }
225
-
226
- const currentSelection = String(behavior.current_selection);
227
-
228
- if (currentSelection?.startsWith("@{ctx/")) {
229
- const keyWithoutCtx = currentSelection.substring(
230
- "@{ctx/".length,
231
- currentSelection.length - 1
232
- );
233
-
234
- const selectedItems =
235
- StorageMultiSelectProvider.getProvider(
236
- keyWithoutCtx
237
- )?.getSelectedItems();
238
-
239
- return selectedItems?.includes(String(id));
240
- }
241
- }
242
-
243
- return false;
244
- };
245
-
246
- export const useBehaviorUpdate = (behavior: Behavior) => {
247
- const [lastUpdate, setLastUpdate] = React.useState(null);
248
-
249
- const player = usePlayer();
250
-
251
- const triggerUpdate = () => {
252
- setLastUpdate(Date.now());
253
- };
254
-
255
- // TODO: Create generic RX to state update
256
- useEffect(() => {
257
- // TODO: Use generic resolver source
258
- if (!behavior) {
259
- return;
260
- }
261
-
262
- const currentSelection = String(behavior.current_selection);
263
-
264
- if (currentSelection?.startsWith("@{ctx/")) {
265
- const keyWithoutCtx = currentSelection.substring(
266
- "@{ctx/".length,
267
- currentSelection.length - 1
268
- );
269
-
270
- if (keyWithoutCtx) {
271
- const subscription = StorageMultiSelectProvider.getProvider(
272
- keyWithoutCtx
273
- )
274
- .getObservable()
275
- .subscribe(() => {
276
- triggerUpdate();
277
- });
278
-
279
- return () => {
280
- subscription.unsubscribe();
281
- };
282
- }
283
- }
284
- }, [behavior]);
285
-
286
- useEffect(() => {
287
- if (!behavior) {
288
- return;
289
- }
290
-
291
- if (behavior?.selection_source === "@{push/topics}") {
292
- const subscription = PushTopicManager.getInstance()
293
- .getEntryObservable()
294
- .subscribe(() => {
295
- triggerUpdate();
296
- });
297
-
298
- return () => {
299
- subscription.unsubscribe();
300
- };
301
- }
302
- }, [behavior]);
303
-
304
- useEffect(() => {
305
- if (!behavior) {
306
- return;
307
- }
308
-
309
- if (behavior?.selection_source === "now_playing" && player) {
310
- const subscription = player.getEntryObservable().subscribe(() => {
311
- triggerUpdate();
312
- });
313
-
314
- return () => {
315
- subscription.unsubscribe();
316
- };
317
- }
318
- }, [behavior, player]);
319
-
320
- return lastUpdate;
194
+ return isCellSelected(id, behavior);
321
195
  };
322
196
 
323
197
  export const useCellState = ({
@@ -3,8 +3,8 @@ import { StyleSheet, TouchableOpacity, View } from "react-native";
3
3
  import { Item, ItemProps } from "./Item";
4
4
  import { ItemIcon, ItemIconProps } from "./ItemIcon";
5
5
  import { ItemLabel, ItemLabelProps } from "./ItemLabel";
6
- import { defaultSelectedAsset } from "./assets";
7
6
  import * as assets from "./assets";
7
+ import { defaultSelectedAsset } from "./assets";
8
8
 
9
9
  type ButtonProps = {
10
10
  configuration: any;
@@ -92,18 +92,18 @@ export function Button({
92
92
  >
93
93
  <Item {...itemProps} focused={focused} selected={selected}>
94
94
  <View style={styles.label_icon_container}>
95
- {itemIconProps.asset && itemIconProps.asset.length > 0 && (
95
+ {itemIconProps.asset && itemIconProps.asset.length > 0 ? (
96
96
  <ItemIcon {...itemIconProps} />
97
- )}
98
- {itemLabelProps.label && (
97
+ ) : null}
98
+ {itemLabelProps.label ? (
99
99
  <ItemLabel
100
100
  {...itemLabelProps}
101
101
  focused={focused}
102
102
  selected={selected}
103
103
  />
104
- )}
104
+ ) : null}
105
105
  </View>
106
- {selected && <ItemIcon {...selectedItemIconProps} />}
106
+ {selected ? <ItemIcon {...selectedItemIconProps} /> : null}
107
107
  </Item>
108
108
  </TouchableOpacity>
109
109
  </View>
@@ -1,5 +1,5 @@
1
1
  import React, { useMemo } from "react";
2
- import { View, StyleSheet, LayoutChangeEvent } from "react-native";
2
+ import { LayoutChangeEvent, StyleSheet, View } from "react-native";
3
3
  import { Title, TitleProps } from "./Title";
4
4
  import { CloseButton, CloseButtonProps } from "./CloseButton";
5
5
  import { getCloseButtonProps, getTitleProps } from "./utils";
@@ -60,8 +60,8 @@ export function ModalHeader(props: Props) {
60
60
  width: width - buttonsContainerWidth,
61
61
  }}
62
62
  >
63
- {title && <Title {...titleProps} />}
64
- {summary && <Title {...summaryProps} />}
63
+ {title ? <Title {...titleProps} /> : null}
64
+ {summary ? <Title {...summaryProps} /> : null}
65
65
  </View>
66
66
  <View style={{ width: buttonsContainerWidth }}>
67
67
  <CloseButton {...closeButtonProps} />
@@ -1,10 +1,12 @@
1
1
  import { requireNativeComponent, View } from "react-native";
2
2
  import { isAppleTV } from "@applicaster/zapp-react-native-ui-components/Helpers/Platform";
3
3
 
4
+ // @TODO define the types
4
5
  export const FocusableGroupNative = isAppleTV()
5
- ? requireNativeComponent("FocusableGroupViewModule", null)
6
+ ? requireNativeComponent<any>("FocusableGroupViewModule")
6
7
  : View;
7
8
 
9
+ // @TODO define the types
8
10
  export const FocusableItemNative = isAppleTV()
9
- ? requireNativeComponent("FocusableViewModule", null)
11
+ ? requireNativeComponent<any>("FocusableViewModule")
10
12
  : View;
@@ -90,7 +90,7 @@ export const NotificationView = (props: Props) => {
90
90
  return (
91
91
  <div onClick={onClose}>
92
92
  {children}
93
- {open && (
93
+ {open ? (
94
94
  <div style={styles.body}>
95
95
  <div style={styles.title}>
96
96
  <h2>{MSG}</h2>
@@ -98,7 +98,7 @@ export const NotificationView = (props: Props) => {
98
98
 
99
99
  <h4 style={styles.subtitle}>{EXTRA_MSG}</h4>
100
100
  </div>
101
- )}
101
+ ) : null}
102
102
  </div>
103
103
  );
104
104
  };
@@ -85,7 +85,7 @@ export const NotificationView = (props: Props) => {
85
85
  return (
86
86
  <div onClick={onClose}>
87
87
  {children}
88
- {shown && (
88
+ {shown ? (
89
89
  <div style={styles.body}>
90
90
  <div style={styles.title}>
91
91
  <h2>{title}</h2>
@@ -93,7 +93,7 @@ export const NotificationView = (props: Props) => {
93
93
 
94
94
  <h4 style={styles.subtitle}>{subtitle}</h4>
95
95
  </div>
96
- )}
96
+ ) : null}
97
97
  </div>
98
98
  );
99
99
  };
@@ -1,7 +1,6 @@
1
1
  import React from "react";
2
2
  import { Text, Animated } from "react-native";
3
3
 
4
- import { shallow } from "enzyme";
5
4
  import renderer from "react-test-renderer";
6
5
 
7
6
  jest.useFakeTimers();
@@ -40,10 +39,6 @@ const {
40
39
  } = require("../NotificationView");
41
40
 
42
41
  describe("NotificationView", () => {
43
- it("renders", () => {
44
- shallow(<NotificationView dismiss={dismiss} />);
45
- });
46
-
47
42
  it("Show online message when Online", () => {
48
43
  const component = renderer.create(
49
44
  <NotificationView online dismiss={dismiss} />
@@ -3,7 +3,7 @@
3
3
  exports[`OfflineHandler renders 1`] = `
4
4
  <View
5
5
  style={
6
- Object {
6
+ {
7
7
  "flex": 1,
8
8
  "position": "relative",
9
9
  }
@@ -11,7 +11,7 @@ exports[`OfflineHandler renders 1`] = `
11
11
  >
12
12
  <View
13
13
  style={
14
- Object {
14
+ {
15
15
  "bottom": 0,
16
16
  "left": 0,
17
17
  "position": "absolute",
@@ -32,7 +32,7 @@ exports[`OfflineHandler renders 1`] = `
32
32
  onResponderTerminationRequest={[Function]}
33
33
  onStartShouldSetResponder={[Function]}
34
34
  style={
35
- Object {
35
+ {
36
36
  "alignItems": "center",
37
37
  "backgroundColor": undefined,
38
38
  "flex": 1,
@@ -43,8 +43,8 @@ exports[`OfflineHandler renders 1`] = `
43
43
  "position": "absolute",
44
44
  "right": 0,
45
45
  "top": 0,
46
- "transform": Array [
47
- Object {
46
+ "transform": [
47
+ {
48
48
  "translateY": -88,
49
49
  },
50
50
  ],
@@ -54,7 +54,7 @@ exports[`OfflineHandler renders 1`] = `
54
54
  >
55
55
  <View
56
56
  style={
57
- Object {
57
+ {
58
58
  "backgroundColor": undefined,
59
59
  "height": 44,
60
60
  }
@@ -62,7 +62,7 @@ exports[`OfflineHandler renders 1`] = `
62
62
  />
63
63
  <Text
64
64
  style={
65
- Object {
65
+ {
66
66
  "color": undefined,
67
67
  "fontFamily": undefined,
68
68
  "fontSize": undefined,
@@ -2,43 +2,46 @@ import React from "react";
2
2
 
3
3
  import renderer, { act } from "react-test-renderer";
4
4
 
5
- jest.useFakeTimers();
5
+ jest.useFakeTimers({ legacyFakeTimers: true });
6
6
 
7
- let connectionStatus = false;
8
- const previousValue = null;
7
+ let mockConnectionStatus = false;
8
+ const mockPreviousValue = null;
9
9
 
10
10
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/connection", () => {
11
11
  return {
12
- useConnectionInfo: jest.fn(() => connectionStatus),
12
+ useConnectionInfo: jest.fn(() => mockConnectionStatus),
13
13
  };
14
14
  });
15
15
 
16
16
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/utils", () => {
17
17
  return {
18
- usePrevious: jest.fn(() => previousValue),
18
+ usePrevious: jest.fn(() => mockPreviousValue),
19
19
  };
20
20
  });
21
21
 
22
- jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
23
- usePickFromState: () => ({
24
- plugins: [
25
- {
26
- name: "offline experience",
27
- identifier: "offline-experience",
28
- type: "general",
29
- module: {
30
- useOfflineExperienceConfiguration: () => ({
31
- configurationFields: {},
32
- localizations: {
33
- offline_toast_message: "No internet connection",
34
- online_toast_message: "You are back online",
35
- },
36
- }),
22
+ jest.mock(
23
+ "@applicaster/zapp-react-native-redux/hooks/usePickFromState",
24
+ () => ({
25
+ usePickFromState: () => ({
26
+ plugins: [
27
+ {
28
+ name: "offline experience",
29
+ identifier: "offline-experience",
30
+ type: "general",
31
+ module: {
32
+ useOfflineExperienceConfiguration: () => ({
33
+ configurationFields: {},
34
+ localizations: {
35
+ offline_toast_message: "No internet connection",
36
+ online_toast_message: "You are back online",
37
+ },
38
+ }),
39
+ },
37
40
  },
38
- },
39
- ],
40
- }),
41
- }));
41
+ ],
42
+ }),
43
+ })
44
+ );
42
45
 
43
46
  jest.mock("react-native-safe-area-context", () => ({
44
47
  useSafeAreaInsets: () => ({ top: 44 }),
@@ -53,7 +56,7 @@ describe("OfflineHandler", () => {
53
56
  });
54
57
 
55
58
  it("renders Notification mode if component was rendered while online", () => {
56
- connectionStatus = true;
59
+ mockConnectionStatus = true;
57
60
 
58
61
  let instance;
59
62
 
@@ -1,17 +1,17 @@
1
1
  import * as React from "react";
2
+ import { useEffect, useReducer } from "react";
2
3
  // @ts-ignore
3
- import { View, ViewStyle, TVMenuControl } from "react-native";
4
+ import { TVMenuControl, View, ViewStyle } from "react-native";
4
5
  import * as R from "ramda";
5
6
  import uuid from "uuid/v4";
6
7
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
7
8
  import {
8
9
  isApplePlatform,
9
- platformSelect,
10
10
  isTV,
11
+ platformSelect,
11
12
  } from "@applicaster/zapp-react-native-utils/reactUtils";
12
13
 
13
14
  import { TVEventHandlerComponent } from "@applicaster/zapp-react-native-tvos-ui-components/Components/TVEventHandlerComponent";
14
- import { useEffect, useReducer } from "react";
15
15
  import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
16
16
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
17
17
  import {
@@ -29,16 +29,14 @@ import {
29
29
  import { ProgramInfo } from "./ProgramInfo";
30
30
  import { AudioPlayer } from "../AudioPlayer";
31
31
  import {
32
- playerContainerLogger,
33
32
  log_debug,
34
33
  log_info,
35
34
  log_warning,
35
+ playerContainerLogger,
36
36
  } from "./logger";
37
37
  import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
38
- import {
39
- useSetNavbarState,
40
- useTargetScreenData,
41
- } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
38
+ import { useSetNavbarState } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
39
+ import { useTargetScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
42
40
  import {
43
41
  PlayerContainerContext,
44
42
  PlayerContainerContextProvider,
@@ -55,8 +53,8 @@ import { usePlayNextOverlay } from "@applicaster/zapp-react-native-utils/appUtil
55
53
  import { PlayNextState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/OverlayObserver/OverlaysObserver";
56
54
 
57
55
  import {
58
- useModalAnimationContext,
59
56
  PlayerAnimationStateEnum,
57
+ useModalAnimationContext,
60
58
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
61
59
 
62
60
  type Props = {
@@ -93,6 +91,15 @@ export type PlayNextData = {
93
91
  onPlayNextPerformNextVideoPlay: () => void;
94
92
  };
95
93
 
94
+ export type PlayerState = {
95
+ duration: number;
96
+ currentTime?: number;
97
+ seekableDuration: number;
98
+ isLive: boolean;
99
+ isBuffering: boolean;
100
+ isPaused: boolean;
101
+ };
102
+
96
103
  const focusableBottomContainerId = "player-container-bottom";
97
104
 
98
105
  // Styles
@@ -337,9 +344,9 @@ const PlayerContainerComponent = (props: Props) => {
337
344
 
338
345
  const resumeTime = Number(item?.extensions?.resumeTime);
339
346
 
340
- // TODO: This is temp hack, will be removed on next pr with player refactoring
347
+ // Сhecking that the player itself knows where to start playing, and there is no need to call seekTo after returning from the Сhromecast
341
348
  if (
342
- !!playerManager.getActivePlayer()?.getContinueWatchingOffset === false &&
349
+ !playerManager.getActivePlayer()?.hasResumePosition() &&
343
350
  !isNaN(resumeTime)
344
351
  ) {
345
352
  player?.seekTo(resumeTime);
@@ -382,7 +389,7 @@ const PlayerContainerComponent = (props: Props) => {
382
389
  }
383
390
  };
384
391
 
385
- const playerRemoteHandler = (component, event, isLanguageOverlayVisible) => {
392
+ const playerRemoteHandler = (event, isLanguageOverlayVisible) => {
386
393
  const { eventType } = event;
387
394
 
388
395
  if (!isLanguageOverlayVisible && eventType === "menu") {
@@ -516,6 +523,12 @@ const PlayerContainerComponent = (props: Props) => {
516
523
  useEffect(() => {
517
524
  playerEvent("source_changed", { item });
518
525
 
526
+ return () => {
527
+ playerEvent("player_did_close", { item });
528
+ };
529
+ }, [item?.id, Player]);
530
+
531
+ useEffect(() => {
519
532
  if (!isModal) {
520
533
  showNavBar(false);
521
534
  }
@@ -525,13 +538,11 @@ const PlayerContainerComponent = (props: Props) => {
525
538
  }
526
539
 
527
540
  return () => {
528
- playerEvent("player_did_close", { item });
529
-
530
541
  if (!isModal) {
531
542
  showNavBar(true);
532
543
  }
533
544
  };
534
- }, [showNavBar, /* added as suggested: */ item?.id, isModal, Player]);
545
+ }, [showNavBar, isModal, Player]);
535
546
 
536
547
  useEffect(() => {
537
548
  if (prevItemId && !R.equals(prevItemId, item?.id)) {
@@ -625,12 +636,8 @@ const PlayerContainerComponent = (props: Props) => {
625
636
  <PlayerContainerContext.Consumer>
626
637
  {(context) => (
627
638
  <TVEventHandlerComponent
628
- tvEventHandler={(component, event) =>
629
- playerRemoteHandler(
630
- component,
631
- event,
632
- context.isLanguageOverlayVisible
633
- )
639
+ tvEventHandler={(_component, event) =>
640
+ playerRemoteHandler(event, context.isLanguageOverlayVisible)
634
641
  }
635
642
  >
636
643
  <FocusableGroup
@@ -689,10 +696,10 @@ const PlayerContainerComponent = (props: Props) => {
689
696
 
690
697
  {renderRestPlayers(restPlayerProps)}
691
698
 
692
- {state.error && <ErrorDisplay error={state.error} />}
699
+ {state.error ? <ErrorDisplay error={state.error} /> : null}
693
700
  </View>
694
701
  {/* Components container */}
695
- {isInlineTV && context.showComponentsContainer && (
702
+ {isInlineTV && context.showComponentsContainer ? (
696
703
  <View
697
704
  style={styles.inlineRiver}
698
705
  testID={"inline-river-component-wrapper"}
@@ -723,7 +730,7 @@ const PlayerContainerComponent = (props: Props) => {
723
730
  )}
724
731
  </ComponentFocusableWrapperView>
725
732
  </View>
726
- )}
733
+ ) : null}
727
734
  </View>
728
735
  </FocusableGroup>
729
736
  </TVEventHandlerComponent>
@@ -9,11 +9,14 @@ type ContextProps = {
9
9
  setIsLanguageOverlayVisible: (isVisible) => void;
10
10
  setShowComponentsContainer: (isVisible) => void;
11
11
  showComponentsContainer: boolean;
12
+ setIsSeekBarTouch: (isTouch) => void;
13
+ isSeekBarTouch: boolean;
12
14
  };
13
15
 
14
16
  export const PlayerContainerContext = createContext({
15
17
  ignoreOffsetContainer: false,
16
18
  isLanguageOverlayVisible: false,
19
+ isSeekBarTouch: false,
17
20
  } as ContextProps);
18
21
 
19
22
  type Props = {
@@ -40,6 +43,8 @@ export const PlayerContainerContextProvider = ({
40
43
  const [showComponentsContainer, setShowComponentsContainer] =
41
44
  React.useState(true);
42
45
 
46
+ const [isSeekBarTouch, setIsSeekBarTouch] = React.useState(false);
47
+
43
48
  const value = React.useMemo(
44
49
  () => ({
45
50
  ignoreOffsetContainer,
@@ -49,6 +54,8 @@ export const PlayerContainerContextProvider = ({
49
54
  setIsLanguageOverlayVisible,
50
55
  showComponentsContainer,
51
56
  setShowComponentsContainer: inline ? setShowComponentsContainer : null,
57
+ isSeekBarTouch,
58
+ setIsSeekBarTouch,
52
59
  }),
53
60
  [
54
61
  ignoreOffsetContainer,
@@ -58,6 +65,8 @@ export const PlayerContainerContextProvider = ({
58
65
  setIsLanguageOverlayVisible,
59
66
  showComponentsContainer,
60
67
  setShowComponentsContainer,
68
+ isSeekBarTouch,
69
+ setIsSeekBarTouch,
61
70
  ]
62
71
  );
63
72
 
@@ -114,12 +114,12 @@ function ProgramInfoComponent({
114
114
  return (
115
115
  <View style={container}>
116
116
  <View style={programStyles.programInfo.container}>
117
- {logo && (
117
+ {logo ? (
118
118
  <Image
119
119
  source={{ uri: logo }}
120
120
  style={programStyles.programInfo.logo}
121
121
  />
122
- )}
122
+ ) : null}
123
123
  {!isAudioContent && transportInfo}
124
124
  </View>
125
125
  </View>
@@ -39,7 +39,7 @@ const PlayerImageBackgroundComponent = ({
39
39
  return (
40
40
  <View
41
41
  style={
42
- playerAnimationState === PlayerAnimationStateEnum.maximaze
42
+ playerAnimationState === PlayerAnimationStateEnum.maximize
43
43
  ? defaultImageDimensions
44
44
  : style
45
45
  }