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

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
@@ -1,11 +1,21 @@
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} />
7
7
  ));
8
8
 
9
+ const mock_navBarVisibleFlag = true;
10
+
11
+ const mockIsNavBarVisible = jest.fn(() => mock_navBarVisibleFlag);
12
+
13
+ const mockIsOrientationCompatible = jest.fn(() => true);
14
+
15
+ jest.mock("react-native-safe-area-context", () => ({
16
+ useSafeAreaInsets: () => ({ top: 44 }),
17
+ }));
18
+
9
19
  jest.mock("../../RouteManager", () => ({
10
20
  RouteManager: Mocked_RouteManager,
11
21
  }));
@@ -13,6 +23,7 @@ jest.mock("../../RouteManager", () => ({
13
23
  jest.mock(
14
24
  "@applicaster/zapp-react-native-utils/appUtils/orientationHelper",
15
25
  () => ({
26
+ isOrientationCompatible: mockIsOrientationCompatible,
16
27
  allowedOrientationsForScreen: jest.fn(),
17
28
  getOrientation: jest.fn(),
18
29
  getScreenOrientation: jest.fn(),
@@ -23,59 +34,54 @@ jest.mock(
23
34
  })
24
35
  );
25
36
 
26
- let mock_navBarVisibleFlag = true;
27
-
28
- jest.mock("../navigationHandler.ts", () => ({
29
- isNavBarVisible: jest.fn(() => mock_navBarVisibleFlag),
30
- }));
31
-
32
37
  jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils", () => ({
33
38
  useAnalytics: jest.fn(() => ({
34
39
  sendScreenEvent: jest.fn(),
35
40
  })),
36
41
  }));
37
42
 
38
- const {
39
- allowedOrientationsForScreen,
40
- getOrientation,
41
- useGetScreenOrientation,
42
- } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
43
-
44
43
  jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
45
44
  useTheme: jest.fn(() => ({
46
45
  app_background_color: "blue",
47
46
  })),
48
47
  }));
49
48
 
49
+ const NavBar = jest.fn((props) => <View testID="navBar" {...props} />);
50
+
51
+ jest.mock(
52
+ "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers",
53
+ () => ({
54
+ getNavigationPluginModule: () => NavBar,
55
+ })
56
+ );
57
+
50
58
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
51
- useCurrentScreenData: jest.fn(() => ({
59
+ ...(jest.requireActual(
60
+ "@applicaster/zapp-react-native-utils/reactHooks/screen"
61
+ ) as any),
62
+ useScreenData: jest.fn(() => ({
52
63
  id: "testId",
64
+ navigations: [{ id: "testId", category: "nav_bar" }],
53
65
  })),
54
- useNavbarState: jest.fn(() => ({
55
- visible: jest.fn(() => mock_navBarVisibleFlag),
66
+ useCurrentScreenData: jest.fn(() => ({
67
+ id: "testId",
56
68
  })),
57
69
  }));
58
70
 
59
- const {
60
- useCurrentScreenData,
61
- } = require("@applicaster/zapp-react-native-utils/reactHooks/screen");
62
-
63
- const { isNavBarVisible } = require("../navigationHandler");
64
-
65
- const NavBar = jest.fn((props) => <View testID="navBar" {...props} />);
66
- const navigator = {};
67
- const navBarProps = { nav_items: [] };
68
- const screenData = {};
69
-
70
71
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
72
+ isNavBarVisible: mockIsNavBarVisible,
71
73
  useRoute: jest.fn(() => ({
72
74
  pathname: "/river/testId",
75
+ screenData: { id: "testId" },
73
76
  })),
74
77
  useNavigation: jest.fn(() => ({
75
78
  canGoBack: () => false,
76
79
  currentRoute: "/river/testId",
80
+ activeRiver: { id: "testId" },
81
+ screenData: { id: "testId" },
77
82
  data: { screen: { id: "testId" } },
78
83
  })),
84
+ useIsScreenActive: jest.fn().mockReturnValue(true),
79
85
  }));
80
86
 
81
87
  jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
@@ -93,9 +99,18 @@ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
93
99
  }),
94
100
  }));
95
101
 
