@applicaster/zapp-react-native-ui-components 12.0.0-rc.12 → 12.0.0-rc.121

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 (162) hide show
  1. package/Components/AudioPlayer/AudioPlayer.tsx +9 -1
  2. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +5 -0
  3. package/Components/AudioPlayer/helpers.tsx +1 -0
  4. package/Components/BaseFocusable/index.tsx +3 -3
  5. package/Components/Cell/Cell.tsx +32 -11
  6. package/Components/Cell/CellWithFocusable.tsx +40 -19
  7. package/Components/Cell/TvOSCellComponent.tsx +5 -9
  8. package/Components/ErrorScreen/index.tsx +1 -1
  9. package/Components/FastImage/index.android.js +1 -1
  10. package/Components/Focusable/Focusable.tsx +6 -1
  11. package/Components/FocusableCell/index.tsx +7 -7
  12. package/Components/FocusableGroup/index.tsx +11 -2
  13. package/Components/FocusableList/FocusableChild.ts +24 -14
  14. package/Components/FocusableList/FocusableItem.tsx +1 -1
  15. package/Components/FocusableList/FocusableListItemWrapper.tsx +76 -0
  16. package/Components/FocusableList/hooks/useCellState.android.ts +3 -1
  17. package/Components/FocusableList/index.tsx +26 -25
  18. package/Components/FreezeWithCallback/Freeze.tsx +31 -0
  19. package/Components/FreezeWithCallback/LICENSE +21 -0
  20. package/Components/FreezeWithCallback/Suspender.tsx +17 -0
  21. package/Components/FreezeWithCallback/__tests__/index.test.tsx +170 -0
  22. package/Components/FreezeWithCallback/index.tsx +3 -0
  23. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +11 -8
  24. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +13 -6
  25. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  26. package/Components/HandlePlayable/HandlePlayable.tsx +4 -1
  27. package/Components/HookRenderer/index.tsx +1 -6
  28. package/Components/Image/Image.android.tsx +3 -25
  29. package/Components/Image/Image.tsx +18 -2
  30. package/Components/Image/utils/index.ts +39 -0
  31. package/Components/Layout/TV/ScreenContainer.tsx +79 -5
  32. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +2 -2
  33. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +38 -28
  34. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +25 -13
  35. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +10 -50
  36. package/Components/Layout/TV/__tests__/index.test.tsx +20 -108
  37. package/Components/Layout/TV/index.tsx +15 -84
  38. package/Components/Layout/TV/index.web.tsx +33 -0
  39. package/Components/Layout/index.tsx +15 -11
  40. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +4 -1
  41. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +86 -117
  42. package/Components/MasterCell/DefaultComponents/CellBadge/index.tsx +21 -8
  43. package/Components/MasterCell/DefaultComponents/DynamicBadge.tsx +4 -2
  44. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
  45. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  46. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -3
  47. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  48. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/index.ts +71 -0
  49. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -1
  50. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +37 -2
  51. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  52. package/Components/MasterCell/DefaultComponents/Text/index.tsx +14 -2
  53. package/Components/MasterCell/DefaultComponents/Toggle.tsx +5 -1
  54. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  55. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +24 -9
  56. package/Components/MasterCell/DefaultComponents/index.ts +2 -0
  57. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +4 -1
  58. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +10 -2
  59. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +6 -10
  60. package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +7 -1
  61. package/Components/MasterCell/dataAdapter.ts +21 -7
  62. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +1 -1
  63. package/Components/MasterCell/index.tsx +5 -3
  64. package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
  65. package/Components/MasterCell/utils/index.ts +33 -35
  66. package/Components/MeasurmentsPortal/BasicMeasurementsPortal.tsx +11 -7
  67. package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +10 -1
  68. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  69. package/Components/ModalComponent/Button/Item.tsx +82 -0
  70. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  71. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  72. package/Components/ModalComponent/Button/assets.ts +4 -0
  73. package/Components/ModalComponent/Button/index.tsx +111 -0
  74. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  75. package/Components/ModalComponent/Header/Title.tsx +70 -0
  76. package/Components/ModalComponent/Header/assets.ts +4 -0
  77. package/Components/ModalComponent/Header/index.tsx +71 -0
  78. package/Components/ModalComponent/Header/utils.ts +79 -0
  79. package/Components/ModalComponent/index.tsx +38 -0
  80. package/Components/ModalComponent/utils.ts +126 -0
  81. package/Components/Navigator/StackNavigator.tsx +57 -0
  82. package/Components/Navigator/index.ts +1 -0
  83. package/Components/PlayerContainer/PlayerContainer.tsx +66 -31
  84. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  85. package/Components/PlayerImageBackground/index.tsx +34 -8
  86. package/Components/River/ComponentsMap/ComponentsMap.tsx +97 -2
  87. package/Components/River/RefreshControl.tsx +55 -1
  88. package/Components/River/TV/River.tsx +2 -25
  89. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -1
  90. package/Components/River/__tests__/componentsMap.test.js +7 -0
  91. package/Components/River/useScreenConfiguration.ts +2 -2
  92. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -0
  93. package/Components/RouteManager/__tests__/routeManager.test.js +9 -2
  94. package/Components/RouteManager/index.tsx +4 -2
  95. package/Components/Screen/TV/hooks/index.ts +1 -0
  96. package/Components/Screen/TV/hooks/useInitialFocus.ts +70 -0
  97. package/Components/Screen/TV/index.web.tsx +178 -0
  98. package/Components/Screen/__tests__/Screen.test.tsx +43 -75
  99. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +24 -6
  100. package/Components/Screen/__tests__/navigationHandler.test.ts +1 -178
  101. package/Components/Screen/index.tsx +104 -65
  102. package/Components/Screen/navigationHandler.ts +6 -85
  103. package/Components/Screen/orientationHandler.ts +18 -7
  104. package/Components/Screen/utils.ts +16 -0
  105. package/Components/ScreenResolver/index.tsx +10 -13
  106. package/Components/Tabs/TV/styles.ts +1 -1
  107. package/Components/TrackedView/index.tsx +6 -3
  108. package/Components/Transitioner/Scene.tsx +39 -26
  109. package/Components/Transitioner/Transitioner.tsx +46 -48
  110. package/Components/Transitioner/__tests__/Scene.test.js +7 -0
  111. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -4
  112. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -0
  113. package/Components/VideoLive/LiveImageManager.ts +70 -14
  114. package/Components/VideoLive/PlayerLiveImageComponent.tsx +132 -95
  115. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  116. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +21 -29
  117. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +66 -0
  118. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +376 -0
  119. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +165 -0
  120. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +473 -0
  121. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +182 -0
  122. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  123. package/Components/VideoModal/ModalAnimation/utils.ts +302 -0
  124. package/Components/VideoModal/PlayerDetails.tsx +6 -3
  125. package/Components/VideoModal/PlayerWrapper.tsx +81 -49
  126. package/Components/VideoModal/VideoModal.tsx +23 -40
  127. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  128. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +12 -1
  129. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +312 -166
  130. package/Components/VideoModal/hooks/useModalSize.ts +10 -12
  131. package/Components/VideoModal/utils.ts +8 -5
  132. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  133. package/Components/Viewport/ViewportTracker/ViewportTracker.tsx +31 -40
  134. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  135. package/Components/Viewport/ViewportTracker/index.tsx +1 -0
  136. package/Components/Viewport/utils.js +1 -1
  137. package/Components/ZappFrameworkComponents/BarView/BarView.tsx +4 -3
  138. package/Components/ZappUIComponent/index.tsx +22 -12
  139. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +4 -4
  140. package/Components/index.js +2 -0
  141. package/Contexts/FocusableGroupContext/FocusableGroupContext.ts +3 -0
  142. package/Contexts/FocusableGroupContext/FocusableGroupContextProvider.tsx +16 -0
  143. package/Contexts/FocusableGroupContext/__tests__/FocusableGroupContextProvider.test.tsx +22 -0
  144. package/Contexts/FocusableGroupContext/__tests__/withFocusableContext.test.tsx +26 -0
  145. package/Contexts/FocusableGroupContext/index.ts +7 -0
  146. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +17 -0
  147. package/Contexts/MenuToggleContext/{index.js → index.ts} +16 -0
  148. package/Contexts/ScreenContext/__tests__/__snapshots__/index.test.tsx.snap +3 -0
  149. package/Contexts/ScreenContext/__tests__/index.test.tsx +27 -0
  150. package/Contexts/ScreenContext/index.tsx +95 -29
  151. package/Contexts/ScreenDataContext/index.tsx +20 -0
  152. package/Contexts/ZappPipesContext/ZappPipesEntryContext.ts +1 -1
  153. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  154. package/const.ts +6 -0
  155. package/events/index.ts +1 -0
  156. package/index.js +3 -0
  157. package/package.json +5 -5
  158. package/Components/Layout/TV/TransitionOverlay.tsx +0 -64
  159. package/Components/VideoModal/hooks/usePosition.ts +0 -50
  160. /package/Components/FocusableGroup/{index.android.js → index.android.ts} +0 -0
  161. /package/Components/FocusableGroup/{index.ios.js → index.ios.ts} +0 -0
  162. /package/Contexts/{index.js → index.ts} +0 -0
