@applicaster/zapp-react-native-ui-components 14.0.0-alpha.4517121861 → 14.0.0-alpha.4520122433

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 (126) hide show
  1. package/Components/AnimatedInOut/index.tsx +5 -3
  2. package/Components/AudioPlayer/mobile/Layout.tsx +1 -1
  3. package/Components/AudioPlayer/tv/helpers.tsx +10 -3
  4. package/Components/BaseFocusable/index.tsx +23 -12
  5. package/Components/Cell/Cell.tsx +91 -64
  6. package/Components/Cell/CellWithFocusable.tsx +3 -0
  7. package/Components/Cell/__tests__/CellWIthFocusable.test.js +3 -2
  8. package/Components/Cell/index.js +1 -1
  9. package/Components/ComponentResolver/index.ts +1 -1
  10. package/Components/FeedLoader/FeedLoader.tsx +7 -16
  11. package/Components/FeedLoader/FeedLoaderHOC.tsx +21 -0
  12. package/Components/FeedLoader/index.js +2 -8
  13. package/Components/Focusable/Focusable.tsx +12 -3
  14. package/Components/Focusable/FocusableTvOS.tsx +5 -5
  15. package/Components/Focusable/FocusableiOS.tsx +2 -2
  16. package/Components/Focusable/Touchable.tsx +5 -3
  17. package/Components/Focusable/index.android.tsx +8 -4
  18. package/Components/Focusable/index.tsx +1 -1
  19. package/Components/FocusableGroup/FocusableTvOS.tsx +1 -1
  20. package/Components/FocusableList/FocusableItem.tsx +4 -3
  21. package/Components/FocusableList/FocusableListItemWrapper.tsx +2 -1
  22. package/Components/FocusableList/hooks/useCellState.android.ts +13 -3
  23. package/Components/FocusableList/index.tsx +20 -9
  24. package/Components/FreezeWithCallback/__tests__/index.test.tsx +67 -43
  25. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +42 -59
  26. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +13 -10
  27. package/Components/HandlePlayable/HandlePlayable.tsx +17 -10
  28. package/Components/Layout/TV/LayoutBackground.tsx +1 -1
  29. package/Components/Layout/TV/__tests__/index.test.tsx +0 -1
  30. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +6 -2
  31. package/Components/MasterCell/DefaultComponents/Button.tsx +1 -1
  32. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -39
  33. package/Components/MasterCell/DefaultComponents/Image/hoc/withDimensions.tsx +1 -1
  34. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +1 -1
  35. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +65 -17
  36. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/Image.test.tsx +21 -3
  37. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +6 -3
  38. package/Components/MasterCell/DefaultComponents/Text/index.tsx +26 -6
  39. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +10 -10
  40. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +18 -18
  41. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/__tests__/index.test.tsx +10 -10
  42. package/Components/MasterCell/elementMapper.tsx +1 -2
  43. package/Components/MasterCell/utils/behaviorProvider.ts +82 -14
  44. package/Components/MasterCell/utils/index.ts +11 -5
  45. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +13 -18
  46. package/Components/OfflineHandler/__tests__/__snapshots__/index.test.tsx.snap +9 -0
  47. package/Components/OfflineHandler/__tests__/index.test.tsx +26 -35
  48. package/Components/PlayerContainer/ErrorDisplay/index.ts +1 -1
  49. package/Components/PlayerContainer/PlayerContainer.tsx +45 -29
  50. package/Components/PlayerContainer/ProgramInfo/index.tsx +1 -1
  51. package/Components/PlayerContainer/index.ts +1 -1
  52. package/Components/River/ComponentsMap/ComponentsMap.tsx +0 -1
  53. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +378 -0
  54. package/Components/River/ComponentsMap/hooks/useLoadingState.ts +2 -2
  55. package/Components/River/RefreshControl.tsx +11 -17
  56. package/Components/River/TV/River.tsx +2 -17
  57. package/Components/River/TV/index.tsx +3 -1
  58. package/Components/River/TV/withPipesV1DataLoader.tsx +43 -0
  59. package/Components/River/TV/withRiverDataLoader.tsx +17 -0
  60. package/Components/River/TV/withTVEventHandler.tsx +1 -1
  61. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -0
  62. package/Components/River/__tests__/river.test.js +12 -26
  63. package/Components/River/index.tsx +1 -1
  64. package/Components/Screen/__tests__/Screen.test.tsx +28 -29
  65. package/Components/Screen/__tests__/navigationHandler.test.ts +133 -22
  66. package/Components/Screen/navigationHandler.ts +20 -2
  67. package/Components/ScreenRevealManager/ScreenRevealManager.ts +76 -0
  68. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +107 -0
  69. package/Components/ScreenRevealManager/__tests__/withScreenRevealManager.test.tsx +96 -0
  70. package/Components/ScreenRevealManager/index.ts +1 -0
  71. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +79 -0
  72. package/Components/Tabs/TV/Tabs.android.tsx +1 -3
  73. package/Components/Tabs/Tabs.tsx +2 -3
  74. package/Components/TextInputTv/__tests__/__snapshots__/TextInputTv.test.js.snap +13 -0
  75. package/Components/TextInputTv/index.tsx +11 -0
  76. package/Components/Touchable/__tests__/__snapshots__/touchable.test.tsx.snap +34 -0
  77. package/Components/Touchable/__tests__/touchable.test.tsx +12 -17
  78. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +15 -9
  79. package/Components/VideoLive/animationUtils.ts +3 -3
  80. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +3 -9
  81. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +294 -0
  82. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +93 -0
  83. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +73 -29
  84. package/Components/VideoModal/PlayerDetails.tsx +24 -2
  85. package/Components/VideoModal/PlayerWrapper.tsx +26 -142
  86. package/Components/VideoModal/VideoModal.tsx +3 -17
  87. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +5 -5
  88. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -7
  89. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +44 -240
  90. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +9 -1
  91. package/Components/VideoModal/hooks/index.ts +0 -2
  92. package/Components/VideoModal/hooks/useDelayedPlayerDetails.ts +40 -15
  93. package/Components/VideoModal/hooks/useModalSize.ts +18 -2
  94. package/Components/VideoModal/hooks/utils/__tests__/showDetails.test.ts +2 -2
  95. package/Components/VideoModal/hooks/utils/index.ts +4 -0
  96. package/Components/VideoModal/utils.ts +6 -0
  97. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +12 -16
  98. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +84 -24
  99. package/Contexts/CellFocusedStateContext/index.tsx +27 -0
  100. package/Contexts/ConfigutaionContext/__tests__/ConfigurationProvider.test.tsx +3 -3
  101. package/Contexts/ScreenContext/index.tsx +46 -6
  102. package/Decorators/ConfigurationWrapper/__tests__/withConfigurationProvider.test.tsx +3 -3
  103. package/Decorators/ConfigurationWrapper/withConfigurationProvider.tsx +2 -2
  104. package/Decorators/RiverFeedLoader/__tests__/__snapshots__/riverFeedLoader.test.tsx.snap +221 -209
  105. package/Decorators/RiverFeedLoader/__tests__/riverFeedLoader.test.tsx +14 -16
  106. package/Decorators/RiverFeedLoader/__tests__/utils.test.ts +0 -20
  107. package/Decorators/RiverFeedLoader/index.tsx +22 -4
  108. package/Decorators/RiverFeedLoader/utils/index.ts +0 -18
  109. package/Decorators/RiverResolver/__tests__/riverResolver.test.tsx +3 -6
  110. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -0
  111. package/Decorators/ZappPipesDataConnector/__tests__/NullFeedResolver.test.tsx +78 -0
  112. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +205 -0
  113. package/Decorators/ZappPipesDataConnector/__tests__/StaticFeedResolver.test.tsx +251 -0
  114. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +368 -0
  115. package/Decorators/ZappPipesDataConnector/__tests__/utils.test.ts +39 -0
  116. package/Decorators/ZappPipesDataConnector/index.tsx +26 -293
  117. package/Decorators/ZappPipesDataConnector/resolvers/NullFeedResolver.tsx +25 -0
  118. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +87 -0
  119. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +266 -0
  120. package/Decorators/ZappPipesDataConnector/types.ts +29 -0
  121. package/Decorators/ZappPipesDataConnector/utils/mongoFilter.ts +738 -0
  122. package/Decorators/ZappPipesDataConnector/utils/useFilter.tsx +157 -0
  123. package/events/index.ts +3 -0
  124. package/package.json +5 -10
  125. package/Components/River/__tests__/__snapshots__/river.test.js.snap +0 -27
  126. package/Components/VideoModal/hooks/useBackgroundColor.ts +0 -10