102
+ const {
103
+ allowedOrientationsForScreen,
104
+ getOrientation,
105
+ useGetScreenOrientation,
106
+ } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
107
+
108
+ const navigator = {};
109
+ const navBarProps = { nav_items: [] };
110
+ const screenData = {};
111
+
96
112
  const screenProps = {
97
113
  pathname: "/foo/path",
98
- NavBar,
99
114
  navigator,
100
115
  navBarProps,
101
116
  screenData,
@@ -109,7 +124,6 @@ describe("<Screen Component />", () => {
109
124
  beforeEach(() => {
110
125
  allowedOrientationsForScreen.mockClear();
111
126
  getOrientation.mockClear();
112
- isNavBarVisible.mockClear();
113
127
  useGetScreenOrientation.mockClear();
114
128
  });
115
129
 
@@ -125,14 +139,9 @@ describe("<Screen Component />", () => {
125
139
 
126
140
  describe("when the navbar should be hidden", () => {
127
141
  beforeEach(() => {
128
- mock_navBarVisibleFlag = false;
129
142
  wrapper = create(<Screen {...screenProps} />);
130
143
  });
131
144
 
132
- afterEach(() => {
133
- mock_navBarVisibleFlag = true;
134
- });
135
-
136
145
  it("renders correctly", () => {
137
146
  act(() => {
138
147
  wrapper = create(<Screen {...screenProps} />);
@@ -141,45 +150,4 @@ describe("<Screen Component />", () => {
141
150
  expect(wrapper.toJSON()).toMatchSnapshot();
142
151
  });
143
152
  });
144
-
145
- // it("invokes the orientation hook when the route changes", () => {
146
- // act(() => {
147
- // wrapper = create(<Screen {...screenProps} />);
148
- // });
149
-
150
- // // @ts-ignore
151
- // useCurrentScreenData.mockReturnValue({
152
- // id: "player-testId",
153
- // general: { screen_orientation: ORIENTATIONS.landscapeSensor },
154
- // plugin_type: "player",
155
- // });
156
-
157
- // act(() => {
158
- // wrapper.update(
159
- // <Screen
160
- // {...screenProps}
161
- // pathname="/playable"
162
- // screenData={{
163
- // id: "player-testId",
164
- // general: { screen_orientation: ORIENTATIONS.landscapeSensor },
165
- // plugin_type: "player",
166
- // }}
167
- // />
168
- // );
169
- // });
170
-
171
- // useCurrentScreenData.mockReturnValue({
172
- // id: "player-testId",
173
- // general: { screen_orientation: ORIENTATIONS.landscapeSensor },
174
- // });
175
-
176
- // act(() => {
177
- // wrapper.update(<Screen {...screenProps} />);
178
- // });
179
-
180
- // expect(allowedOrientationsForScreen).toHaveBeenNthCalledWith(
181
- // 1,
182
- // ORIENTATIONS.landscapeSensor
183
- // );
184
- // });
185
153
  });
@@ -6,17 +6,26 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
6
6
  Object {
7
7
  "backgroundColor": "blue",
8
8
  "flex": 1,
9
+ "paddingTop": 0,
9
10
  }
10
11
  }
11
12
  >
12
13
  <View
13
- nav_items={Array []}
14
+ hasMenu={false}
15
+ id="/river/testId"
16
+ pathname="/river/testId"
17
+ selected="testId"
14
18
  testID="navBar"
19
+ title=""
15
20
  />
16
21
  <View>
17
22
  <View
18
- pathname="/foo/path"
19
- screenData={Object {}}
23
+ pathname="/river/testId"
24
+ screenData={
25
+ Object {
26
+ "id": "testId",
27
+ }
28
+ }
20
29
  testID="routeManager"
21
30
  />
22
31
  </View>
@@ -29,17 +38,26 @@ exports[`<Screen Component /> when the navbar should show renders correctly 1`]
29
38
  Object {
30
39
  "backgroundColor": "blue",
31
40
  "flex": 1,
41
+ "paddingTop": 0,
32
42
  }
33
43
  }
34
44
  >
35
45
  <View
36
- nav_items={Array []}
46
+ hasMenu={false}
47
+ id="/river/testId"
48
+ pathname="/river/testId"
49
+ selected="testId"
37
50
  testID="navBar"
51
+ title=""
38
52
  />
39
53
  <View>
40
54
  <View
41
- pathname="/foo/path"
42
- screenData={Object {}}
55
+ pathname="/river/testId"
56
+ screenData={
57
+ Object {
58
+ "id": "testId",
59
+ }
60
+ }
43
61
  testID="routeManager"
44
62
  />
45
63
  </View>
@@ -1,183 +1,6 @@
1
- import { isNavBarVisible, isMenuVisible } from "../navigationHandler";
1
+ import { isMenuVisible } from "../navigationHandler";
2
2
 
3
3
  describe("NavigationHandler", () => {
4
- describe("isNavBarVisible", () => {
5
- it("returns false when the route is a player route", () => {
6
- const navBarVisible = isNavBarVisible(
7
- "/playable/some_vod_item",
8
- {},
9
- undefined,
10
- false
11
- );
12
-
13
- expect(navBarVisible).toBe(false);
14
- });
15
-
16
- it("returns false when the next screen is the QB search screen", () => {
17
- const navBarVisible = isNavBarVisible(
18
- "/river/A1234",
19
- {
20
- type: "qb_search_screen",
21
- },
22
- undefined,
23
- false
24
- );
25
-
26
- expect(navBarVisible).toBe(false);
27
- });
28
-
29
- describe("when screen is a hook", () => {
30
- it("returns true if the `showNavBar` flag is set to true", () => {
31
- const navBarVisible = isNavBarVisible(
32
- "",
33
- {
34
- hookPlugin: {
35
- module: {
36
- showNavBar: true,
37
- },
38
- },
39
- },
40
- undefined,
41
- false
42
- );
43
-
44
- expect(navBarVisible).toBe(true);
45
- });
46
-
47
- it("returns true if presentFullScreen flag is set to false", () => {
48
- const navBarVisible = isNavBarVisible(
49
- "",
50
- {
51
- hookPlugin: {
52
- module: {
53
- presentFullScreen: false,
54
- },
55
- },
56
- },
57
- undefined,
58
- false
59
- );
60
-
61
- expect(navBarVisible).toBe(true);
62
- });
63
-
64
- it("returns false if presentFullScreen flag is set to true", () => {
65
- const navBarVisible = isNavBarVisible(
66
- "",
67
- {
68
- hookPlugin: {
69
- module: {
70
- presentFullScreen: true,
71
- },
72
- },
73
- },
74
- undefined,
75
- false
76
- );
77
-
78
- expect(navBarVisible).toBe(false);
79
- });
80
- });
81
-
82
- it("returns false if the screen's general settings allow screen presentation", () => {
83
- const navBarVisible = isNavBarVisible(
84
- "",
85
- {
86
- general: {
87
- allow_screen_plugin_presentation: true,
88
- },
89
- },
90
- undefined,
91
- false
92
- );
93
-
94
- expect(navBarVisible).toBe(false);
95
- });
96
-
97
- it("returns false if the screen's general settings hide app nav bar", () => {
98
- const navBarVisible = isNavBarVisible(
99
- "",
100
- {
101
- general: {
102
- hide_app_nav_bar: true,
103
- },
104
- },
105
- undefined,
106
- false
107
- );
108
-
109
- expect(navBarVisible).toBe(false);
110
- });
111
-
112
- it("returns false if it's secondary nav bar and hide_secondary_level_menu is true", () => {
113
- const navBarVisible = isNavBarVisible(
114
- "",
115
- {
116
- navigations: [
117
- {
118
- styles: {
119
- hide_secondary_level_menu: true,
120
- },
121
- },
122
- ],
123
- },
124
- undefined,
125
- true
126
- );
127
-
128
- expect(navBarVisible).toBe(false);
129
- });
130
-
131
- it("returns true if it's secondary nav bar and hide_secondary_level_menu is false", () => {
132
- const navBarVisible = isNavBarVisible(
133
- "",
134
- {
135
- navigations: [
136
- {
137
- styles: {
138
- hide_secondary_level_menu: false,
139
- },
140
- },
141
- ],
142
- },
143
- undefined,
144
- true
145
- );
146
-
147
- expect(navBarVisible).toBe(true);
148
- });
149
-
150
- it("returns true if it's first level menu and hide_secondary_level_menu is true", () => {
151
- const navBarVisible = isNavBarVisible(
152
- "",
153
- {
154
- navigations: [
155
- {
156
- styles: {
157
- hide_secondary_level_menu: false,
158
- },
159
- },
160
- ],
161
- },
162
- undefined,
163
- false
164
- );
165
-
166
- expect(navBarVisible).toBe(true);
167
- });
168
-
169
- it("returns true otherwise", () => {
170
- const navBarVisible = isNavBarVisible(
171
- "",
172
- { navigations: [] },
173
- undefined,
174
- false
175
- );
176
-
177
- expect(navBarVisible).toBe(true);
178
- });
179
- });
180
-
181
4
  describe("isMenuVisible", () => {
182
5
  it("returns false when the route is a player route", () => {
183
6
  const menuVisible = isMenuVisible("/playable/some_vod_item", {});
@@ -1,77 +1,106 @@
1
1
  /// <reference types="@applicaster/applicaster-types" />
2
- import React, { useMemo } from "react";
3
- import * as R from "ramda";
2
+ import React from "react";
4
3
  import { View } from "react-native";
5
- import { RouteManager } from "../RouteManager";
4
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
5
+ import {
6
+ isOrientationCompatible,
7
+ useGetScreenOrientation,
8
+ } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
9
+
6
10
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
7
- import { useScreenOrientationHandler } from "./orientationHandler";
11
+ import { getComponentModule } from "@applicaster/zapp-react-native-utils/pluginUtils";
12
+ import {
13
+ shouldNavBarDisplayMenu,
14
+ getNavBarProps,
15
+ getScreenId,
16
+ } from "@applicaster/zapp-react-native-utils/navigationUtils";
17
+ import {
18
+ useDimensions,
19
+ useRoute,
20
+ useCurrentScreenData,
21
+ useNavbarState,
22
+ useScreenData,
23
+ useNavigation,
24
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
25
+ import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers";
26
+
27
+ import { RouteManager } from "../RouteManager";
8
28
  import { useScreenConfiguration } from "../River/useScreenConfiguration";
9
- import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
10
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
11
- import { ScreenContextProvider } from "../../Contexts/ScreenContext";
29
+ import { isValidColor } from "./utils";
30
+
31
+ const screenStyles = {
32
+ flex: 1,
33
+ paddingTop: 0,
34
+ // paddingBottom: insets.bottom, // Should be applied directly by UI plugin
35
+ // paddingLeft: insets.left, // Should be applied directly by UI plugin
36
+ // paddingRight: insets.right, // Should be applied directly by UI plugin
37
+ };
12
38
 
13
39
  type Props = {
14
- pathname: string;
15
- screenData: Record<string, any>;
16
- NavBar: ZappPlugin;
17
- Menu: ZappPlugin;
18
- navBarProps: Record<string, any>;
19
- isNavBarVisible: boolean;
20
- menuProps: {
21
- setToggleMenu: () => void;
22
- toggleMenu: () => void;
23
- openMenu: () => void;
24
- setOpenMenu: () => void;
25
- closeMenu: () => void;
26
- setCloseMenu: () => void;
27
- dimensions: { window: number };
28
- navigator: ZappNavigationProps;
29
- bottomTabBarHeight: number;
30
- isRTL: boolean;
31
- category: string;
32
- } & QuickBrickAppNavigator;
40
+ pathname: unknown;
41
+ screenData: unknown;
33
42
  };
34
43
 
35
- function colorIsNotTransparent(color) {
36
- const layers = R.compose(
37
- R.map(R.trim),
38
- R.split(","),
39
- R.replace(")", ""),
40
- R.replace("rgba(", "")
41
- )(color);
44
+ export function Screen(_props: Props) {
45
+ const theme = useTheme<BaseThemePropertiesMobile>();
46
+ const navigation = useNavigation();
47
+ const { plugins } = usePickFromState(["plugins"]);
42
48
 
43
- const alpha = Number(layers?.[3]);
49
+ // Gets the data for the current screen configuration
50
+ const currentScreenData = useCurrentScreenData();
51
+ const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
44
52
 
45
- return alpha > 0;
46
- }
53
+ const {
54
+ width: screenWidth,
55
+ height,
56
+ deviceInfo,
57
+ } = useDimensions("screen", {
58
+ fullDimensions: true,
59
+ });
47
60
 
48
- function isValidColor(string) {
49
- return string && string !== "transparent" && colorIsNotTransparent(string);
50
- }
61
+ const { screenData, pathname } = useRoute();
51
62
 
52
- export function Screen(props: Props) {
53
- const { pathname, screenData, NavBar } = props;
54
- const { plugins } = usePickFromState(["plugins"]);
63
+ const currentRiver = useScreenData(
64
+ getScreenId(screenData, navigation.activeRiver)
65
+ );
66
+
67
+ const { title } = useNavbarState();
68
+
69
+ const isTablet = deviceInfo?.isTablet;
70
+
71
+ const { appData } = usePickFromState(["appData"]);
72
+ const isTabletPortrait = appData?.isTabletPortrait;
73
+
74
+ const layoutData = { isTablet, isTabletPortrait, width: screenWidth, height };
75
+
76
+ const hasMenu = shouldNavBarDisplayMenu(currentRiver, plugins);
77
+
78
+ const navBarProps = React.useMemo<MobileNavBarPluginProps | null>(
79
+ getNavBarProps(currentRiver, pathname, title),
80
+ [currentRiver, pathname]
81
+ );
55
82
 
56
- const offlinePlugin = useMemo(
83
+ const NavBar = React.useMemo(
57
84
  () =>
58
- R.compose(
59
- R.prop("module"),
60
- R.find(R.propEq("identifier", "offline-experience"))
61
- )(plugins),
62
- [plugins]
85
+ getNavigationPluginModule(
86
+ "nav_bar",
87
+ currentRiver,
88
+ plugins
89
+ ) as React.ComponentType<MobileNavBarPluginProps & { hasMenu: boolean }>,
90
+ []
63
91
  );
64
92
 
65
- const { OfflineFallbackScreen } = offlinePlugin;
93
+ const offlinePlugin = getComponentModule({
94
+ plugins,
95
+ components: {},
96
+ componentType: "offline-experience",
97
+ });
66
98
 
67
- // Gets the data for the current screen configuration
68
- const currentScreenData = useCurrentScreenData();
69
- const theme = useTheme();
70
- const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
99
+ const { OfflineFallbackScreen } = offlinePlugin;
71
100
 
72
101
  const style = React.useMemo(
73
102
  () => ({
74
- flex: 1,
103
+ ...screenStyles,
75
104
  backgroundColor: isValidColor(backgroundColor)
76
105
  ? backgroundColor
77
106
  : theme.app_background_color,
@@ -80,19 +109,29 @@ export function Screen(props: Props) {
80
109
  );
81
110
 
82
111
  const targetScreenData =
83
- currentScreenData || screenData?.targetScreen || screenData;
112
+ currentScreenData || (screenData as any)?.targetScreen || screenData;
113
+
114
+ const orientation = useGetScreenOrientation(targetScreenData);
84
115
 
85
- useScreenOrientationHandler({ screenData: targetScreenData });
116
+ // We prevent rendering of the screen until UI is actually rotated to screen desired orientation.
117
+ // This saves unnecessary re-renders and user will not see distorted aspect screen.
118
+ if (
119
+ !isOrientationCompatible({
120
+ orientation,
121
+ layoutData,
122
+ })
123
+ ) {
124
+ return <View style={style} />;
125
+ }
86
126
 
87
127
  return (
88
- <ScreenContextProvider pathname={pathname}>
89
- <View style={style}>
90
- <NavBar key={pathname} {...props.navBarProps} />
91
-
92
- <OfflineFallbackScreen screenData={screenData}>
93
- <RouteManager pathname={pathname} screenData={screenData} />
94
- </OfflineFallbackScreen>
95
- </View>
96
- </ScreenContextProvider>
128
+ <View style={style}>
129
+ {navBarProps && <NavBar {...navBarProps} hasMenu={hasMenu} />}
130
+
131
+ <OfflineFallbackScreen screenData={targetScreenData}>
132
+ {/* @TODO RouteManager doesn't use props, can they be removed ? */}
133
+ <RouteManager pathname={pathname} screenData={screenData} />
134
+ </OfflineFallbackScreen>
135
+ </View>
97
136
  );
98
137
  }