@applicaster/zapp-react-native-ui-components 12.0.0-alpha.3977160850 → 12.0.0-alpha.4374801485

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 (45) hide show
  1. package/Components/Cell/Cell.tsx +2 -2
  2. package/Components/Cell/CellWithFocusable.tsx +21 -14
  3. package/Components/Cell/TvOSCellComponent.tsx +2 -2
  4. package/Components/ErrorScreen/index.tsx +1 -1
  5. package/Components/FocusableCell/index.tsx +7 -7
  6. package/Components/HookRenderer/index.tsx +1 -3
  7. package/Components/Image/Image.android.tsx +3 -25
  8. package/Components/Image/Image.tsx +18 -2
  9. package/Components/Image/utils/index.ts +39 -0
  10. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +41 -1
  11. package/Components/Layout/TV/__tests__/index.test.tsx +1 -13
  12. package/Components/Layout/TV/index.tsx +1 -1
  13. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  14. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  15. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +17 -2
  16. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  17. package/Components/MasterCell/DefaultComponents/Toggle.tsx +5 -1
  18. package/Components/MasterCell/utils/index.ts +18 -7
  19. package/Components/PlayerContainer/PlayerContainer.tsx +56 -29
  20. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  21. package/Components/PlayerImageBackground/index.tsx +34 -8
  22. package/Components/River/__tests__/componentsMap.test.js +7 -0
  23. package/Components/RouteManager/index.tsx +2 -2
  24. package/Components/Screen/__tests__/Screen.test.tsx +5 -1
  25. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +10 -0
  26. package/Components/Screen/index.tsx +15 -6
  27. package/Components/Tabs/TV/styles.ts +1 -1
  28. package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -28
  29. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  30. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +22 -27
  31. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +78 -0
  32. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +335 -0
  33. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +144 -0
  34. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +438 -0
  35. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +143 -0
  36. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  37. package/Components/VideoModal/ModalAnimation/utils.ts +299 -0
  38. package/Components/VideoModal/PlayerWrapper.tsx +64 -41
  39. package/Components/VideoModal/VideoModal.tsx +8 -25
  40. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +6 -1
  41. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +246 -166
  42. package/Components/VideoModal/utils.ts +3 -3
  43. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  44. package/package.json +5 -5
  45. package/Components/VideoModal/hooks/usePosition.ts +0 -50
@@ -54,6 +54,8 @@ import { toNumber } from "@applicaster/zapp-react-native-utils/numberUtils";
54
54
  import { usePlayNextOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayNextOverlay";
55
55
  import { PlayNextState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/OverlayObserver/OverlaysObserver";
56
56
 
57
+ import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
58
+
57
59
  type Props = {
58
60
  Player: React.ComponentType<any>;
59
61
  PlayerLoadingView?: React.ComponentType<any>; // 👀 we are not receiving this prop
@@ -145,34 +147,30 @@ const renderApplePlayer = ({
145
147
  }) => {
146
148
  const { title, summary } = item || {};
147
149
 
148
- if (!isApplePlatform()) {
150
+ if (!isAppleTV() || !player) {
151
+ return null;
152
+ }
153
+
154
+ if (isAudioContent) {
155
+ return (
156
+ <AudioPlayer
157
+ audio_item={item}
158
+ plugin_configuration={pluginConfiguration}
159
+ />
160
+ );
161
+ }
162
+
163
+ if (!playNextData && player.isPaused() && player.isAd() === false) {
149
164
  return null;
150
165
  }
151
166
 
152
167
  return (
153
- <>
154
- {!playNextData && (
155
- <>
156
- {!isAudioContent &&
157
- !!player?.isPaused() &&
158
- !!player?.isAd() === false && (
159
- <ProgramInfo
160
- title={title}
161
- subtitle={summary}
162
- plugin_configuration={pluginConfiguration}
163
- videoStyle={videoStyle}
164
- />
165
- )}
166
- </>
167
- )}
168
-
169
- {isAudioContent && (
170
- <AudioPlayer
171
- audio_item={item}
172
- plugin_configuration={pluginConfiguration}
173
- />
174
- )}
175
- </>
168
+ <ProgramInfo
169
+ title={title}
170
+ subtitle={summary}
171
+ plugin_configuration={pluginConfiguration}
172
+ videoStyle={videoStyle}
173
+ />
176
174
  );
177
175
  };
178
176
 
@@ -339,6 +337,18 @@ const PlayerContainerComponent = (props: Props) => {
339
337
  }
340
338
  }, [item?.id, item?.extensions?.resumeTime, player]);
341
339
 
340
+ const onVideoFullscreenPlayerWillPresent = React.useCallback(() => {
341
+ playerManager.invokeHandler("toggleFullscreen", {
342
+ fullscreen: true,
343
+ });
344
+ }, []);
345
+
346
+ const onVideoFullscreenPlayerWillDismiss = React.useCallback(() => {
347
+ playerManager.invokeHandler("toggleFullscreen", {
348
+ fullscreen: false,
349
+ });
350
+ }, []);
351
+
342
352
  // Util methods
343
353
  const toggleFullscreen = (event) => {
344
354
  const { fullscreen = false } = event || {};
@@ -381,17 +391,27 @@ const PlayerContainerComponent = (props: Props) => {
381
391
  id: playerContainerId,
382
392
  listener: {
383
393
  onVideoEnd,
384
- onError: onError,
385
- onLoad: onLoad,
394
+ onError,
395
+ onLoad,
386
396
  onPlayerClose: close,
387
397
  onPlayerDetached: close,
398
+ onVideoFullscreenPlayerWillDismiss,
399
+ onVideoFullscreenPlayerWillPresent,
388
400
  },
389
401
  });
390
402
 
391
403
  return () => {
392
404
  player.removeListener(playerContainerId);
393
405
  };
394
- }, [player, onVideoEnd]);
406
+ }, [
407
+ player,
408
+ onVideoEnd,
409
+ onError,
410
+ onLoad,
411
+ close,
412
+ onVideoFullscreenPlayerWillDismiss,
413
+ onVideoFullscreenPlayerWillPresent,
414
+ ]);
395
415
 