@@ -1,28 +1,58 @@
1
1
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
2
- import { StorageSingleValueProvider } from "@applicaster/zapp-react-native-bridge/ZappStorage/StorageSingleSelectProvider";
2
+ import { StorageSingleValueProvider } from "@applicaster/zapp-react-native-utils/storage/StorageSingleSelectProvider";
3
3
  import { PushTopicManager } from "@applicaster/zapp-react-native-bridge/PushNotifications/PushTopicManager";
4
- import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-bridge/ZappStorage/StorageMultiSelectProvider";
4
+ import { StorageMultiSelectProvider } from "@applicaster/zapp-react-native-utils/storage/StorageMultiSelectProvider";
5
5
  import React, { useEffect } from "react";
6
6
  import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayer";
7
7
  import { BehaviorSubject } from "rxjs";
8
8
  import { masterCellLogger } from "../logger";
9
9
  import get from "lodash/get";
10
-
11
- const parseContextKey = (key: string): string | null => {
12
- if (!key?.startsWith("@{ctx/")) return null;
13
-
14
- return key.substring("@{ctx/".length, key.length - 1);
10
+ import { ScreenMultiSelectProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenStateMultiSelectProvider";
11
+ import { ScreenSingleValueProvider } from "@applicaster/zapp-react-native-utils/storage/ScreenSingleValueProvider";
12
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
13
+ import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
14
+
15
+ const parseContextKey = (
16
+ key: string,
17
+ context: string = "ctx"
18
+ ): string | null => {
19
+ if (!key?.startsWith(`@{${context}/`)) return null;
20
+
21
+ return key.substring(`@{${context}/`.length, key.length - 1);
15
22
  };
16
23
 
17
24
  const getDataSourceProvider = (
18
- behavior: Behavior
25
+ behavior: Behavior,
26
+ screenRoute: string,
27
+ screenStateStore: ReturnType<typeof useScreenStateStore>
19
28
  ): BehaviorSubject<string[] | string> | null => {
20
29
  if (!behavior) return null;
21
30
 
22
31
  const selection = String(behavior.current_selection);
32
+ const screenKey = parseContextKey(selection, "screen");
33
+
34
+ if (screenKey) {
35
+ if (behavior.select_mode === "multi") {
36
+ return ScreenMultiSelectProvider.getProvider(
37
+ screenKey,
38
+ screenRoute,
39
+ screenStateStore
40
+ ).getObservable();
41
+ }
42
+
43
+ if (behavior.select_mode === "single") {
44
+ return ScreenSingleValueProvider.getProvider(
45
+ screenKey,
46
+ screenRoute,
47
+ screenStateStore
48
+ ).getObservable();
49
+ }
50
+ }
51
+
23
52
  const contextKey = parseContextKey(selection);
24
53
 
25
54
  if (contextKey) {
55
+ // TODO: Add storage scope to behavior
26
56
  if (behavior.select_mode === "multi") {
27
57
  return StorageMultiSelectProvider.getProvider(contextKey).getObservable();
28
58
  }
@@ -41,6 +71,8 @@ const getDataSourceProvider = (
41
71
 
42
72
  export const useBehaviorUpdate = (behavior: Behavior) => {
43
73
  const [lastUpdate, setLastUpdate] = React.useState<number | null>(null);
74
+ const screenRoute = useRoute()?.pathname || "";
75
+ const screenStateStore = useScreenStateStore();
44
76
  const player = usePlayer();
45
77
 
46
78
  const triggerUpdate = () => setLastUpdate(Date.now());
@@ -48,7 +80,11 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
48
80
  useEffect(() => {
49
81
  if (!behavior) return;
50
82
 
51
- const dataSource = getDataSourceProvider(behavior);
83
+ const dataSource = getDataSourceProvider(
84
+ behavior,
85
+ screenRoute,
86
+ screenStateStore
87
+ );
52
88
 
53
89
  if (dataSource) {
54
90
  const subscription = dataSource.subscribe(triggerUpdate);
@@ -72,10 +108,17 @@ export const useBehaviorUpdate = (behavior: Behavior) => {
72
108
 
73
109
  // We cant use async in this function (its inside render),
74
110
  // so we rely on useBehaviorUpdate to update current value and trigger re-render
75
- export const isCellSelected = (
76
- item: ZappEntry,
77
- behavior?: Behavior
78
- ): boolean => {
111
+ export const isCellSelected = ({
112
+ item,
113
+ screenRoute,
114
+ screenStateStore,
115
+ behavior,
116
+ }: {
117
+ item: ZappEntry;
118
+ screenRoute: string;
119
+ screenStateStore: ReturnType<typeof useScreenStateStore>;
120
+ behavior?: Behavior;
121
+ }): boolean => {
79
122
  if (!behavior) return false;
80
123
 
81
124
  const id = behavior.selector ? get(item, behavior.selector) : item.id;
@@ -99,7 +142,32 @@ export const isCellSelected = (
99
142
  }
100
143
 
101
144
  const selection = String(behavior.current_selection);
102
- const contextKey = parseContextKey(selection);
145
+
146
+ const screenKey = parseContextKey(selection, "screen");
147
+
148
+ if (screenKey) {
149
+ if (behavior.select_mode === "single") {
150
+ const selectedItem = ScreenSingleValueProvider.getProvider(
151
+ screenKey,
152
+ screenRoute,
153
+ screenStateStore
154
+ ).getValue();
155
+
156
+ return selectedItem === String(id);
157
+ }
158
+
159
+ if (behavior.select_mode === "multi") {
160
+ const selectedItems = ScreenMultiSelectProvider.getProvider(
161
+ screenKey,
162
+ screenRoute,
163
+ screenStateStore
164
+ ).getSelectedItems();
165
+
166
+ return selectedItems?.includes(String(id));
167
+ }
168
+ }
169
+
170
+ const contextKey = parseContextKey(selection, "ctx");
103
171
 
104
172
  if (contextKey) {
105
173
  if (behavior.select_mode === "single") {
@@ -8,6 +8,8 @@ import { masterCellLogger } from "../logger";
8
8
  import { getCellState } from "../../Cell/utils";
9
9
  import { getColorFromData } from "@applicaster/zapp-react-native-utils/cellUtils";
10
10
  import { isCellSelected, useBehaviorUpdate } from "./behaviorProvider";
11
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
12
+ import { useScreenStateStore } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useScreenStateStore";
11
13
 
12
14
  const hasElementSpecificViewType = (viewType) => (element) => {
13
15
  if (R.isNil(element)) {
@@ -190,10 +192,6 @@ export const getFocusedButtonId = (focusable) => {
190
192
  });
191
193
  };
192
194
 
193
- export const isSelected = (item: ZappEntry, behavior?: Behavior) => {
194
- return isCellSelected(item, behavior);
195
- };
196
-
197
195
  export const useCellState = ({
198
196
  item,
199
197
  behavior,
@@ -204,9 +202,17 @@ export const useCellState = ({
204
202
  focused: boolean;
205
203
  }): CellState => {
206
204
  const lastUpdate = useBehaviorUpdate(behavior);
205
+ const router = useRoute();
206
+ const screenStateStore = useScreenStateStore();
207
207
 
208
208
  const _isSelected = useMemo(
209
- () => isSelected(item, behavior),
209
+ () =>
210
+ isCellSelected({
211
+ item,
212
+ screenRoute: router?.pathname,
213
+ screenStateStore,
214
+ behavior,
215
+ }),
210
216
  [behavior, item, lastUpdate]
211
217
  );
212
218
 
@@ -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}
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
-
3
- import renderer, { act } from "react-test-renderer";
2
+ import { render } from "@testing-library/react-native";
4
3
 
5
4
  jest.useFakeTimers({ legacyFakeTimers: true });
6
5
 
@@ -19,29 +18,27 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/utils", () => {
19
18
  };
20
19
  });
21
20
 
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
- },
21
+ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
22
+ ...jest.requireActual("@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
+ }),
40
37
  },
41
- ],
42
- }),
43
- })
44
- );
38
+ },
39
+ ],
40
+ }),
41
+ }));
45
42
 
