@applicaster/zapp-react-native-ui-components 14.0.0-alpha.2332850672 → 14.0.0-alpha.2385258459

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 (108) hide show
  1. package/Components/AnimatedInOut/index.tsx +5 -3
  2. package/Components/AudioPlayer/index.tsx +15 -0
  3. package/Components/AudioPlayer/{AudioPlayerMobileLayout.tsx → mobile/Layout.tsx} +10 -5
  4. package/Components/AudioPlayer/{__tests__ → mobile/__tests__}/__snapshots__/audioPlayerMobileLayout.test.js.snap +1 -1
  5. package/Components/AudioPlayer/{__tests__ → mobile/__tests__}/audioPlayerMobileLayout.test.js +2 -2
  6. package/Components/AudioPlayer/mobile/index.tsx +18 -0
  7. package/Components/AudioPlayer/{Artwork.tsx → tv/Artwork.tsx} +3 -2
  8. package/Components/AudioPlayer/{Channel.tsx → tv/Channel.tsx} +7 -7
  9. package/Components/AudioPlayer/tv/Layout.tsx +168 -0
  10. package/Components/AudioPlayer/{Runtime.tsx → tv/Runtime.tsx} +7 -1
  11. package/Components/AudioPlayer/{Summary.tsx → tv/Summary.tsx} +6 -2
  12. package/Components/AudioPlayer/{Title.tsx → tv/Title.tsx} +6 -2
  13. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/Runtime.test.js.snap +2 -2
  14. package/Components/AudioPlayer/tv/__tests__/__snapshots__/audioPlayer.test.js.snap +164 -0
  15. package/Components/AudioPlayer/tv/__tests__/__snapshots__/channel.test.js.snap +19 -0
  16. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/summary.test.js.snap +1 -2
  17. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/title.test.js.snap +1 -2
  18. package/Components/AudioPlayer/{__tests__ → tv/__tests__}/audioPlayer.test.js +7 -3
  19. package/Components/AudioPlayer/{helpers.tsx → tv/helpers.tsx} +11 -5
  20. package/Components/AudioPlayer/{AudioPlayer.tsx → tv/index.tsx} +21 -97
  21. package/Components/AudioPlayer/types.ts +40 -0
  22. package/Components/Cell/index.js +7 -3
  23. package/Components/ComponentResolver/index.ts +1 -1
  24. package/Components/FeedLoader/index.js +1 -1
  25. package/Components/Focusable/Focusable.tsx +5 -3
  26. package/Components/Focusable/FocusableTvOS.tsx +3 -3
  27. package/Components/Focusable/FocusableiOS.tsx +2 -2
  28. package/Components/Focusable/__tests__/index.android.test.tsx +3 -0
  29. package/Components/Focusable/index.android.tsx +12 -8
  30. package/Components/Focusable/index.tsx +1 -1
  31. package/Components/FocusableList/index.tsx +4 -0
  32. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  33. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +12 -8
  34. package/Components/HandlePlayable/HandlePlayable.tsx +25 -9
  35. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  36. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  37. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -27
  38. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +1 -1
  39. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  40. package/Components/MasterCell/elementMapper.tsx +1 -2
  41. package/Components/MasterCell/index.tsx +1 -1
  42. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +13 -18
  43. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  44. package/Components/OfflineHandler/__tests__/index.test.tsx +20 -22
  45. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  46. package/Components/PlayerContainer/PlayerContainer.tsx +42 -32
  47. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  48. package/Components/PlayerContainer/index.ts +1 -1
  49. package/Components/PlayerImageBackground/index.tsx +1 -1
  50. package/Components/River/ComponentsMap/ComponentsMap.tsx +0 -1
  51. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +379 -0
  52. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  53. package/Components/River/RefreshControl.tsx +6 -4
  54. package/Components/River/TV/River.tsx +2 -17
  55. package/Components/River/TV/index.tsx +3 -1
  56. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  57. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  58. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  59. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -0
  60. package/Components/River/index.tsx +1 -1
  61. package/Components/Screen/__tests__/Screen.test.tsx +23 -12
  62. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  63. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  64. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  65. package/Components/ScreenRevealManager/index.ts +1 -0
  66. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  67. package/Components/Tabs/TV/Tabs.android.tsx +0 -2
  68. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  69. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  70. package/Components/VideoLive/animationUtils.ts +3 -3
  71. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +32 -8
  72. package/Components/VideoModal/PlayerDetails.tsx +24 -2
  73. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  74. package/Components/VideoModal/VideoModal.tsx +3 -17
  75. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  76. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -240
  77. package/Components/VideoModal/hooks/index.ts +0 -2
  78. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  79. package/Components/VideoModal/utils.ts +6 -0
  80. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  81. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  82. package/Components/Viewport/VisibilitySensor/VisibilitySensor.tsx +3 -3
  83. package/Components/default-cell-renderer/viewTrees/tv/DefaultCell/index.ts +3 -3
  84. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  85. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  86. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  87. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  88. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  89. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  90. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  91. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  92. package/Decorators/ZappPipesDataConnector/index.tsx +26 -293
  93. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  94. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  95. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +241 -0
  96. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  97. package/package.json +5 -10
  98. package/Components/AudioPlayer/AudioPlayerTVLayout.tsx +0 -161
  99. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +0 -66
  100. package/Components/AudioPlayer/__tests__/__snapshots__/channel.test.js.snap +0 -28
  101. package/Components/AudioPlayer/index.ts +0 -1
  102. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
  103. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/Runtime.test.js +0 -0
  104. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/__snapshots__/artWork.test.js.snap +0 -0
  105. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/artWork.test.js +0 -0
  106. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/channel.test.js +0 -0
  107. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/summary.test.js +0 -0
  108. /package/Components/AudioPlayer/{__tests__ → tv/__tests__}/title.test.js +0 -0