@@ -5,13 +5,30 @@ import * as R from "ramda";
5
5
  import { ScreenLayoutContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenLayoutContext";
6
6
  import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
7
7
  import { ifEmptyUseFallback } from "@applicaster/zapp-react-native-utils/cellUtils";
8
- import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
8
+ import {
9
+ useCurrentScreenData,
10
+ useNavbarState,
11
+ } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
9
12
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
10
13
 
11
14
  import { useScreenConfiguration } from "../../River/useScreenConfiguration";
12
- import { routeIsPlayerScreen } from "@applicaster/zapp-react-native-utils/navigationUtils";
15
+ import {
16
+ findMenuPlugin,
17
+ getNavigationProps,
18
+ routeIsPlayerScreen,
19
+ } from "@applicaster/zapp-react-native-utils/navigationUtils";
20
+ import { isApplePlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
21
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
22
+ import { NavBarContainer } from "./NavBarContainer";
23
+
24
+ type ComponentsExtraProps = {
25
+ Background?: Record<string, any>;
26
+ NavBar?: Record<string, any>;
27
+ };
13
28
 
14
29
  type Props = {
30
+ ComponentsExtraProps?: ComponentsExtraProps;
31
+ NavBar: React.ComponentType<any>;
15
32
  children: React.ReactNode;
16
33
  };
17
34
 
@@ -30,9 +47,13 @@ const styles = StyleSheet.create({
30
47
  container: { flex: 1, height: "100%", width: "100%" },
31
48
  });
32
49
 
50
+ const isTVOS = isApplePlatform();
51
+
33
52
  // eslint-disable-next-line react/display-name
34
53
  export const ScreenContainer = React.memo(function ScreenContainer({
35
54
  children,
55
+ ComponentsExtraProps,
56
+ NavBar,
36
57
  }: Props) {
37
58
  const { screenMarginBottom } = React.useContext(ScreenLayoutContext);
38
59
  const { currentRoute, screenData } = useNavigation();
@@ -80,9 +101,62 @@ export const ScreenContainer = React.memo(function ScreenContainer({
80
101
  [themeStyles]
81
102
  );
82
103
 
104
+ const navigator = useNavigation();
105
+ const { activeRiver } = navigator;
106
+ const { title, visible } = useNavbarState();
107
+
108
+ const { plugins = [] } = usePickFromState([
109
+ "appState",
110
+ "remoteConfigurations",
111
+ "plugins",
112
+ ]);
113
+
114
+ const navigationProps = getNavigationProps({
115
+ navigator,
116
+ title,
117
+ category: "menu",
118
+ });
119
+
120
+ const menuPlugin = React.useMemo(
121
+ () => findMenuPlugin(activeRiver?.navigations, plugins),
122
+ [activeRiver?.navigations]
123
+ );
124
+
125
+ const NavBarComponent = React.useMemo(
126
+ () => NavBar || (menuPlugin.module as React.ComponentType<any>),
127
+ []
128
+ );
129
+
130
+ const [navBarReady, setNavBarReady] = React.useState(false);
131
+
132
+ const navBarContainer = (
133
+ <NavBarContainer isVisible={visible} onReady={setNavBarReady}>
134
+ <NavBarComponent
135
+ ref={ComponentsExtraProps?.NavBar?.ref}
136
+ isVisible={visible}
137
+ menuPlugin={menuPlugin}
138
+ navigationProps={navigationProps}
139
+ {...R.omit(["ref"])(ComponentsExtraProps?.NavBar)}
140
+ />
141
+ </NavBarContainer>
142
+ );
143
+
83
144
  return (
84
- <View testID="screen-container" style={viewStyles}>
85
- {children}
86
- </View>
145
+ <>
146
+ {!isTVOS ? navBarContainer : null}
147
+ {navBarReady ? (
148
+ /**
149
+ Need to re-mount this component on each navigation event
150
+ It's a hack to work around the fact that we don't support
151
+ correct screen rendering in our navigator (shared currentRoute state)
152
+ **/
153
+ <View testID="screen-container" style={viewStyles}>
154
+ {children}
155
+ </View>
156
+ ) : null}
157
+ {/** Render NavBarContainer over ScreenContainer to let tvOS native
158
+ focus manager works correctly to focus nav bar items first **/}
159
+ {isTVOS ? navBarContainer : null}
160
+ </>
87
161
  );
88
162
  });
@@ -60,7 +60,7 @@ export function ScreenLayoutContextProvider(props: {
60
60
  initialState
61
61
  );
62
62
 
63
- const screeenLayoutValue = React.useMemo(
63
+ const screenLayoutValue = React.useMemo(
64
64
  () => ({
65
65
  ...screenLayout,
66
66
  setScreenLayout,
@@ -69,7 +69,7 @@ export function ScreenLayoutContextProvider(props: {
69
69
  );
70
70
 
71
71
  return (
72
- <ScreenLayoutContext.Provider value={screeenLayoutValue}>
72
+ <ScreenLayoutContext.Provider value={screenLayoutValue}>
73
73
  {props.children}
74
74
  </ScreenLayoutContext.Provider>
75
75
  );
@@ -1,14 +1,27 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import { render } from "@testing-library/react-native";
3
+ import { render, waitFor } from "@testing-library/react-native";
4
+ import { WrappedWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
4
5
 
5
6
  import { ScreenLayoutContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenLayoutContext";
6
7
 
7
8
  const navigator_mock = {
8
9
  currentRoute: "/river/A1234",
9
10
  screenData: {},
11
+ activeRiver: {
12
+ navigations: {},
13
+ id: "A1234",
14
+ home: false,
15
+ },
10
16
  };
11
17
 
18
+ jest.mock("@applicaster/zapp-react-native-utils/navigationUtils", () => ({
19
+ ...jest.requireActual<any>(
20
+ "@applicaster/zapp-react-native-utils/navigationUtils"
21
+ ),
22
+ findMenuPlugin: () => ({}),
23
+ }));
24
+
12
25
  jest.mock("@applicaster/quick-brick-core/App/ActionSetters", () => ({
13
26
  useRiverInitialState: () => ({}),
14
27
  }));
@@ -17,13 +30,13 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
17
30
  useNavigation: () => navigator_mock,
18
31
  }));
19
32
 
20
- jest.mock("../../../River/useScreenConfiguration.ts", () => ({
33
+ jest.mock("../../../River/useScreenConfiguration", () => ({
21
34
  useScreenConfiguration: () => ({}),
22
35
  }));
23
36
 
24
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
25
- useCurrentScreenData: jest.fn(() => ({})),
26
- }));
37
+ jest.mock(
38
+ "@applicaster/zapp-react-native-utils/reactHooks/screen/useCurrentScreenData"
39
+ );
27
40
 
28
41
  jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
29
42
  useTheme: () => ({}),
@@ -44,42 +57,39 @@ describe("ScreenContainer", () => {
44
57
  const setScreenLayout = () => {};
45
58
 
46
59
  const wrapper = ({ children }) => (
47
- <ScreenLayoutContext.Provider value={{ ...screenLayout, setScreenLayout }}>
48
- {children}
49
- </ScreenLayoutContext.Provider>
60
+ <WrappedWithProviders>
61
+ <ScreenLayoutContext.Provider
62
+ value={{ ...screenLayout, setScreenLayout }}
63
+ >
64
+ <ScreenContainer NavBar={View}>{children}</ScreenContainer>
65
+ </ScreenLayoutContext.Provider>
66
+ </WrappedWithProviders>
50
67
  );
51
68
 
52
69
  const TestComp = () => <View testID="test-component" />;
53
70
 
54
71
  it("renders", () => {
55
- const { toJSON } = render(
56
- <ScreenContainer>
57
- <TestComp />
58
- </ScreenContainer>,
59
- { wrapper }
60
- );
72
+ const { toJSON } = render(<TestComp />, { wrapper });
61
73
 
62
74
  expect(toJSON()).toMatchSnapshot();
63
75
  });
64
76
 
65
- it("renders passed component", () => {
66
- const { getByTestId } = render(
67
- <ScreenContainer>
68
- <TestComp />
69
- </ScreenContainer>,
70
- { wrapper }
71
- );
77
+ it("renders passed component", async () => {
78
+ const { getByTestId } = render(<TestComp />, { wrapper });
79
+
80
+ await waitFor(() => {
81
+ return expect(getByTestId("screen-container")).toBeDefined();
82
+ });
72
83
 
73
84
  expect(getByTestId("test-component")).toBeDefined();
74
85
  });
75
86
 
76
- it("sets margins provided by the theme", () => {
77
- const { getByTestId } = render(
78
- <ScreenContainer>
79
- <TestComp />
80
- </ScreenContainer>,
81
- { wrapper }
82
- );
87
+ it("sets margins provided by the theme", async () => {
88
+ const { getByTestId } = render(<TestComp />, { wrapper });
89
+
90
+ await waitFor(() => {
91
+ return expect(getByTestId("screen-container")).toBeDefined();
92
+ });
83
93
 
84
94
  const screen = getByTestId("screen-container");
85
95
  expect(screen.props.style).toMatchSnapshot();
@@ -1,28 +1,40 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
3
  exports[`ScreenContainer renders 1`] = `
4
- <View
4
+ <RNCSafeAreaProvider
5
+ onInsetsChange={[Function]}
5
6
  style={
6
7
  Array [
7
8
  Object {
8
9
  "flex": 1,
9
- "height": "100%",
10
- "width": "100%",
11
- },
12
- Object {
13
- "backgroundColor": "transparent",
14
- "marginBottom": 10,
15
- "paddingBottom": 0,
16
- "paddingTop": 0,
17
10
  },
11
+ undefined,
18
12
  ]
19
13
  }
20
- testID="screen-container"
21
14
  >
22
15
  <View
23
- testID="test-component"
24
- />
25
- </View>
16
+ style={
17
+ Array [
18
+ Object {
19
+ "position": "absolute",
20
+ "top": 0,
21
+ "width": 1920,
22
+ "zIndex": 10,
23
+ },
24
+ Object {
25
+ "maxHeight": 10,
26
+ },
27
+ ]
28
+ }
29
+ testID="nav-bar-container"
30
+ >
31
+ <View
32
+ isVisible={true}
33
+ menuPlugin={Object {}}
34
+ navigationProps={null}
35
+ />
36
+ </View>
37
+ </RNCSafeAreaProvider>
26
38
  `;
27
39
 
28
40
  exports[`ScreenContainer sets margins provided by the theme 1`] = `
@@ -2,58 +2,18 @@
2
2
 
3
3
  exports[`Layout TV renders 1`] = `
4
4
  <View
5
- style={
6
- Object {
7
- "flex": 1,
8
- "height": 1080,
9
- "width": 1920,
10
- }
11
- }
12
- testID="layout-container"
5
+ excludeFromFocusSearching={true}
6
+ id="/river/A1234"
7
+ preferredFocus={true}
13
8
  >
14
9
  <View
15
- backgroundImageUrl="http://applicaster.com"
16
- testID="background-component"
17
- >
18
- <View
19
- style={
20
- Array [
21
- Object {
22
- "position": "absolute",
23
- "top": 0,
24
- "width": 1920,
25
- "zIndex": 10,
26
- },
27
- Object {
28
- "maxHeight": 10,
29
- },
30
- ]
10
+ Components={
11
+ Object {
12
+ "Background": [Function],
13
+ "NavBar": [Function],
31
14
  }
32
- testID="nav-bar-container"
33
- >
34
- <View
35
- isVisible={true}
36
- menuPlugin={
37
- Object {
38
- "module": [Function],
39
- "name": "resolved-menu-plug",
40
- "type": "menu",
41
- }
42
- }
43
- navigationProps={
44
- Object {
45
- "assets": undefined,
46
- "home": undefined,
47
- "nav_items": undefined,
48
- "rules": undefined,
49
- "selected": undefined,
50
- "styles": undefined,
51
- "title": "",
52
- }
53
- }
54
- testID="nav-bar-component"
55
- />
56
- </View>
57
- </View>
15
+ }
16
+ route="/river/A1234"
17
+ />
58
18
  </View>
59
19
  `;
@@ -1,91 +1,49 @@
1
1
  import * as React from "react";
2
- import * as R from "ramda";
2
+ import { omit } from "ramda";
3
3
  import { View } from "react-native";
4
4
  import { render } from "@testing-library/react-native";
5
5
  import { Provider } from "react-redux";
6
- import { createStore } from "redux";
7
6
  import { NavigationContext } from "@applicaster/zapp-react-native-ui-components/Contexts/NavigationContext";
7
+ import configureStore from "redux-mock-store";
8
8
 
9
- import { ThemeContext } from "@applicaster/zapp-react-native-utils/theme";
9
+ const withoutChildren = omit(["children"]);
10
10
 
11
- jest.mock("@applicaster/quick-brick-core/App/ActionSetters", () => ({
12
- useRiverInitialState: () => ({}),
11
+ jest.mock("../../../Screen/TV/index.web", () => ({
12
+ Screen: View,
13
13
  }));
14
14
 
15
- jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
16
- useCurrentScreenData: jest.fn(() => ({
17
- navigations: [
18
- {
19
- category: "menu",
20
- navigation_type: "menu",
21
- styles: {
22
- hide_secondary_level_menu: false,
23
- },
24
- },
25
- ],
26
- })),
27
- }));
28
-
29
- const Layout = require("..").default;
30
-
31
- const ResolvedMenuPlug = () => <View testID="resolved-menu-plug" />;
15
+ const Layout = require("../index.web").default;
32
16
 
33
- const plugins = [
34
- {
35
- module: ResolvedMenuPlug,
36
- type: "menu",
37
- name: "resolved-menu-plug",
38
- },
39
- ];
40
-
41
- const bgImage = "http://applicaster.com";
42
- const isNavBarVisible = true;
43
-
44
- const store = createStore(() => ({
17
+ const mockStore = configureStore()({
45
18
  appState: { appReady: true },
46
- remoteConfigurations: { sdkAssets: { bgImage } },
47
- plugins,
48
- }));
19
+ });
49
20
 
50
21
  describe("Layout TV", () => {
51
- const themes = {
52
- myTheme: { screen_margin_top: 10, screen_margin_bottom: 10 },
53
- };
54
-
55
- const selectedThemeId = "myTheme";
56
-
57
22
  const navigator = {
58
- activeRiver: {
59
- navigations: [{ category: "menu", navigation_type: "menu" }],
60
- },
61
- canGoBack: () => false,
62
23
  currentRoute: "/river/A1234",
63
- screenData: {
64
- navigations: [{ category: "menu", navigation_type: "menu" }],
65
- },
66
- isNavBarVisible: isNavBarVisible,
24
+ canGoBack: jest.fn(),
25
+ mainStack: [
26
+ {
27
+ route: "/river/A1234",
28
+ state: { screen: {} },
29
+ },
30
+ ],
67
31
  };
68
32
 
69
33
  const wrapper = ({ children }) => (
70
- <Provider store={store}>
34
+ <Provider store={mockStore}>
71
35
  <NavigationContext.Provider value={navigator}>
72
- <ThemeContext.Provider value={{ themes, selectedThemeId }}>
73
- {children}
74
- </ThemeContext.Provider>
36
+ {children}
75
37
  </NavigationContext.Provider>
76
38
  </Provider>
77
39
  );
78
40
 
79
- const Screen = (props) => (
80
- <View testID="screen-component" {...R.omit(["children"])(props)} />
81
- );
82
-
83
41
  const NavBar = (props) => (
84
- <View testID="nav-bar-component" {...R.omit(["children"])(props)} />
42
+ <View testID="nav-bar-component" {...withoutChildren(props)} />
85
43
  );
86
44
 
87
45
  const Background = (props: Record<any, any>) => (
88
- <View testID="background-component" {...R.omit(["children"])(props)}>
46
+ <View testID="background-component" {...withoutChildren(props)}>
89
47
  {props.children}
90
48
  </View>
91
49
  );
@@ -96,54 +54,8 @@ describe("Layout TV", () => {
96
54
  };
97
55
 
98
56
  it("renders", () => {
99
- const { toJSON } = render(
100
- <Layout Components={Components}>
101
- <Screen />
102
- </Layout>,
103
- { wrapper }
104
- );
57
+ const { toJSON } = render(<Layout Components={Components} />, { wrapper });
105
58
 
106
59
  expect(toJSON()).toMatchSnapshot();
107
60
  });
108
-
109
- describe("props passed to background component", () => {
110
- it("passes correct props", () => {
111
- const { getByTestId } = render(
112
- <Layout
113
- Components={Components}
114
- ComponentsExtraProps={{
115
- Background: { testProp: true },
116
- }}
117
- >
118
- <Screen />
119
- </Layout>,
120
- { wrapper }
121
- );
122
-
123
- const bgComponent = getByTestId("background-component");
124
- expect(bgComponent.props.backgroundImageUrl).toBe(bgImage);
125
- expect(bgComponent.props.testProp).toBe(true);
126
- });
127
- });
128
-
129
- describe("props passed to navbar component", () => {
130
- it("passes correct props", () => {
131
- const { getByTestId } = render(
132
- <Layout
133
- Components={Components}
134
- ComponentsExtraProps={{
135
- NavBar: { testProp: true },
136
- }}
137
- >
138
- <Screen />
139
- </Layout>,
140
- { wrapper }
141
- );
142
-
143
- const navbarComponent = getByTestId("nav-bar-component");
144
- expect(navbarComponent.props.isVisible).toBe(isNavBarVisible);
145
- expect(navbarComponent.props.menuPlugin).toBe(plugins[0]);
146
- expect(navbarComponent.props.testProp).toBe(true);
147
- });
148
- });
149
61
  });
@@ -1,28 +1,17 @@
1
1
  import * as React from "react";
2
2
  import * as R from "ramda";
3
3
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
4
- import {
5
- useIsNavBarVisible,
6
- useNavigation,
7
- } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
4
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
8
5
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
9
6
 
10
- import {
11
- getNavigationProps,
12
- resolveNavigationPlugin,
13
- routeIsPlayerScreen,
14
- } from "@applicaster/zapp-react-native-utils/navigationUtils";
15
-
16
7
  import { getBackgroundImageUrl } from "../utils";
17
8
  import { LayoutContainer } from "./LayoutContainer";
18
- import { NavBarContainer } from "./NavBarContainer";
19
9
  import { ScreenContainer } from "./ScreenContainer";
20
- import { TransitionOverlay } from "./TransitionOverlay";
21
10
 
22
11
  import { ScreenLayoutContextProvider } from "./ScreenLayoutContextProvider";
23
- import { isApplePlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
24
12
  import { PathnameContext } from "../../../Contexts/PathnameContext";
25
- import { useNavbarState } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
13
+ import { ScreenDataContext } from "../../../Contexts/ScreenDataContext";
14
+ import { ScreenContextProvider } from "../../../Contexts/ScreenContext";
26
15
 
27
16
  type Components = {
28
17
  NavBar: React.ComponentType<any>;
@@ -43,20 +32,9 @@ type Props = {
43
32
  const Layout = ({ Components, ComponentsExtraProps, children }: Props) => {
44
33
  const navigator = useNavigation();
45
34
  const theme = useTheme();
46
- const { title } = useNavbarState();
47
- const { activeRiver, currentRoute } = navigator;
48
-
49
- const {
50
- appState: { appReady = false } = {},
51
- remoteConfigurations,
52
- plugins = [],
53
- } = usePickFromState(["appState", "remoteConfigurations", "plugins"]);
54
35
 
55
- const navigationProps = getNavigationProps({
56
- navigator,
57
- title,
58
- category: "menu",
59
- });
36
+ const { appState: { appReady = false } = {}, remoteConfigurations } =
37
+ usePickFromState(["appState", "remoteConfigurations", "plugins"]);
60
38
 
61
39
  const backgroundColor = React.useMemo(() => theme.app_background_color, []);
62
40
 
@@ -65,25 +43,6 @@ const Layout = ({ Components, ComponentsExtraProps, children }: Props) => {
65
43
  [remoteConfigurations]
66
44
  );
67
45
 
68
- const menuPlugin = React.useMemo(
69
- () =>
70
- resolveNavigationPlugin({
71
- category: "menu",
72
- navigations: activeRiver?.navigations,
73
- plugins,
74
- }) as QuickBrickPlugin,
75
- []
76
- );
77
-
78
- const NavBar = React.useMemo(
79
- () => Components.NavBar || (menuPlugin.module as React.ComponentType<any>),
80
- []
81
- );
82
-
83
- const navBarVisible = useIsNavBarVisible();
84
-
85
- const [navBarReady, setNavBarReady] = React.useState(false);
86
-
87
46
  if (!appReady) {
88
47
  return null;
89
48
  }
@@ -96,46 +55,18 @@ const Layout = ({ Components, ComponentsExtraProps, children }: Props) => {
96
55
  backgroundImageUrl={backgroundImageUrl}
97
56
  {...R.omit(["ref"])(ComponentsExtraProps?.Background)}
98
57
  >
99
- {!isApplePlatform() ? (
100
- <NavBarContainer isVisible={navBarVisible} onReady={setNavBarReady}>
101
- <NavBar
102
- ref={ComponentsExtraProps?.NavBar?.ref}
103
- isVisible={navBarVisible && !routeIsPlayerScreen(currentRoute)}
104
- menuPlugin={menuPlugin}
105
- navigationProps={navigationProps}
106
- {...R.omit(["ref"])(ComponentsExtraProps?.NavBar)}
107
- />
108
- </NavBarContainer>
109
- ) : null}
110
-
111
- {navBarReady ? (
112
- /**
113
- Need to re-mount this component on each navigation event
114
- It's a hack to work around the fact that we don't support
115
- correct screen rendering in our navigator (shared currentRoute state)
116
- **/
58
+ <ScreenDataContext.Provider value={navigator.data}>
117
59
  <PathnameContext.Provider value={navigator.currentRoute}>
118
- <ScreenContainer>{children}</ScreenContainer>
60
+ <ScreenContextProvider pathname={navigator.currentRoute}>
61
+ <ScreenContainer
62
+ ComponentsExtraProps={ComponentsExtraProps}
63
+ NavBar={Components.NavBar}
64
+ >
65
+ {children}
66
+ </ScreenContainer>
67
+ </ScreenContextProvider>
119
68
  </PathnameContext.Provider>
120
- ) : null}
121
-
122
- {isApplePlatform() ? (
123
- /**
124
- Render NavBarContainer over ScreenContainer to let tvOS native
125
- focus manager works correctly to focus nav bar items first
126
- **/
127
- <NavBarContainer isVisible={navBarVisible} onReady={setNavBarReady}>
128
- <NavBar
129
- ref={ComponentsExtraProps?.NavBar?.ref}
130
- isVisible={navBarVisible && !routeIsPlayerScreen(currentRoute)}
131
- menuPlugin={menuPlugin}
132
- navigationProps={navigationProps}
133
- {...R.omit(["ref"])(ComponentsExtraProps?.NavBar)}
134
- />
135
- </NavBarContainer>
136
- ) : null}
137
-
138
- <TransitionOverlay />
69
+ </ScreenDataContext.Provider>
139
70
  </Components.Background>
140
71
  </ScreenLayoutContextProvider>
141
72
  </LayoutContainer>