@applicaster/zapp-react-native-ui-components 12.0.0-rc.1 → 12.0.0-rc.100

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 (153) hide show
  1. package/Components/AnimatedInOut/index.tsx +18 -10
  2. package/Components/AudioPlayer/AudioPlayer.tsx +9 -1
  3. package/Components/AudioPlayer/__tests__/__snapshots__/audioPlayer.test.js.snap +5 -0
  4. package/Components/AudioPlayer/helpers.tsx +1 -0
  5. package/Components/BaseFocusable/index.tsx +3 -3
  6. package/Components/Cell/Cell.tsx +32 -11
  7. package/Components/Cell/CellWithFocusable.tsx +40 -19
  8. package/Components/Cell/TvOSCellComponent.tsx +5 -9
  9. package/Components/ErrorScreen/index.tsx +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/GeneralContentScreen/GeneralContentScreen.tsx +11 -8
  19. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +13 -6
  20. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  21. package/Components/HandlePlayable/HandlePlayable.tsx +4 -1
  22. package/Components/HookRenderer/index.tsx +1 -6
  23. package/Components/Image/Image.android.tsx +11 -2
  24. package/Components/Image/Image.tsx +18 -2
  25. package/Components/Image/utils/index.ts +39 -0
  26. package/Components/Layout/TV/ScreenContainer.tsx +79 -5
  27. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +2 -2
  28. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +38 -28
  29. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +25 -13
  30. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +10 -50
  31. package/Components/Layout/TV/__tests__/index.test.tsx +20 -108
  32. package/Components/Layout/TV/index.tsx +15 -84
  33. package/Components/Layout/TV/index.web.tsx +33 -0
  34. package/Components/Layout/index.tsx +15 -11
  35. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +4 -1
  36. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +88 -113
  37. package/Components/MasterCell/DefaultComponents/CellBadge/index.tsx +21 -8
  38. package/Components/MasterCell/DefaultComponents/DynamicBadge.tsx +4 -2
  39. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
  40. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  41. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -3
  42. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  43. package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -1
  44. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +37 -2
  45. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  46. package/Components/MasterCell/DefaultComponents/Text/index.tsx +14 -2
  47. package/Components/MasterCell/DefaultComponents/Toggle.tsx +9 -3
  48. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  49. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +24 -9
  50. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +4 -1
  51. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +10 -2
  52. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +6 -10
  53. package/Components/MasterCell/dataAdapter.ts +21 -7
  54. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +1 -1
  55. package/Components/MasterCell/index.tsx +3 -1
  56. package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
  57. package/Components/MasterCell/utils/index.ts +33 -35
  58. package/Components/MeasurmentsPortal/BasicMeasurementsPortal.tsx +11 -7
  59. package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +10 -1
  60. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  61. package/Components/ModalComponent/Button/Item.tsx +82 -0
  62. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  63. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  64. package/Components/ModalComponent/Button/assets.ts +4 -0
  65. package/Components/ModalComponent/Button/index.tsx +111 -0
  66. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  67. package/Components/ModalComponent/Header/Title.tsx +70 -0
  68. package/Components/ModalComponent/Header/assets.ts +4 -0
  69. package/Components/ModalComponent/Header/index.tsx +71 -0
  70. package/Components/ModalComponent/Header/utils.ts +79 -0
  71. package/Components/ModalComponent/index.tsx +38 -0
  72. package/Components/ModalComponent/utils.ts +126 -0
  73. package/Components/Navigator/StackNavigator.tsx +57 -0
  74. package/Components/Navigator/index.ts +1 -0
  75. package/Components/PlayerContainer/ErrorDisplay/ErrorDisplay.tsx +4 -7
  76. package/Components/PlayerContainer/PlayerContainer.tsx +66 -31
  77. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  78. package/Components/PlayerImageBackground/index.tsx +34 -8
  79. package/Components/River/ComponentsMap/ComponentsMap.tsx +97 -2
  80. package/Components/River/RefreshControl.tsx +55 -1
  81. package/Components/River/River.tsx +8 -5
  82. package/Components/River/TV/River.tsx +2 -25
  83. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -1
  84. package/Components/River/__tests__/componentsMap.test.js +7 -0
  85. package/Components/River/useScreenConfiguration.ts +5 -6
  86. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -0
  87. package/Components/RouteManager/__tests__/routeManager.test.js +9 -2
  88. package/Components/RouteManager/index.tsx +4 -2
  89. package/Components/Screen/TV/hooks/index.ts +3 -0
  90. package/Components/Screen/TV/hooks/useInitialFocus.ts +70 -0
  91. package/Components/Screen/TV/hooks/useRestoreFocus.ts +22 -0
  92. package/Components/Screen/TV/index.web.tsx +165 -0
  93. package/Components/Screen/__tests__/Screen.test.tsx +51 -36
  94. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +24 -6
  95. package/Components/Screen/__tests__/navigationHandler.test.ts +1 -178
  96. package/Components/Screen/index.tsx +110 -54
  97. package/Components/Screen/navigationHandler.ts +5 -82
  98. package/Components/Screen/orientationHandler.ts +1 -1
  99. package/Components/ScreenResolver/index.tsx +10 -13
  100. package/Components/Tabs/TV/styles.ts +1 -1
  101. package/Components/TrackedView/index.tsx +6 -3
  102. package/Components/Transitioner/Scene.tsx +32 -26
  103. package/Components/Transitioner/Transitioner.tsx +21 -28
  104. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -4
  105. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +1 -0
  106. package/Components/VideoLive/LiveImageManager.ts +70 -14
  107. package/Components/VideoLive/PlayerLiveImageComponent.tsx +132 -95
  108. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  109. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +21 -29
  110. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +66 -0
  111. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +355 -0
  112. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +161 -0
  113. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +456 -0
  114. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +182 -0
  115. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  116. package/Components/VideoModal/ModalAnimation/utils.ts +302 -0
  117. package/Components/VideoModal/PlayerDetails.tsx +6 -3
  118. package/Components/VideoModal/PlayerWrapper.tsx +133 -100
  119. package/Components/VideoModal/VideoModal.tsx +23 -40
  120. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  121. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +15 -3
  122. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +262 -170
  123. package/Components/VideoModal/hooks/useModalSize.ts +23 -16
  124. package/Components/VideoModal/utils.ts +8 -5
  125. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  126. package/Components/Viewport/ViewportTracker/ViewportTracker.tsx +31 -40
  127. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  128. package/Components/Viewport/ViewportTracker/index.tsx +1 -0
  129. package/Components/Viewport/utils.js +1 -1
  130. package/Components/ZappUIComponent/index.tsx +22 -12
  131. package/Components/index.js +2 -0
  132. package/Contexts/FocusableGroupContext/FocusableGroupContext.ts +3 -0
  133. package/Contexts/FocusableGroupContext/FocusableGroupContextProvider.tsx +16 -0
  134. package/Contexts/FocusableGroupContext/__tests__/FocusableGroupContextProvider.test.tsx +22 -0
  135. package/Contexts/FocusableGroupContext/__tests__/withFocusableContext.test.tsx +26 -0
  136. package/Contexts/FocusableGroupContext/index.ts +7 -0
  137. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +17 -0
  138. package/Contexts/MenuToggleContext/{index.js → index.ts} +16 -0
  139. package/Contexts/ScreenContext/__tests__/__snapshots__/index.test.tsx.snap +3 -0
  140. package/Contexts/ScreenContext/__tests__/index.test.tsx +27 -0
  141. package/Contexts/ScreenContext/index.tsx +95 -29
  142. package/Contexts/ScreenDataContext/index.tsx +20 -0
  143. package/Contexts/ZappPipesContext/ZappPipesEntryContext.ts +1 -1
  144. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  145. package/Decorators/RiverResolver/index.tsx +0 -4
  146. package/Decorators/index.tsx +0 -4
  147. package/events/index.ts +1 -0
  148. package/package.json +5 -6
  149. package/Components/Layout/TV/TransitionOverlay.tsx +0 -64
  150. package/Components/VideoModal/hooks/usePosition.ts +0 -50
  151. /package/Components/FocusableGroup/{index.android.js → index.android.ts} +0 -0
  152. /package/Components/FocusableGroup/{index.ios.js → index.ios.ts} +0 -0
  153. /package/Contexts/{index.js → index.ts} +0 -0