396
416
  useEffect(() => {
397
417
  // TODO: We should not use playerManager here to connect buttons to player container
@@ -580,6 +600,9 @@ const PlayerContainerComponent = (props: Props) => {
580
600
  pluginConfiguration,
581
601
  };
582
602
 
603
+ const { isActiveGesture, startComponentsAnimation } =
604
+ useModalAnimationContext();
605
+
583
606
  return (
584
607
  <PlayerStateContext.Provider value={value}>
585
608
  <PlayerContainerContextProvider
@@ -621,9 +644,13 @@ const PlayerContainerComponent = (props: Props) => {
621
644
  }}
622
645
  focused={isInlineTV ? true : undefined}
623
646
  autoplay={true}
624
- controls={isAppleTV() && !isInlineTV}
647
+ controls={false}
625
648
  disableCastAction={disableCastAction}
626
- docked={navigator.isVideoModalDocked()}
649
+ docked={
650
+ navigator.isVideoModalDocked() &&
651
+ !startComponentsAnimation &&
652
+ !isActiveGesture
653
+ }
627
654
  entry={item}
628
655
  fullscreen={mode === VideoModalMode.FULLSCREEN}
629
656
  inline={inline}
@@ -4,7 +4,9 @@ import { styleKeys } from "@applicaster/zapp-react-native-utils/styleKeysUtils";
4
4
  import { transformColorCode as fixColorHexCode } from "@applicaster/zapp-react-native-utils/transform";
5
5
  import * as R from "ramda";
6
6
  import * as React from "react";
7
- import { Image, Text, TextStyle, View, ViewStyle } from "react-native";
7
+ import { Text, TextStyle, View, ViewStyle } from "react-native";
8
+ import { QBImage as Image } from "@applicaster/zapp-react-native-ui-components/Components/Image";
9
+
8
10
  import * as programStyles from "./styles";
9
11
 
10
12
  type Props = {
@@ -1,38 +1,64 @@
1
1
  import React, { PropsWithChildren } from "react";
2
- import { ImageBackground } from "react-native";
2
+ import { ImageBackground, View } from "react-native";
3
3
 
4
4
  import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
5
+ import {
6
+ AnimationComponent,
7
+ ComponentAnimationType,
8
+ useModalAnimationContext,
9
+ PlayerAnimationStateEnum,
10
+ } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
5
11
 
6
12
  type Props = PropsWithChildren<{
7
13
  entry: ZappEntry;
8
14
  style?: { [K: string]: any };
9
15
  imageStyle?: { [K: string]: any };
10
16
  imageKey?: string;
17
+ defaultImageDimensions?: { [K: string]: any };
11
18
  }>;
12
19
 
20
+ const imageSize = { width: "100%", height: "100%" };
21
+
13
22
  const PlayerImageBackgroundComponent = ({
14
23
  entry,
15
24
  children,
16
25
  style,
17
26
  imageStyle,
18
27
  imageKey,
28
+ defaultImageDimensions,
19
29
  }: Props) => {
20
30
  const source = React.useMemo(
21
31
  () => ({ uri: imageSrcFromMediaItem(entry, imageKey) }),
22
32
  [imageKey, entry]
23
33
  );
24
34
 
35
+ const { playerAnimationState } = useModalAnimationContext();
36
+
25
37
  if (!source) return <>{children}</>;
26
38
 
27
39
  return (
28
- <ImageBackground
29
- resizeMode="cover"
30
- style={style}
31
- imageStyle={imageStyle}
32
- source={source}
40
+ <View
41
+ style={
42
+ playerAnimationState === PlayerAnimationStateEnum.maximaze
43
+ ? defaultImageDimensions
44
+ : style
45
+ }
33
46
  >
34
- {children}
35
- </ImageBackground>
47
+ <AnimationComponent
48
+ style={style}
49
+ animationType={ComponentAnimationType.player}
50
+ additionalData={defaultImageDimensions}
51
+ >
52
+ <ImageBackground
53
+ resizeMode="cover"
54
+ style={imageSize}
55
+ imageStyle={imageStyle}
56
+ source={source}
57
+ >
58
+ {children}
59
+ </ImageBackground>
60
+ </AnimationComponent>
61
+ </View>
36
62
  );
37
63
  };
38
64
 
@@ -6,6 +6,12 @@ import configureStore from "redux-mock-store";
6
6
 
7
7
  import * as themeUtils from "@applicaster/zapp-react-native-utils/theme";
8
8
 
9
+ // silences the errors related to React-native-gesture-handler in tests
10
+ jest.mock(
11
+ "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation",
12
+ () => () => null
13
+ );
14
+
9
15
  jest.mock("react-native-safe-area-context", () => ({
10
16
  useSafeAreaInsets: () => ({ top: 50 }),
11
17
  }));
@@ -83,6 +89,7 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
83
89
  useNavigation: jest.fn(() => ({ currentRoute: "/river/A1234" })),
84
90
  useRoute: jest.fn(() => ({ pathname: "/river/A1234", screenData })),
85
91
  useProfilerLogging: jest.fn(),
92
+ useIsScreenActive: jest.fn().mockReturnValue(true),
86
93
  }));