46
43
  jest.mock("react-native-safe-area-context", () => ({
47
44
  useSafeAreaInsets: () => ({ top: 44 }),
@@ -51,24 +48,18 @@ describe("OfflineHandler", () => {
51
48
  const { OfflineHandler, NotificationView } = require("../");
52
49
 
53
50
  it("renders", () => {
54
- const instance = renderer.create(<OfflineHandler />);
55
- expect(instance.toJSON()).toMatchSnapshot();
51
+ const { toJSON } = render(<OfflineHandler />);
52
+ expect(toJSON()).toMatchSnapshot();
56
53
  });
57
54
 
58
55
  it("renders Notification mode if component was rendered while online", () => {
59
56
  mockConnectionStatus = true;
60
57
 
61
- let instance;
62
-
63
- act(() => {
64
- instance = renderer.create(<OfflineHandler />);
65
- });
58
+ const { rerender, UNSAFE_getByType } = render(<OfflineHandler />);
66
59
 
67
- act(() => {
68
- instance.update(<OfflineHandler />);
69
- });
60
+ rerender(<OfflineHandler />);
70
61
 
71
- const notificationsView = instance.root.findByType(NotificationView);
62
+ const notificationsView = UNSAFE_getByType(NotificationView);
72
63
  expect(notificationsView).toBeDefined();
73
64
  });
74
65
  });
@@ -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%",
@@ -145,7 +149,6 @@ const nativeStyles = {
145
149
  },
146
150
  playerScreen: {
147
151
  flex: 1,
148
- backgroundColor: "black",
149
152
  overflow: "hidden",
150
153
  },
151
154
  playerWrapper: {
@@ -260,9 +263,15 @@ const PlayerContainerComponent = (props: Props) => {
260
263
  return;
261
264
  }
262
265
 
266
+ // send command to clear and stop player
267
+ PlayerNativeSendCommand(
268
+ PlayerNativeCommandTypes.clearPlayerData,
269
+ state.playerId
270
+ );
271
+
263
272
  showNavBar(true);
264
273
  navigator.goBack();
265
- }, [isModal, navigator.goBack, showNavBar]);
274
+ }, [isModal, navigator.goBack, state.playerId, showNavBar]);
266
275
 