@@ -1,13 +1,21 @@
1
1
  import * as React from "react";
2
2
  import { View } from "react-native";
3
- import { create, act } from "react-test-renderer";
4
-
5
- import { ORIENTATIONS } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
3
+ import { act, create } from "react-test-renderer";
6
4
 
7
5
  const Mocked_RouteManager = jest.fn((props) => (
8
6
  <View testID="routeManager" {...props} />
9
7
  ));
10
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
+
11
19
  jest.mock("../../RouteManager", () => ({
12
20
  RouteManager: Mocked_RouteManager,
13
21
  }));
@@ -15,6 +23,7 @@ jest.mock("../../RouteManager", () => ({
15
23
  jest.mock(
16
24
  "@applicaster/zapp-react-native-utils/appUtils/orientationHelper",
17
25
  () => ({
26
+ isOrientationCompatible: mockIsOrientationCompatible,
18
27
  allowedOrientationsForScreen: jest.fn(),
19
28
  getOrientation: jest.fn(),
20
29
  getScreenOrientation: jest.fn(),
@@ -25,59 +34,54 @@ jest.mock(
25
34
  })
26
35
  );
27
36
 
28
- let mock_navBarVisibleFlag = true;
29
-
30
- jest.mock("../navigationHandler.ts", () => ({
31
- isNavBarVisible: jest.fn(() => mock_navBarVisibleFlag),
32
- }));
33
-
34
37
  jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils", () => ({
35
38
  useAnalytics: jest.fn(() => ({
36
39
  sendScreenEvent: jest.fn(),
37
40
  })),
38
41
  }));
39
42
 
40
- const {
41
- allowedOrientationsForScreen,
42
- getOrientation,
43
- useGetScreenOrientation,
44
- } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
45
-
46
43
  jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
47
44
  useTheme: jest.fn(() => ({
48
45
  app_background_color: "blue",
49
46
  })),
50
47
  }));