87
94
 
88
95
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
@@ -14,7 +14,7 @@ type Props = { pathname: string; screenData: Record<string, any> };
14
14
  * @param {Props}: see props above
15
15
  */
16
16
  export function RouteManager(props: Props) {
17
- const { pathname, screenData } = useRoute();
17
+ const { pathname, screenData: _screenData } = useRoute();
18
18
  const pathAttributes = getPathAttributes({ pathname });
19
19
 
20
20
  const { screenType, screenId } = R.last(pathAttributes);
@@ -25,7 +25,7 @@ export function RouteManager(props: Props) {
25
25
  screenType={screenType}
26
26
  screenId={screenId}
27
27
  {...props}
28
- screenData={screenData}
28
+ screenData={props.screenData}
29
29
  />
30
30
  </TestId>
31
31
  );
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import { create, act } from "react-test-renderer";
3
+ import { act, create } from "react-test-renderer";
4
4
 
5
5
  const Mocked_RouteManager = jest.fn((props) => (
6
6
  <View testID="routeManager" {...props} />
@@ -69,12 +69,16 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
69
69
  isNavBarVisible: mockIsNavBarVisible,
70
70
  useRoute: jest.fn(() => ({
71
71
  pathname: "/river/testId",
72
+ screenData: { id: "testId" },
72
73
  })),
73
74
  useNavigation: jest.fn(() => ({
74
75
  canGoBack: () => false,
75
76
  currentRoute: "/river/testId",
77
+ activeRiver: { id: "testId" },
78
+ screenData: { id: "testId" },
76
79
  data: { screen: { id: "testId" } },
77
80
  })),
81
+ useIsScreenActive: jest.fn().mockReturnValue(true),
78
82
  }));
79
83
 
80
84
  jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
@@ -19,6 +19,11 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
19
19
  <View>
20
20
  <View
21
21
  pathname="/river/testId"
22
+ screenData={
23
+ Object {
24
+ "id": "testId",
25
+ }
26
+ }
22
27
  testID="routeManager"
23
28
  />
24
29
  </View>
@@ -44,6 +49,11 @@ exports[`<Screen Component /> when the navbar should show renders correctly 1`]
44
49
  <View>
