@applicaster/zapp-react-native-ui-components 12.0.0-rc.11 → 12.0.0-rc.110

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/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/Focusable/Focusable.tsx +6 -1
  10. package/Components/FocusableCell/index.tsx +7 -7
  11. package/Components/FocusableGroup/index.tsx +11 -2
  12. package/Components/FocusableList/FocusableChild.ts +24 -14
  13. package/Components/FocusableList/FocusableItem.tsx +1 -1
  14. package/Components/FocusableList/FocusableListItemWrapper.tsx +76 -0
  15. package/Components/FocusableList/hooks/useCellState.android.ts +3 -1
  16. package/Components/FocusableList/index.tsx +26 -25
  17. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +11 -8
  18. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +13 -6
  19. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  20. package/Components/HandlePlayable/HandlePlayable.tsx +4 -1
  21. package/Components/HookRenderer/index.tsx +1 -6
  22. package/Components/Image/Image.android.tsx +3 -26
  23. package/Components/Image/Image.tsx +18 -2
  24. package/Components/Image/utils/index.ts +39 -0
  25. package/Components/Layout/TV/ScreenContainer.tsx +79 -5
  26. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +2 -2
  27. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +38 -28
  28. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +25 -13
  29. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +10 -50
  30. package/Components/Layout/TV/__tests__/index.test.tsx +20 -108
  31. package/Components/Layout/TV/index.tsx +15 -84
  32. package/Components/Layout/TV/index.web.tsx +33 -0
  33. package/Components/Layout/index.tsx +15 -11
  34. package/Components/MasterCell/DefaultComponents/ActionButton.tsx +4 -1
  35. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +86 -117
  36. package/Components/MasterCell/DefaultComponents/CellBadge/index.tsx +21 -8
  37. package/Components/MasterCell/DefaultComponents/DynamicBadge.tsx +4 -2
  38. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
  39. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  40. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -3
  41. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  42. package/Components/MasterCell/DefaultComponents/ImageBorderContainer/index.ts +57 -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 +5 -1
  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/index.ts +2 -0
  51. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +4 -1
  52. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +10 -2
  53. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +6 -10
  54. package/Components/MasterCell/dataAdapter.ts +21 -7
  55. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +1 -1
  56. package/Components/MasterCell/index.tsx +5 -3
  57. package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
  58. package/Components/MasterCell/utils/index.ts +33 -35
  59. package/Components/MeasurmentsPortal/BasicMeasurementsPortal.tsx +11 -7
  60. package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +10 -1
  61. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  62. package/Components/ModalComponent/Button/Item.tsx +82 -0
  63. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  64. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  65. package/Components/ModalComponent/Button/assets.ts +4 -0
  66. package/Components/ModalComponent/Button/index.tsx +111 -0
  67. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  68. package/Components/ModalComponent/Header/Title.tsx +70 -0
  69. package/Components/ModalComponent/Header/assets.ts +4 -0
  70. package/Components/ModalComponent/Header/index.tsx +71 -0
  71. package/Components/ModalComponent/Header/utils.ts +79 -0
  72. package/Components/ModalComponent/index.tsx +38 -0
  73. package/Components/ModalComponent/utils.ts +126 -0
  74. package/Components/Navigator/StackNavigator.tsx +57 -0
  75. package/Components/Navigator/index.ts +1 -0
  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 +2 -2
  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 +91 -74
  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/ScreenResolver/index.tsx +10 -13
  99. package/Components/Tabs/TV/styles.ts +1 -1
  100. package/Components/TrackedView/index.tsx +6 -3
  101. package/Components/Transitioner/Scene.tsx +32 -26
  102. package/Components/Transitioner/Transitioner.tsx +38 -43
  103. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -4
  104. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +1 -0
  105. package/Components/VideoLive/LiveImageManager.ts +70 -14
  106. package/Components/VideoLive/PlayerLiveImageComponent.tsx +132 -95
  107. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  108. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +21 -29
  109. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +66 -0
  110. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +360 -0
  111. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +165 -0
  112. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +456 -0
  113. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +182 -0
  114. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  115. package/Components/VideoModal/ModalAnimation/utils.ts +302 -0
  116. package/Components/VideoModal/PlayerDetails.tsx +6 -3
  117. package/Components/VideoModal/PlayerWrapper.tsx +81 -49
  118. package/Components/VideoModal/VideoModal.tsx +23 -40
  119. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  120. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +12 -1
  121. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +312 -166
  122. package/Components/VideoModal/hooks/useModalSize.ts +10 -12
  123. package/Components/VideoModal/utils.ts +8 -5
  124. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  125. package/Components/Viewport/ViewportTracker/ViewportTracker.tsx +31 -40
  126. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  127. package/Components/Viewport/ViewportTracker/index.tsx +1 -0
  128. package/Components/Viewport/utils.js +1 -1
  129. package/Components/ZappUIComponent/index.tsx +22 -12
  130. package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +4 -4
  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,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,26 @@ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
93
99
  }),
94
100
  }));
95
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
+
96
120
  const screenProps = {
97
121
  pathname: "/foo/path",
98
- NavBar,
99
122
  navigator,
100
123
  navBarProps,
101
124
  screenData,
@@ -109,7 +132,6 @@ describe("<Screen Component />", () => {
109
132
  beforeEach(() => {
110
133
  allowedOrientationsForScreen.mockClear();
111
134
  getOrientation.mockClear();
112
- isNavBarVisible.mockClear();
113
135
  useGetScreenOrientation.mockClear();
114
136
  });
115
137
 
@@ -125,14 +147,9 @@ describe("<Screen Component />", () => {
125
147
 
126
148
  describe("when the navbar should be hidden", () => {
127
149
  beforeEach(() => {
128
- mock_navBarVisibleFlag = false;
129
150
  wrapper = create(<Screen {...screenProps} />);
130
151
  });
131
152
 
132
- afterEach(() => {
133
- mock_navBarVisibleFlag = true;
134
- });
135
-
136
153
  it("renders correctly", () => {
137
154
  act(() => {
138
155
  wrapper = create(<Screen {...screenProps} />);
@@ -142,44 +159,44 @@ describe("<Screen Component />", () => {
142
159
  });
143
160
  });
144
161
 
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
- // });
162
+ it("invokes the orientation hook when the route changes", () => {
163
+ act(() => {
164
+ wrapper = create(<Screen {...screenProps} />);
165
+ });
166
+
167
+ // @ts-ignore
168
+ useCurrentScreenData.mockReturnValue({
169
+ id: "player-testId",
170
+ general: { screen_orientation: ORIENTATIONS.landscapeSensor },
171
+ plugin_type: "player",
172
+ });
173
+
174
+ act(() => {
175
+ wrapper.update(
176
+ <Screen
177
+ {...screenProps}
178
+ pathname="/playable"
179
+ screenData={{
180
+ id: "player-testId",
181
+ general: { screen_orientation: ORIENTATIONS.landscapeSensor },
182
+ plugin_type: "player",
183
+ }}
184
+ />
185
+ );
186
+ });
187
+
188
+ useCurrentScreenData.mockReturnValue({
189
+ id: "player-testId",
190
+ general: { screen_orientation: ORIENTATIONS.landscapeSensor },
191
+ });
192
+
193
+ act(() => {
194
+ wrapper.update(<Screen {...screenProps} />);
195
+ });
196
+
197
+ expect(allowedOrientationsForScreen).toHaveBeenNthCalledWith(
198
+ 1,
199
+ ORIENTATIONS.landscapeSensor
200
+ );
201
+ });
185
202
  });
@@ -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
  }