@@ -1,17 +1,18 @@
1
1
  import { all, equals, path, prop, isEmpty, pluck, values } from "ramda";
2
2
 
3
3
  import { useEffect, useMemo } from "react";
4
- import { useDispatch } from "react-redux";
5
4
 
6
5
  import {
6
+ ZappPipes,
7
+ useAppDispatch,
7
8
  useLayoutPresets,
8
- useZappPipesFeeds,
9
- } from "@applicaster/zapp-react-native-redux/hooks";
10
- import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
9
+ useZappPipesFeed,
10
+ } from "@applicaster/zapp-react-native-redux";
11
11
  import { isEmptyOrNil } from "@applicaster/zapp-react-native-utils/cellUtils";
12
12
  import { Categories } from "./logger";
13
13
  import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
14
14
  import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute";
15
+
15
16
  import {
16
17
  ZappPipesEntryContext,
17
18
  ZappPipesScreenContext,
@@ -26,7 +27,10 @@ import {
26
27
  import { produce } from "immer";
27
28
  // types reference
28
29
 
29
- declare type CurationEntry = { preset_name: string; feed_url: string };
30
+ declare interface CurationEntry {
31
+ preset_name: string;
32
+ feed_url: string;
33
+ }
30
34
 
31
35
  type Feeds = Record<string, ZappPipesData>;
32
36
 
@@ -122,7 +126,7 @@ export const getFinalComponents = (
122
126
  export const useCurationAPI = (
123
127
  components: Array<ZappUIComponent>
124
128
  ): ZappUIComponent[] => {
125
- const dispatch = useDispatch();
129
+ const dispatch = useAppDispatch();
126
130
 
127
131
  const smartComponents = useMemo(
128
132
  () => components?.filter?.(isSmartComponent) ?? [],
@@ -162,7 +166,7 @@ export const useCurationAPI = (
162
166
  useEffect(() => {
163
167
  urls.forEach((url, index) => {
164
168
  if (url) {
165
- dispatch(loadPipesData(url, { clearCache: false }));
169
+ dispatch(ZappPipes.loadPipesData(url, { clearCache: false }));
166
170
  } else {
167
171
  logger.log_error("Curation url is empty", {
168
172
  componentId: smartComponents?.[index]?.id,
@@ -171,7 +175,7 @@ export const useCurationAPI = (
171
175
  });
172
176
  }, [urls]);
173
177
 
174
- const feeds = useZappPipesFeeds(urls);
178
+ const feeds = useZappPipesFeed(urls);
175
179
  const layoutPresets = useLayoutPresets();
176
180
 
177
181
  const enrichedComponents = useMemo(() => {
@@ -7,12 +7,15 @@ import {
7
7
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
8
8
  import {
9
9
  useDimensions,
10
+ useIsTablet as isTablet,
10
11
  useNavigation,
11
12
  } from "@applicaster/zapp-react-native-utils/reactHooks";
12
13
 
13
14
  import { BufferAnimation } from "../PlayerContainer/BufferAnimation";
14
15
  import { PlayerContainer } from "../PlayerContainer";
15
16
  import { useModalSize } from "../VideoModal/hooks";
17
+ import { ViewStyle } from "react-native";
18
+ import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
16
19
 
17
20
  type Props = {
18
21
  item: ZappEntry;
@@ -83,6 +86,13 @@ type PlayableComponent = {
83
86
  Component: React.ComponentType<any>;
84
87
  };
85
88
 
89
+ const dimensionsContext: "window" | "screen" = platformSelect({
90
+ android_tv: "window",
91
+ amazon: "window",
92
+ // eslint-disable-next-line react-hooks/rules-of-hooks
93
+ default: isTablet() ? "window" : "screen", // on tablet, window represents correct values, on phone it's not as the screen could be rotated
94
+ });
95
+
86
96
  export function HandlePlayable({
87
97
  item,
88
98
  isModal,
@@ -135,19 +145,25 @@ export function HandlePlayable({
135
145
  });
136
146
  }, [casting]);
137
147
 
138
- const { width: screenWidth, height: screenHeight } = useDimensions("window");
148
+ const { width: screenWidth, height: screenHeight } =
149
+ useDimensions(dimensionsContext);
139
150
 
140
151
  const modalSize = useModalSize();
141
152
 
142
153
  const style = React.useMemo(
143
- () => ({
144
- width: isModal ? modalSize.width : mode === "PIP" ? "100%" : screenWidth,
145
- height: isModal
146
- ? modalSize.height
147
- : mode === "PIP"
148
- ? "100%"
149
- : screenHeight,
150
- }),
154
+ () =>
155
+ ({
156
+ width: isModal
157
+ ? modalSize.width
158
+ : mode === "PIP"
159
+ ? "100%"
160
+ : screenWidth,
161
+ height: isModal
162
+ ? modalSize.height
163
+ : mode === "PIP"
164
+ ? "100%"
165
+ : screenHeight,
166
+ }) as ViewStyle,
151
167
  [screenWidth, screenHeight, modalSize, isModal, mode]
152
168
  );
153
169
 
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks/usePickFromState";
2
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
3
3
  import { getBackgroundImageUrl } from "../utils";
4
4
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
5
5
 
@@ -4,7 +4,7 @@ import * as R from "ramda";
4
4
  import { TouchableOpacity } from "react-native";
5
5
  // import { SvgUri } from "react-native-svg";
6
6
 
7
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
7
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
8
8
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
9
9
 
10
10
  import Image from "./Image";
@@ -2,7 +2,6 @@ import React, { useMemo } from "react";
2
2
  import { ImageStyle } from "react-native";
3
3
  import { Focusable } from "@applicaster/zapp-react-native-ui-components/Components/Focusable";
4
4
  import { useActions } from "@applicaster/zapp-react-native-utils/reactHooks/actions";
5
- import * as R from "ramda";
6
5
  import { getXray } from "@applicaster/zapp-react-native-utils/logger";
7
6
  import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
8
7
  import { useAccessibilityManager } from "@applicaster/zapp-react-native-utils/appUtils/accessibilityManager/hooks";
@@ -67,32 +66,10 @@ export function FocusableView({ style, children, item, ...otherProps }: Props) {
67
66
  const handleFocus = (focusable) => {
68
67
  const focusedButtonId = getFocusedButtonId(focusable);
69
68
 
70
- wrapperRef?.current?.measure((x, y, width, height, pageX, pageY) => {
71
- const top = pageY;
72
- const bottom = top + height;
73
- const left = pageX;
74
- const right = left + width;
75
-
76
- const boundingRect = {
77
- x,
78
- y,
79
- pageX,
80
- pageY,
81
- width,
82
- height,
83
- top,
84
- bottom,
85
- left,
86
- right,
87
- };
88
-
89
- otherProps?.onToggleFocus?.({
90
- focusable: {
91
- getRect: R.always(boundingRect),
92
- },
93
- focusedButtonId,
94
- mouse: focusable.mouse,
95
- });
69
+ otherProps?.onToggleFocus?.({
70
+ focusable: wrapperRef.current,
71
+ focusedButtonId,
72
+ mouse: focusable.mouse,
96
73
  });
97
74
 
98
75
  if (ttsLabel) {
@@ -20,7 +20,7 @@ const withAppliedDimensions = (style: Style) => (source: Source) => ({
20
20
  });
21
21
 
22
22
  export const withDimensionsHOC = (Component) => {
23
- return function WithDimensions(props: { style: any }) {
23
+ return function WithDimensions(props: Record<string, unknown>) {
24
24
  const theme = useTheme<BaseThemePropertiesMobile>();
25
25
 
26
26
  const useDownScalingImages = toBooleanWithDefaultFalse(
@@ -13,7 +13,7 @@ export const ImageContainer = (props: Props) => {
13
13
  const isActive = useIsScreenActive();
14
14
 
15
15
  const Component =
16
- isVideoPreviewEnabled(props) && isActive ? LiveImage : PureImage;
16
+ isVideoPreviewEnabled(props as Props) && isActive ? LiveImage : PureImage;
17
17
 
18
18
  return <Component {...props} />;
19
19
  };
@@ -73,7 +73,6 @@ export function elementMapper(
73
73
  : {};
74
74
 
75
75
  const componentProps = {
76
- key,
77
76
  style,
78
77
  skipButtons: otherProps?.skipButtons,
79
78
  emitAsyncElementRegistrate: otherProps?.emitAsyncElementRegistrate,
@@ -91,7 +90,7 @@ export function elementMapper(
91
90
  const fn = mapElementWithKey(elementMapper(components, otherProps));
92
91
 
93
92
  return (
94
- <Component {...componentProps}>
93
+ <Component key={key} {...componentProps}>
95
94
  {focusableTypes.has(type) && elements.length > 0
96
95
  ? elements.map(fn)
97
96
  : null}
@@ -86,7 +86,7 @@ export function masterCellBuilder({
86
86
  entry: item,
87
87
  state: getEntryState(state, entryIsSelected),
88
88
  }),
89
- [state, item?.id, entryIsSelected] // Assuming that item won't mutate
89
+ [state, item, entryIsSelected] // Assuming that item won't mutate
90
90
  );
91
91
 
92
92
  const wrapperRef = React.useRef(null);
@@ -1,9 +1,12 @@
1
1
  import React from "react";
2
2
  import { Text, Animated } from "react-native";
3
+ import { render } from "@testing-library/react-native";
3
4
 
4
- import renderer from "react-test-renderer";
5
-
6
- jest.useFakeTimers();
5
+ import {
6
+ NotificationView,
7
+ onlinePhrase,
8
+ offlinePhrase,
9
+ } from "../NotificationView";
7
10
 
8
11
  jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
9
12
  usePickFromState: () => ({
@@ -32,39 +35,31 @@ jest.mock("react-native-safe-area-context", () => ({
32
35
 
33
36
  const dismiss = jest.fn();
34
37
 
35
- const {
36
- NotificationView,
37
- onlinePhrase,
38
- offlinePhrase,
39
- } = require("../NotificationView");
40
-
41
38
  describe("NotificationView", () => {
42
39
  it("Show online message when Online", () => {
43
- const component = renderer.create(
44
- <NotificationView online dismiss={dismiss} />
45
- );
40
+ const component = render(<NotificationView online dismiss={dismiss} />);
46
41
 
47
- expect(component.root.findByType(Text).props.children).toBe(onlinePhrase);
42
+ expect(component.UNSAFE_getByType(Text).props.children).toBe(onlinePhrase);
48
43
  });
49
44
 
50
45
  it("Show offline message when Online", () => {
51
- const component = renderer.create(
46
+ const component = render(
52
47
  <NotificationView online={false} dismiss={dismiss} />
53
48
  );
54
49
 
55
- expect(component.root.findByType(Text).props.children).toBe(offlinePhrase);
50
+ expect(component.UNSAFE_getByType(Text).props.children).toBe(offlinePhrase);
56
51
  });
57
52
 
58
53
  it("When hidden is false to true notification is visible", () => {
59
- const component = renderer.create(
54
+ const component = render(
60
55
  <NotificationView online={false} hidden={false} dismiss={dismiss} />
61
56
  );
62
57
 
63
- component.update(
58
+ component.rerender(
64
59
  <NotificationView online={false} hidden={true} dismiss={dismiss} />
65
60
  );
66
61
 
67
- const animatedView = component.root.findByType(Animated.View);
62
+ const animatedView = component.UNSAFE_getByType(Animated.View);
68
63
  const animatedViewStyles = animatedView.props.style;
69
64
 
70
65
  expect(animatedViewStyles.opacity).toBe(1);
@@ -21,6 +21,15 @@ exports[`OfflineHandler renders 1`] = `
21
21
  }
22
22
  >
23
23
  <View
24
+ accessibilityState={
25
+ {
26
+ "busy": undefined,
27
+ "checked": undefined,
28
+ "disabled": undefined,
29
+ "expanded": undefined,
30
+ "selected": undefined,
31
+ }
32
+ }
24
33
  accessible={true}
25
34
  collapsable={false}
26
35
  focusable={true}
@@ -19,29 +19,27 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/utils", () => {
19
19
  };
20
20
  });
21
21
 
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
- },
22
+ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
23
+ ...jest.requireActual("@applicaster/zapp-react-native-redux/hooks"),
24
+ usePickFromState: () => ({
25
+ plugins: [
26
+ {
27
+ name: "offline experience",
28
+ identifier: "offline-experience",
29
+ type: "general",
30
+ module: {
31
+ useOfflineExperienceConfiguration: () => ({
32
+ configurationFields: {},
33
+ localizations: {
34
+ offline_toast_message: "No internet connection",
35
+ online_toast_message: "You are back online",
36
+ },
37
+ }),
40
38
  },
41
- ],
42
- }),
43
- })
44
- );
39
+ },
40
+ ],
41
+ }),
42
+ }));
45
43
 
46
44
  jest.mock("react-native-safe-area-context", () => ({
47
45
  useSafeAreaInsets: () => ({ top: 44 }),
@@ -1,6 +1,6 @@
1
1
  import * as R from "ramda";
2
2
 
3
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
3
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
4
4
 
5
5
  import { ErrorDisplayComponent } from "./ErrorDisplay";
6
6
 
@@ -1,7 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { useEffect, useReducer } from "react";
3
- // @ts-ignore
4
- import { TVMenuControl, View, ViewStyle } from "react-native";
3
+ import { View, ViewStyle } from "react-native";
5
4
  import * as R from "ramda";
6
5
  import uuid from "uuid/v4";
7
6
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
@@ -62,6 +61,11 @@ import {
62
61
  useModalAnimationContext,
63
62
  } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
64
63
 
64
+ import {
65
+ PlayerNativeCommandTypes,
66
+ PlayerNativeSendCommand,
67
+ } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/playerNativeCommand";
68
+
65
69
  type Props = {
66
70
  Player: React.ComponentType<any>;
67
71
  PlayerLoadingView?: React.ComponentType<any>; // 👀 we are not receiving this prop
@@ -88,7 +92,7 @@ export const VideoModalMode = {
88
92
  MAXIMIZED: "MAXIMIZED",
89
93
  MINIMIZED: "MINIMIZED",
90
94
  FULLSCREEN: "FULLSCREEN",
91
- };
95
+ } as const;
92
96
 
93
97
  export type PlayNextData = {
94
98
  state: PlayNextState;
@@ -127,7 +131,7 @@ const webStyles = {
127
131
  playerScreen: {
128
132
  flex: 1,
129
133
  height: "100vh",
130
- background: "black",
134
+ backgroundColor: "black",
131
135
  },
132
136
  playerWrapper: {
133
137
  height: "100%",
@@ -135,9 +139,6 @@ const webStyles = {
135
139
  },
136
140
  inlineRiver: {
137
141
  height: INLINE_CONTAINER_CONTENT_HEIGHT,
138
-
139
- borderWidth: 4,
140
- borderColor: "yellow",
141
142
  },
142
143
  };
143
144
 
@@ -148,7 +149,6 @@ const nativeStyles = {
148
149
  },
149
150
  playerScreen: {
150
151
  flex: 1,
151
- backgroundColor: "black",
152
152
  overflow: "hidden",
153
153
  },
154
154
  playerWrapper: {
@@ -263,9 +263,15 @@ const PlayerContainerComponent = (props: Props) => {
263
263
  return;
264
264
  }
265
265
 
266
+ // send command to clear and stop player
267
+ PlayerNativeSendCommand(
268
+ PlayerNativeCommandTypes.clearPlayerData,
269
+ state.playerId
270
+ );
271
+
266
272
  showNavBar(true);
267
273
  navigator.goBack();
268
- }, [isModal, navigator.goBack, showNavBar]);
274
+ }, [isModal, navigator.goBack, state.playerId, showNavBar]);
269
275
 
270
276
  const playEntry = (entry) => navigator.replaceTop(entry, { mode });
271
277
 
@@ -393,13 +399,17 @@ const PlayerContainerComponent = (props: Props) => {
393
399
  }
394
400
  };
395
401
 
396
- const playerRemoteHandler = (event, isLanguageOverlayVisible) => {
397
- const { eventType } = event;
402
+ const playerRemoteHandler = React.useCallback(
403
+ (isLanguageOverlayVisible = false) =>
404
+ (event) => {
405
+ const { eventType } = event;
398
406
 
399
- if (!isLanguageOverlayVisible && eventType === "menu") {
400
- close();
401
- }
402
- };
407
+ if (!isLanguageOverlayVisible && eventType === "menu") {
408
+ close();
409
+ }
410
+ },
411
+ [close]
412
+ );
403
413
 
404
414
  // Effects
405
415
  useEffect(() => {
@@ -512,16 +522,6 @@ const PlayerContainerComponent = (props: Props) => {
512
522
  }
513
523
  }, [isAudioContent]);
514
524
 
515
- // Needs to handle back button on Apple TV
516
- // https://github.com/facebook/react-native/issues/18930
517
- useEffect(() => {
518
- TVMenuControl?.enableTVMenuKey();
519
-
520
- return () => {
521
- TVMenuControl?.disableTVMenuKey();
522
- };
523
- }, []);
524
-
525
525
  useEffect(() => {
526
526
  playerEvent("source_changed", { item });
527
527
 
@@ -568,8 +568,9 @@ const PlayerContainerComponent = (props: Props) => {
568
568
  const isInlineTV = isInlineTVUtil(screenData);
569
569
 
570
570
  const inline =
571
- [VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(mode) ||
572
- isInlineTV;
571
+ [VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(
572
+ mode as any
573
+ ) || isInlineTV;
573
574
 
574
575
  const value = React.useMemo(
575
576
  () => ({ playerId: state.playerId }),
@@ -590,7 +591,11 @@ const PlayerContainerComponent = (props: Props) => {
590
591
  );
591
592
  }
592
593
 
593
- if (screen_background_color && mode !== VideoModalMode.FULLSCREEN) {
594
+ if (
595
+ screen_background_color &&
596
+ mode !== VideoModalMode.FULLSCREEN &&
597
+ isTV()
598
+ ) {
594
599
  updatedStyles.playerScreen.backgroundColor = screen_background_color;
595
600
  }
596
601
 
@@ -620,6 +625,8 @@ const PlayerContainerComponent = (props: Props) => {
620
625
  playNextData,
621
626
  };
622
627
 
628
+ const pointerEventsProp = mode === "MINIMIZED" ? "box-none" : "auto";
629
+
623
630
  return (
624
631
  <PlayerStateContext.Provider value={value}>
625
632
  <PlayerContainerContextProvider
@@ -630,9 +637,9 @@ const PlayerContainerComponent = (props: Props) => {
630
637
  <PlayerContainerContext.Consumer>
631
638
  {(context) => (
632
639
  <TVEventHandlerComponent
633
- tvEventHandler={(_component, event) =>
634
- playerRemoteHandler(event, context.isLanguageOverlayVisible)
635
- }
640
+ tvEventHandler={playerRemoteHandler(
641
+ context.isLanguageOverlayVisible
642
+ )}
636
643
  >
637
644
  <FocusableGroup
638
645
  id={FocusableGroupMainContainerId}
@@ -640,14 +647,17 @@ const PlayerContainerComponent = (props: Props) => {
640
647
  preferredFocus
641
648
  shouldUsePreferredFocus
642
649
  groupId={groupId}
650
+ pointerEvents={pointerEventsProp}
643
651
  >
644
652
  {/* Video player and components */}
645
653
  <View
646
654
  style={styles.playerScreen}
647
655
  testID={"player-screen-container"}
656
+ pointerEvents={pointerEventsProp}
648
657
  >
649
658
  {/* Player container */}
650
659
  <View
660
+ pointerEvents={pointerEventsProp}
651
661
  style={[
652
662
  styles.playerWrapper,
653
663
  // eslint-disable-next-line react-native/no-inline-styles, react-native/no-color-literals
@@ -719,7 +729,7 @@ const PlayerContainerComponent = (props: Props) => {
719
729
  key={item.id}
720
730
  groupId={FocusableGroupMainContainerId}
721
731
  cellTapAction={onCellTap}
722
- extraAnchorPointYOffset={-600}
732
+ extraAnchorPointYOffset={0}
723
733
  isScreenWrappedInContainer={true}
724
734
  containerHeight={styles.inlineRiver.height}
725
735
  componentsMapExtraProps={{
@@ -1,4 +1,4 @@
1
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
1
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
2
2
  import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
3
3
  import { styleKeys } from "@applicaster/zapp-react-native-utils/styleKeysUtils";
4
4
  import { transformColorCode as fixColorHexCode } from "@applicaster/zapp-react-native-utils/transform";
@@ -1,6 +1,6 @@
1
1
  import * as R from "ramda";
2
2
 
3
- import { connectToStore } from "@applicaster/zapp-react-native-redux";
3
+ import { connectToStore } from "@applicaster/zapp-react-native-redux/utils/connectToStore";
4
4
  import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
5
5
 
6
6
  import { PlayerContainer as PlayerContainerComponent } from "./PlayerContainer";
@@ -28,7 +28,7 @@ const PlayerImageBackgroundComponent = ({
28
28
  defaultImageDimensions,
29
29
  }: Props) => {
30
30
  const source = React.useMemo(
31
- () => ({ uri: imageSrcFromMediaItem(entry, imageKey) }),
31
+ () => ({ uri: imageSrcFromMediaItem(entry, [imageKey]) }),
32
32
  [imageKey, entry]
33
33
  );
34
34
 
@@ -286,7 +286,6 @@ function ComponentsMapComponent(props: Props) {
286
286
  initialNumToRender={3}
287
287
  maxToRenderPerBatch={10}
288
288
  windowSize={12}
289
- listKey={riverId}
290
289
  keyExtractor={keyExtractor}
291
290
  renderItem={renderRiverItem}
292
291
  data={riverComponents}