267
276
  const playEntry = (entry) => navigator.replaceTop(entry, { mode });
268
277
 
@@ -390,13 +399,17 @@ const PlayerContainerComponent = (props: Props) => {
390
399
  }
391
400
  };
392
401
 
393
- const playerRemoteHandler = (event, isLanguageOverlayVisible) => {
394
- const { eventType } = event;
402
+ const playerRemoteHandler = React.useCallback(
403
+ (isLanguageOverlayVisible = false) =>
404
+ (event) => {
405
+ const { eventType } = event;
395
406
 
396
- if (!isLanguageOverlayVisible && eventType === "menu") {
397
- close();
398
- }
399
- };
407
+ if (!isLanguageOverlayVisible && eventType === "menu") {
408
+ close();
409
+ }
410
+ },
411
+ [close]
412
+ );
400
413
 
401
414
  // Effects
402
415
  useEffect(() => {
@@ -410,7 +423,10 @@ const PlayerContainerComponent = (props: Props) => {
410
423
  id: playerContainerId,
411
424
  listener: {
412
425
  onVideoEnd,
413
- onError,
426
+ onError: (err: Error) => {
427
+ // Adapt Error to the expected shape for onError
428
+ onError({ error: err });
429
+ },
414
430
  onLoad,
415
431
  onPlayerClose: close,
416
432
  onPlayerDetached: close,
@@ -509,16 +525,6 @@ const PlayerContainerComponent = (props: Props) => {
509
525
  }
510
526
  }, [isAudioContent]);
511
527
 
512
- // Needs to handle back button on Apple TV
513
- // https://github.com/facebook/react-native/issues/18930
514
- useEffect(() => {
515
- TVMenuControl?.enableTVMenuKey();
516
-
517
- return () => {
518
- TVMenuControl?.disableTVMenuKey();
519
- };
520
- }, []);
521
-
522
528
  useEffect(() => {
523
529
  playerEvent("source_changed", { item });
524
530
 
@@ -565,8 +571,9 @@ const PlayerContainerComponent = (props: Props) => {
565
571
  const isInlineTV = isInlineTVUtil(screenData);
566
572
 
567
573
  const inline =
568
- [VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(mode) ||
569
- isInlineTV;
574
+ [VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(
575
+ mode as any
576
+ ) || isInlineTV;
570
577
 
571
578
  const value = React.useMemo(
572
579
  () => ({ playerId: state.playerId }),
@@ -587,7 +594,11 @@ const PlayerContainerComponent = (props: Props) => {
587
594
  );
588
595
  }
589
596
 
590
- if (screen_background_color && mode !== VideoModalMode.FULLSCREEN) {
597
+ if (
598
+ screen_background_color &&
599
+ mode !== VideoModalMode.FULLSCREEN &&
600
+ isTV()
601
+ ) {
591
602
  updatedStyles.playerScreen.backgroundColor = screen_background_color;
592
603
  }
593
604
 
@@ -617,6 +628,8 @@ const PlayerContainerComponent = (props: Props) => {
617
628
  playNextData,
618
629
  };
619
630
 
631
+ const pointerEventsProp = mode === "MINIMIZED" ? "box-none" : "auto";
632
+
620
633
  return (
621
634
  <PlayerStateContext.Provider value={value}>
622
635
  <PlayerContainerContextProvider
@@ -627,9 +640,9 @@ const PlayerContainerComponent = (props: Props) => {
627
640
  <PlayerContainerContext.Consumer>
628
641
  {(context) => (
629
642
  <TVEventHandlerComponent
630
- tvEventHandler={(_component, event) =>
631
- playerRemoteHandler(event, context.isLanguageOverlayVisible)
632
- }
643
+ tvEventHandler={playerRemoteHandler(
644
+ context.isLanguageOverlayVisible
645
+ )}
633
646
  >
634
647
  <FocusableGroup
635
648
  id={FocusableGroupMainContainerId}
@@ -637,14 +650,17 @@ const PlayerContainerComponent = (props: Props) => {
637
650
  preferredFocus
638
651
  shouldUsePreferredFocus
639
652
  groupId={groupId}
653
+ pointerEvents={pointerEventsProp}
640
654
  >
641
655
  {/* Video player and components */}
642
656
  <View
643
657
  style={styles.playerScreen}
644
658
  testID={"player-screen-container"}
659
+ pointerEvents={pointerEventsProp}
645
660
  >
646
661
  {/* Player container */}
647
662
  <View
663
+ pointerEvents={pointerEventsProp}
648
664
  style={[
649
665
  styles.playerWrapper,
650
666
  // eslint-disable-next-line react-native/no-inline-styles, react-native/no-color-literals
@@ -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";
@@ -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}