51
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
+
52
58
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
53
- useCurrentScreenData: jest.fn(() => ({
59
+ ...(jest.requireActual(
60
+ "@applicaster/zapp-react-native-utils/reactHooks/screen"
61
+ ) as any),
62
+ useScreenData: jest.fn(() => ({
54
63
  id: "testId",
64
+ navigations: [{ id: "testId", category: "nav_bar" }],
55
65
  })),
56
- useNavbarState: jest.fn(() => ({
57
- visible: jest.fn(() => mock_navBarVisibleFlag),
66
+ useCurrentScreenData: jest.fn(() => ({
67
+ id: "testId",
58
68
  })),
59
69
  }));
60
70
 
61
- const {
62
- useCurrentScreenData,
63
- } = require("@applicaster/zapp-react-native-utils/reactHooks/screen");
64
-
65
- const { isNavBarVisible } = require("../navigationHandler");
66
-
67
- const NavBar = jest.fn((props) => <View testID="navBar" {...props} />);
68
- const navigator = {};
69
- const navBarProps = { nav_items: [] };
70
- const screenData = {};
71
-
72
71
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
72
+ isNavBarVisible: mockIsNavBarVisible,
73
73
  useRoute: jest.fn(() => ({
74
74
  pathname: "/river/testId",
75
+ screenData: { id: "testId" },
75
76
  })),
76
77
  useNavigation: jest.fn(() => ({
77
78
  canGoBack: () => false,
78
79
  currentRoute: "/river/testId",
80
+ activeRiver: { id: "testId" },
81
+ screenData: { id: "testId" },
79
82
  data: { screen: { id: "testId" } },
80
83
  })),
84
+ useIsScreenActive: jest.fn().mockReturnValue(true),
81
85
  }));
82
86
 
83
87
  jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
@@ -95,9 +99,26 @@ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
95
99
  }),
96
100
  }));
97
101
 