45
50
  <View
46
51
  pathname="/river/testId"
52
+ screenData={
53
+ Object {
54
+ "id": "testId",
55
+ }
56
+ }
47
57
  testID="routeManager"
48
58
  />
49
59
  </View>
@@ -14,6 +14,7 @@ import {
14
14
  useCurrentScreenData,
15
15
  useNavbarState,
16
16
  useScreenData,
17
+ useNavigation,
17
18
  } from "@applicaster/zapp-react-native-utils/reactHooks";
18
19
  import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers";
19
20
 
@@ -22,6 +23,17 @@ import { RouteManager } from "../RouteManager";
22
23
  import { useScreenConfiguration } from "../River/useScreenConfiguration";
23
24
  import { useScreenOrientationHandler } from "./orientationHandler";
24
25
 
26
+ const getScreenId = (
27
+ screenData: LegacyNavigationScreenData,
28
+ fallbackRiver: ZappRiver
29
+ ) => {
30
+ return screenData?.targetScreen
31
+ ? screenData?.targetScreen?.id ?? fallbackRiver.id
32
+ : "screen_id" in screenData
33
+ ? screenData.screen_id
34
+ : fallbackRiver.id;
35
+ };
36
+
25
37
  function colorIsNotTransparent(color) {
26
38
  const layers = R.compose(
27
39
  R.map(R.trim),
@@ -40,14 +52,13 @@ function isValidColor(string) {
40
52
  }
41
53
 
42
54
  type Props = {
43
- pathname: string;
44
- screenData: unknown;
45
55
  setToggleMenu: () => void;
46
56
  setCloseMenu: () => void;
47
57
  };
48
58
 
49
59
  export function Screen({ setToggleMenu, setCloseMenu }: Props) {
50
60
  const theme = useTheme<BaseThemePropertiesMobile>();
61
+ const navigation = useNavigation();
51
62
  const { plugins } = usePickFromState(["plugins"]);
52
63
 
53
64
  // Gets the data for the current screen configuration
@@ -62,9 +73,7 @@ export function Screen({ setToggleMenu, setCloseMenu }: Props) {
62
73
  const routeData = useRoute();
63
74
 
64
75
  const currentRiver = useScreenData(
65
- (routeData.screenData as ZappRiver)?.targetScreen
66
- ? (routeData.screenData as ZappRiver)?.targetScreen.id
67
- : (routeData.screenData as ZappRiver)?.screen_id
76
+ getScreenId(routeData.screenData, navigation.activeRiver)
68
77
  );
69
78
 
70
79
  const { title } = useNavbarState();
@@ -128,7 +137,7 @@ export function Screen({ setToggleMenu, setCloseMenu }: Props) {
128
137
  {...{ ...(navBarProps as MobileNavBarPluginProps), id: pathname }}
129
138
  />
130
139
 
131
- <OfflineFallbackScreen screenData={screenData}>
140
+ <OfflineFallbackScreen screenData={targetScreenData}>
132
141
  {/* @TODO RouteManager doesn't use props, can they be removed ? */}
133
142
  <RouteManager pathname={pathname} screenData={screenData} />
134
143
  </OfflineFallbackScreen>
@@ -78,7 +78,7 @@ export const getStyles = (config): Partial<TVTabsStyles> => {
78
78
  },
79
79
  tvos: {
80
80
  marginTop: -1,
81
- }
81
+ },
82
82
  }),
83
83
  },
84
84
  tabsBackground: {
@@ -14,7 +14,7 @@ import {
14
14
  } from "@applicaster/zapp-react-native-utils/reactUtils";
15
15
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
16
16
  import { getUserCellPlayerMutedPreference } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/userCellPlayerMutedPreference";
17
- import { PlayerImageBackground } from "../PlayerImageBackground";
17
+ import Image from "@applicaster/zapp-react-native-ui-components/Components/MasterCell/DefaultComponents/Image";
18
18
  import { LiveImage, LiveImageManager, LiveImageType } from "./LiveImageManager";
19
19
 
20
20
  import { AnimatedInOut } from "@applicaster/zapp-react-native-ui-components/Components/AnimatedInOut";
@@ -39,12 +39,13 @@ type Props = {
39
39
  imageKey?: string;
40
40
  screenConfig: Record<string, any>;
41
41
  audioMutedByDefault?: boolean;
42
+ uri: string; // cover image url
42
43
  };
43
44
 
44
45
  const PlayerLiveImageComponent = (props: Props) => {
45
46
  const dimensions = useDimensions("screen", { fullDimensions: true });
46
47
 
47
- const { item, style, playerId, imageKey } = props;
48
+ const { item, style, playerId } = props;
48
49
 
49
50
  const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);
50
51
  const [mode, setMode] = React.useState(LiveImageType.Image);
@@ -63,24 +64,27 @@ const PlayerLiveImageComponent = (props: Props) => {
63
64
  *
64
65
  * @param type video or image
65
66
  */
66
- const setModeDebounced = React.useCallback((type: LiveImageType) => {
67
- if (type === LiveImageType.Video) {
68
- if (type === mode) {
69
- return;
70
- }
67
+ const setModeDebounced = React.useCallback(
68
+ (type: LiveImageType) => {
69
+ if (type === LiveImageType.Video) {
70
+ if (type === mode) {
71
+ return;
72
+ }
73
+
74
+ timeoutRef.current = setTimeout(() => {
75
+ setMode(type);
76
+ }, 1000) as unknown as NodeJS.Timeout;
77
+ } else {
78
+ if (timeoutRef.current) {
79
+ clearTimeout(timeoutRef.current);
80
+ timeoutRef.current = null;
81
+ }
71
82
 
72
- timeoutRef.current = setTimeout(() => {
73
83
  setMode(type);
74
- }, 1000) as unknown as NodeJS.Timeout;
75
- } else {
76
- if (timeoutRef.current) {
77
- clearTimeout(timeoutRef.current);
78
- timeoutRef.current = null;
79
84
  }
80
-
81
- setMode(type);
82
- }
83
- }, [mode]);
85
+ },
86
+ [mode]
87
+ );
84
88
 
85
89
  const { screenConfig, playerPluginId } = props;
86
90
 
@@ -100,7 +104,7 @@ const PlayerLiveImageComponent = (props: Props) => {
100
104
  return new LiveImage({
101
105
  playerId,
102
106
  player: playerFactoryItem.controller,
103
- component: playerFactoryItem?.Component
107
+ component: playerFactoryItem?.Component,
104
108
  });
105
109
  } else {
106
110
  throw new Error("Player factory item is null");
@@ -111,10 +115,7 @@ const PlayerLiveImageComponent = (props: Props) => {
111
115
  liveImageItem.setMode = setModeDebounced;
112
116
  }, [setModeDebounced, liveImageItem]);
113
117
 
114
- const { start, end } = React.useMemo(
115
- () => getAutoplaySettings(item),
116
- [item]
117
- );
118
+ const { start, end } = React.useMemo(() => getAutoplaySettings(item), [item]);
118
119
 
119
120
  const controller = liveImageItem.getPlayer();
120
121
  const player = usePlayer(playerId);
@@ -239,7 +240,12 @@ const PlayerLiveImageComponent = (props: Props) => {
239
240
 
240
241
  const onPositionUpdated = React.useCallback(
241
242
  (data) => {
242
- const normalizedRect = (rect: {left: number, right: number, top: number, bottom: number }) => {
243
+ const normalizedRect = (rect: {
244
+ left: number;
245
+ right: number;
246
+ top: number;
247
+ bottom: number;
248
+ }) => {
243
249
  if (!rect) {
244
250
  return null;
245
251
  }
@@ -283,6 +289,7 @@ const PlayerLiveImageComponent = (props: Props) => {
283
289
  const videoStyles = { ...style, position: "absolute", zIndex: -100 };
284
290
  const Player: any = liveImageItem.component || BufferAnimation;
285
291
 
292
+ // TODO: nice to have - resolve imageKey when imageUrl is not provided
286
293
  return (
287
294
  <TrackedView
288
295
  testId={`tracked-view-${playerId}-${item.title}`}
@@ -307,11 +314,7 @@ const PlayerLiveImageComponent = (props: Props) => {
307
314
  animationConfig={overlayFadeIn}
308
315
  staticStyles={style}
309
316
  >
310
- <PlayerImageBackground
311
- entry={item}
312
- style={style}
313
- imageKey={imageKey}
314
- />
317
+ <Image {...props} resizeMode="cover" style={style} applyMaxSize />
315
318
  </AnimatedInOut>
316
319
  }
317
320
  </TrackedView>
@@ -3,7 +3,14 @@ import * as React from "react";
3
3
  import { render } from "@testing-library/react-native";
4
4
  import * as PlayerFactory from "@applicaster/zapp-react-native-utils/appUtils/playerManager/playerFactory";
5
5
  import { Player } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/player";
6
+ import { ThemeContext } from "@applicaster/zapp-react-native-utils/theme";
7
+ import * as navigationHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
8
+
6
9
  import { PlayerLiveImage } from "../PlayerLiveImageComponent";
10
+ import * as useNavigationHooks from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
11
+
12
+ import { Provider } from "react-redux";
13
+ import configureStore from "redux-mock-store";
7
14
 
8
15
  const seekTo = jest.fn();
9
16
 
@@ -16,6 +23,27 @@ jest.mock(
16
23
  })
17
24
  );
18
25
 
26
+ jest
27
+ .spyOn(useNavigationHooks, "useNavigation")
28
+ .mockImplementation(() => ({ videoModalState: { visible: false } }));
29
+
30
+ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation");
31
+
32
+ const mockStore = configureStore();
33
+
34
+ const store = mockStore({ appData: {} });
35
+
36
+ const Wrapper = ({ children }: { children: React.ReactChildren }) => (
37
+ /* @ts-ignore */
38
+ <Provider store={store}>
39
+ <ThemeContext.Provider
40
+ value={{ themes: { myTheme: {} }, selectedThemeId: "myTheme" }}
41
+ >
42
+ {children}
43
+ </ThemeContext.Provider>
44
+ </Provider>
45
+ );
46
+
19
47
  describe("PlayerLiveImageComponent", () => {
20
48
  const defaultProps = {
21
49
  item: { id: "1", title: "Test", type: { value: "" } },
@@ -36,10 +64,16 @@ describe("PlayerLiveImageComponent", () => {
36
64
  controller: new Player({}),
37
65
  Component: () => null,
38
66
  }));
67
+
68
+ jest.spyOn(navigationHooks, "useIsScreenActive").mockReturnValue(true);
39
69
  });
40
70
 
41
71
  it("should render correctly with default props", () => {
42
- const component = render(<PlayerLiveImage {...defaultProps} />);
72
+ const component = render(
73
+ <Wrapper>
74
+ <PlayerLiveImage {...defaultProps} />
75
+ </Wrapper>
76
+ );
43
77
 
44
78
  expect(component.toJSON()).toMatchSnapshot();
45
79
  });
@@ -53,7 +87,11 @@ describe("PlayerLiveImageComponent", () => {
53
87
  },
54
88
  };
55
89
 
56
- render(<PlayerLiveImage {...props} />);
90
+ render(
91
+ <Wrapper>
92
+ <PlayerLiveImage {...props} />
93
+ </Wrapper>
94
+ );
57
95
 
58
96
  // TODO: implement this test
59
97
  });
@@ -67,7 +105,11 @@ describe("PlayerLiveImageComponent", () => {
67
105
  },
68
106
  };
69
107
 
70
- render(<PlayerLiveImage {...props} />);
108
+ render(
109
+ <Wrapper>
110
+ <PlayerLiveImage {...props} />
111
+ </Wrapper>
112
+ );
71
113
 
72
114
  // TODO: implement this test
73
115
  });
@@ -13,35 +13,30 @@ exports[`PlayerLiveImageComponent should render correctly with default props 1`]
13
13
  }
14
14
  }
15
15
  >
16
- <View
17
- accessibilityIgnoresInvertColors={true}
18
- style={Object {}}
19
- >
20
- <Image
21
- resizeMode="cover"
22
- source={
23
- Object {
24
- "uri": undefined,
25
- }
16
+ <Image
17
+ applyMaxSize={true}
18
+ audioMutedByDefault={false}
19
+ imageKey="image1"
20
+ item={
21
+ Object {
22
+ "id": "1",
23
+ "title": "Test",
24
+ "type": Object {
25
+ "value": "",
26
+ },
26
27
  }
27
- style={
28
- Array [
29
- Object {
30
- "bottom": 0,
31
- "left": 0,
32
- "position": "absolute",
33
- "right": 0,
34
- "top": 0,
35
- },
36
- Object {
37
- "height": undefined,
38
- "width": undefined,
39
- },
40
- undefined,
41
- ]
28
+ }
29
+ onError={[Function]}
30
+ playerId="player1"
31
+ resizeMode="cover"
32
+ screenConfig={Object {}}
33
+ source={
34
+ Object {
35
+ "uri": "",
42
36
  }
43
- />
44
- </View>
37
+ }
38
+ style={Object {}}
39
+ />
45
40
  </View>
46
41
  </TrackedView>
47
42
  `;