102
+ const {
103
+ ORIENTATIONS,
104
+ } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
105
+
106
+ const {
107
+ useCurrentScreenData,
108
+ } = require("@applicaster/zapp-react-native-utils/reactHooks/screen");
109
+
110
+ const {
111
+ allowedOrientationsForScreen,
112
+ getOrientation,
113
+ useGetScreenOrientation,
114
+ } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
115
+
116
+ const navigator = {};
117
+ const navBarProps = { nav_items: [] };
118
+ const screenData = {};
119
+
98
120
  const screenProps = {
99
121
  pathname: "/foo/path",
100
- NavBar,
101
122
  navigator,
102
123
  navBarProps,
103
124
  screenData,
@@ -111,7 +132,6 @@ describe("<Screen Component />", () => {
111
132
  beforeEach(() => {
112
133
  allowedOrientationsForScreen.mockClear();
113
134
  getOrientation.mockClear();
114
- isNavBarVisible.mockClear();
115
135
  useGetScreenOrientation.mockClear();
116
136
  });
117
137
 
@@ -127,14 +147,9 @@ describe("<Screen Component />", () => {
127
147
 
128
148
  describe("when the navbar should be hidden", () => {
129
149
  beforeEach(() => {
130
- mock_navBarVisibleFlag = false;
131
150
  wrapper = create(<Screen {...screenProps} />);
132
151
  });
133
152
 
134
- afterEach(() => {
135
- mock_navBarVisibleFlag = true;
136
- });
137
-
138
153
  it("renders correctly", () => {
139
154
  act(() => {
140
155
  wrapper = create(<Screen {...screenProps} />);
@@ -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,36 +1,40 @@
1
1
  /// <reference types="@applicaster/applicaster-types" />
2
- import React, { useMemo } from "react";
2
+ import React from "react";
3
3
  import * as R from "ramda";
4
4
  import { View } from "react-native";
5
- import { RouteManager } from "../RouteManager";
5
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
6
+ import {
7
+ isOrientationCompatible,
8
+ useGetScreenOrientation,
9
+ } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
10
+
6
11
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
7
- import { useScreenOrientationHandler } from "./orientationHandler";
12
+ import { getComponentModule } from "@applicaster/zapp-react-native-utils/pluginUtils";
13
+ import {
14
+ shouldNavBarDisplayMenu,
15
+ getNavBarProps,
16
+ getScreenId,
17
+ } from "@applicaster/zapp-react-native-utils/navigationUtils";
18
+ import {
19
+ useDimensions,
20
+ useRoute,
21
+ useCurrentScreenData,
22
+ useNavbarState,
23
+ useScreenData,
24
+ useNavigation,
25
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
26
+ import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers";
27
+
28
+ import { RouteManager } from "../RouteManager";
8
29
  import { useScreenConfiguration } from "../River/useScreenConfiguration";
9
- import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
10
- import type { ZappNavigationProps } from "@applicaster/zapp-react-native-flow-types/index";
11
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
12
- import { ScreenContextProvider } from "../../Contexts/ScreenContext";
30
+ import { useScreenOrientationHandler } from "./orientationHandler";
13
31
 
14
- type Props = {
15
- pathname: string;
16
- screenData: Record<string, any>;
17
- NavBar: ZappPlugin;
18
- Menu: ZappPlugin;
19
- navBarProps: Record<string, any>;
20
- isNavBarVisible: boolean;
21
- menuProps: {
22
- setToggleMenu: () => void;
23
- toggleMenu: () => void;
24
- openMenu: () => void;
25
- setOpenMenu: () => void;
26
- closeMenu: () => void;
27
- setCloseMenu: () => void;
28
- dimensions: { window: number };
29
- navigator: ZappNavigationProps;
30
- bottomTabBarHeight: number;
31
- isRTL: boolean;
32
- category: string;
33
- } & QuickBrickAppNavigator;
32
+ const screenStyles = {
33
+ flex: 1,
34
+ paddingTop: 0,
35
+ // paddingBottom: insets.bottom, // Should be applied directly by UI plugin
36
+ // paddingLeft: insets.left, // Should be applied directly by UI plugin
37
+ // paddingRight: insets.right, // Should be applied directly by UI plugin
34
38
  };
35
39
 
36
40
  function colorIsNotTransparent(color) {
@@ -41,38 +45,78 @@ function colorIsNotTransparent(color) {
41
45
  R.replace("rgba(", "")
42
46
  )(color);
43
47
 
44
- const alpha = Number(layers?.[3]);
45
-
46
- return alpha > 0;
48
+ return Number(layers?.[3]) > 0;
47
49
  }
48
50
 
49
51
  function isValidColor(string) {
50
52
  return string && string !== "transparent" && colorIsNotTransparent(string);
51
53
  }
52
54
 
53
- export function Screen(props: Props) {
54
- const { pathname, screenData, NavBar } = props;
55
+ type Props = {
56
+ pathname: unknown;
57
+ screenData: unknown;
58
+ };
59
+
60
+ export function Screen(_props: Props) {
61
+ const theme = useTheme<BaseThemePropertiesMobile>();
62
+ const navigation = useNavigation();
55
63
  const { plugins } = usePickFromState(["plugins"]);
56
64
 
57
- const offlinePlugin = useMemo(
65
+ // Gets the data for the current screen configuration
66
+ const currentScreenData = useCurrentScreenData();
67
+ const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
68
+
69
+ const {
70
+ width: screenWidth,
71
+ height,
72
+ deviceInfo,
73
+ } = useDimensions("screen", {
74
+ fullDimensions: true,
75
+ });
76
+
77
+ const { screenData, pathname } = useRoute();
78
+
79
+ const currentRiver = useScreenData(
80
+ getScreenId(screenData, navigation.activeRiver)
81
+ );
82
+
83
+ const { title } = useNavbarState();
84
+
85
+ const isTablet = deviceInfo?.isTablet;
86
+
87
+ const { appData } = usePickFromState(["appData"]);
88
+ const isTabletPortrait = appData?.isTabletPortrait;
89
+
90
+ const layoutData = { isTablet, isTabletPortrait, width: screenWidth, height };
91
+
92
+ const hasMenu = shouldNavBarDisplayMenu(currentRiver, plugins);
93
+
94
+ const navBarProps = React.useMemo<MobileNavBarPluginProps | null>(
95
+ getNavBarProps(currentRiver, pathname, title),
96
+ [currentRiver, pathname]
97
+ );
98
+
99
+ const NavBar = React.useMemo(
58
100
  () =>
59
- R.compose(
60
- R.prop("module"),
61
- R.find(R.propEq("identifier", "offline-experience"))
62
- )(plugins),
63
- [plugins]
101
+ getNavigationPluginModule(
102
+ "nav_bar",
103
+ currentRiver,
104
+ plugins
105
+ ) as React.ComponentType<MobileNavBarPluginProps & { hasMenu: boolean }>,
106
+ []
64
107
  );
65
108
 
66
- const { OfflineFallbackScreen } = offlinePlugin;
109
+ const offlinePlugin = getComponentModule({
110
+ plugins,
111
+ components: {},
112
+ componentType: "offline-experience",
113
+ });
67
114
 
68
- // Gets the data for the current screen configuration
69
- const currentScreenData = useCurrentScreenData();
70
- const theme = useTheme();
71
- const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
115
+ const { OfflineFallbackScreen } = offlinePlugin;
72
116
 
73
117
  const style = React.useMemo(
74
118
  () => ({
75
- flex: 1,
119
+ ...screenStyles,
76
120
  backgroundColor: isValidColor(backgroundColor)
77
121
  ? backgroundColor
78
122
  : theme.app_background_color,
@@ -81,19 +125,31 @@ export function Screen(props: Props) {
81
125
  );
82
126
 
83
127
  const targetScreenData =
84
- currentScreenData || screenData?.targetScreen || screenData;
128
+ currentScreenData || (screenData as any)?.targetScreen || screenData;
85
129
 
86
130
  useScreenOrientationHandler({ screenData: targetScreenData });
87
131
 
132
+ const orientation = useGetScreenOrientation(targetScreenData);
133
+
134
+ // We prevent rendering of the screen until UI is actually rotated to screen desired orientation.
135
+ // This saves unnecessary re-renders and user will not see distorted aspect screen.
136
+ if (
137
+ !isOrientationCompatible({
138
+ orientation,
139
+ layoutData,
140
+ })
141
+ ) {
142
+ return <View style={style} />;
143
+ }
144
+
88
145
  return (
89
- <ScreenContextProvider pathname={pathname}>
90
- <View style={style}>
91
- <NavBar key={pathname} {...props.navBarProps} />
92
-
93
- <OfflineFallbackScreen screenData={screenData}>
94
- <RouteManager pathname={pathname} screenData={screenData} />
95
- </OfflineFallbackScreen>
96
- </View>
97
- </ScreenContextProvider>
146
+ <View style={style}>
147
+ {navBarProps && <NavBar {...navBarProps} hasMenu={hasMenu} />}
148
+
149
+ <OfflineFallbackScreen screenData={targetScreenData}>
150
+ {/* @TODO RouteManager doesn't use props, can they be removed ? */}
151
+ <RouteManager pathname={pathname} screenData={screenData} />
152
+ </OfflineFallbackScreen>
153
+ </View>
98
154
  );
99
155
  }