@applicaster/zapp-react-native-ui-components 12.0.0-alpha.7725319213 → 12.0.0-alpha.8235014824

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 (85) 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/Cell/Cell.tsx +2 -2
  5. package/Components/Cell/CellWithFocusable.tsx +21 -14
  6. package/Components/Cell/TvOSCellComponent.tsx +2 -2
  7. package/Components/ErrorScreen/index.tsx +1 -1
  8. package/Components/FocusableCell/index.tsx +7 -7
  9. package/Components/FocusableList/FocusableChild.ts +24 -14
  10. package/Components/FocusableList/FocusableItem.tsx +1 -1
  11. package/Components/FocusableList/FocusableListItemWrapper.tsx +76 -0
  12. package/Components/FocusableList/hooks/useCellState.android.ts +3 -1
  13. package/Components/FocusableList/index.tsx +26 -25
  14. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +6 -3
  15. package/Components/HookRenderer/index.tsx +1 -6
  16. package/Components/Image/Image.android.tsx +3 -25
  17. package/Components/Image/Image.tsx +18 -2
  18. package/Components/Image/utils/index.ts +39 -0
  19. package/Components/Layout/TV/__tests__/index.test.tsx +1 -34
  20. package/Components/Layout/TV/index.tsx +20 -36
  21. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +34 -111
  22. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  23. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  24. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +17 -2
  25. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  26. package/Components/MasterCell/DefaultComponents/Toggle.tsx +5 -1
  27. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +8 -14
  28. package/Components/MasterCell/utils/index.ts +16 -5
  29. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  30. package/Components/ModalComponent/Button/Item.tsx +82 -0
  31. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  32. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  33. package/Components/ModalComponent/Button/assets.ts +4 -0
  34. package/Components/ModalComponent/Button/index.tsx +111 -0
  35. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  36. package/Components/ModalComponent/Header/Title.tsx +70 -0
  37. package/Components/ModalComponent/Header/assets.ts +4 -0
  38. package/Components/ModalComponent/Header/index.tsx +71 -0
  39. package/Components/ModalComponent/Header/utils.ts +79 -0
  40. package/Components/ModalComponent/index.tsx +38 -0
  41. package/Components/ModalComponent/utils.ts +126 -0
  42. package/Components/PlayerContainer/PlayerContainer.tsx +54 -29
  43. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  44. package/Components/PlayerImageBackground/index.tsx +34 -8
  45. package/Components/River/ComponentsMap/ComponentsMap.tsx +25 -0
  46. package/Components/River/TV/River.tsx +2 -2
  47. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -1
  48. package/Components/River/__tests__/componentsMap.test.js +7 -0
  49. package/Components/River/useScreenConfiguration.ts +2 -2
  50. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -0
  51. package/Components/RouteManager/__tests__/routeManager.test.js +9 -2
  52. package/Components/RouteManager/index.tsx +5 -3
  53. package/Components/Screen/__tests__/Screen.test.tsx +88 -74
  54. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +20 -6
  55. package/Components/Screen/__tests__/navigationHandler.test.ts +1 -178
  56. package/Components/Screen/index.tsx +92 -43
  57. package/Components/Screen/navigationHandler.ts +0 -82
  58. package/Components/ScreenResolver/index.tsx +1 -1
  59. package/Components/Tabs/TV/styles.ts +1 -1
  60. package/Components/VideoLive/LiveImageManager.ts +2 -2
  61. package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -28
  62. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  63. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +22 -27
  64. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +78 -0
  65. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +335 -0
  66. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +144 -0
  67. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +438 -0
  68. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +143 -0
  69. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  70. package/Components/VideoModal/ModalAnimation/utils.ts +299 -0
  71. package/Components/VideoModal/PlayerDetails.tsx +3 -0
  72. package/Components/VideoModal/PlayerWrapper.tsx +64 -41
  73. package/Components/VideoModal/VideoModal.tsx +8 -25
  74. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  75. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +5 -1
  76. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +246 -166
  77. package/Components/VideoModal/utils.ts +3 -3
  78. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  79. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  80. package/Components/ZappUIComponent/index.tsx +22 -12
  81. package/Components/index.js +2 -0
  82. package/Contexts/ScreenContext/index.tsx +1 -4
  83. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  84. package/package.json +5 -5
  85. package/Components/VideoModal/hooks/usePosition.ts +0 -50
@@ -1,11 +1,19 @@
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
+ jest.mock("react-native-safe-area-context", () => ({
14
+ useSafeAreaInsets: () => ({ top: 44 }),
15
+ }));
16
+
9
17
  jest.mock("../../RouteManager", () => ({
10
18
  RouteManager: Mocked_RouteManager,
11
19
  }));
@@ -23,59 +31,54 @@ jest.mock(
23
31
  })
24
32
  );
25
33
 
26
- let mock_navBarVisibleFlag = true;
27
-
28
- jest.mock("../navigationHandler.ts", () => ({
29
- isNavBarVisible: jest.fn(() => mock_navBarVisibleFlag),
30
- }));
31
-
32
34
  jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils", () => ({
33
35
  useAnalytics: jest.fn(() => ({
34
36
  sendScreenEvent: jest.fn(),
35
37
  })),
36
38
  }));
37
39
 
38
- const {
39
- allowedOrientationsForScreen,
40
- getOrientation,
41
- useGetScreenOrientation,
42
- } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
43
-
44
40
  jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
45
41
  useTheme: jest.fn(() => ({
46
42
  app_background_color: "blue",
47
43
  })),
48
44
  }));
49
45
 
46
+ const NavBar = jest.fn((props) => <View testID="navBar" {...props} />);
47
+
48
+ jest.mock(
49
+ "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers",
50
+ () => ({
51
+ getNavigationPluginModule: () => NavBar,
52
+ })
53
+ );
54
+
50
55
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
51
- useCurrentScreenData: jest.fn(() => ({
56
+ ...(jest.requireActual(
57
+ "@applicaster/zapp-react-native-utils/reactHooks/screen"
58
+ ) as any),
59
+ useScreenData: jest.fn(() => ({
52
60
  id: "testId",
61
+ navigations: [{ id: "testId", category: "nav_bar" }],
53
62
  })),
54
- useNavbarState: jest.fn(() => ({
55
- visible: jest.fn(() => mock_navBarVisibleFlag),
63
+ useCurrentScreenData: jest.fn(() => ({
64
+ id: "testId",
56
65
  })),
57
66
  }));
58
67
 
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
68
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
69
+ isNavBarVisible: mockIsNavBarVisible,
71
70
  useRoute: jest.fn(() => ({
72
71
  pathname: "/river/testId",
72
+ screenData: { id: "testId" },
73
73
  })),
74
74
  useNavigation: jest.fn(() => ({
75
75
  canGoBack: () => false,
76
76
  currentRoute: "/river/testId",
77
+ activeRiver: { id: "testId" },
78
+ screenData: { id: "testId" },
77
79
  data: { screen: { id: "testId" } },
78
80
  })),
81
+ useIsScreenActive: jest.fn().mockReturnValue(true),
79
82
  }));
80
83
 
81
84
  jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
@@ -93,9 +96,26 @@ jest.mock("@applicaster/zapp-react-native-redux/hooks", () => ({
93
96
  }),
94
97
  }));
95
98
 
99
+ const {
100
+ ORIENTATIONS,
101
+ } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
102
+
103
+ const {
104
+ useCurrentScreenData,
105
+ } = require("@applicaster/zapp-react-native-utils/reactHooks/screen");
106
+
107
+ const {
108
+ allowedOrientationsForScreen,
109
+ getOrientation,
110
+ useGetScreenOrientation,
111
+ } = require("@applicaster/zapp-react-native-utils/appUtils/orientationHelper");
112
+
113
+ const navigator = {};
114
+ const navBarProps = { nav_items: [] };
115
+ const screenData = {};
116
+
96
117
  const screenProps = {
97
118
  pathname: "/foo/path",
98
- NavBar,
99
119
  navigator,
100
120
  navBarProps,
101
121
  screenData,
@@ -109,7 +129,6 @@ describe("<Screen Component />", () => {
109
129
  beforeEach(() => {
110
130
  allowedOrientationsForScreen.mockClear();
111
131
  getOrientation.mockClear();
112
- isNavBarVisible.mockClear();
113
132
  useGetScreenOrientation.mockClear();
114
133
  });
115
134
 
@@ -125,14 +144,9 @@ describe("<Screen Component />", () => {
125
144
 
126
145
  describe("when the navbar should be hidden", () => {
127
146
  beforeEach(() => {
128
- mock_navBarVisibleFlag = false;
129
147
  wrapper = create(<Screen {...screenProps} />);
130
148
  });
131
149
 
132
- afterEach(() => {
133
- mock_navBarVisibleFlag = true;
134
- });
135
-
136
150
  it("renders correctly", () => {
137
151
  act(() => {
138
152
  wrapper = create(<Screen {...screenProps} />);
@@ -142,44 +156,44 @@ describe("<Screen Component />", () => {
142
156
  });
143
157
  });
144
158
 
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
- // });
159
+ it("invokes the orientation hook when the route changes", () => {
160
+ act(() => {
161
+ wrapper = create(<Screen {...screenProps} />);
162
+ });
163
+
164
+ // @ts-ignore
165
+ useCurrentScreenData.mockReturnValue({
166
+ id: "player-testId",
167
+ general: { screen_orientation: ORIENTATIONS.landscapeSensor },
168
+ plugin_type: "player",
169
+ });
170
+
171
+ act(() => {
172
+ wrapper.update(
173
+ <Screen
174
+ {...screenProps}
175
+ pathname="/playable"
176
+ screenData={{
177
+ id: "player-testId",
178
+ general: { screen_orientation: ORIENTATIONS.landscapeSensor },
179
+ plugin_type: "player",
180
+ }}
181
+ />
182
+ );
183
+ });
184
+
185
+ useCurrentScreenData.mockReturnValue({
186
+ id: "player-testId",
187
+ general: { screen_orientation: ORIENTATIONS.landscapeSensor },
188
+ });
189
+
190
+ act(() => {
191
+ wrapper.update(<Screen {...screenProps} />);
192
+ });
193
+
194
+ expect(allowedOrientationsForScreen).toHaveBeenNthCalledWith(
195
+ 1,
196
+ ORIENTATIONS.landscapeSensor
197
+ );
198
+ });
185
199
  });
@@ -6,17 +6,24 @@ 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
+ id="/river/testId"
15
+ selected="testId"
14
16
  testID="navBar"
17
+ title=""
15
18
  />
16
19
  <View>
17
20
  <View
18
- pathname="/foo/path"
19
- screenData={Object {}}
21
+ pathname="/river/testId"
22
+ screenData={
23
+ Object {
24
+ "id": "testId",
25
+ }
26
+ }
20
27
  testID="routeManager"
21
28
  />
22
29
  </View>
@@ -29,17 +36,24 @@ exports[`<Screen Component /> when the navbar should show renders correctly 1`]
29
36
  Object {
30
37
  "backgroundColor": "blue",
31
38
  "flex": 1,
39
+ "paddingTop": 0,
32
40
  }
33
41
  }
34
42
  >
35
43
  <View
36
- nav_items={Array []}
44
+ id="/river/testId"
45
+ selected="testId"
37
46
  testID="navBar"
47
+ title=""
38
48
  />
39
49
  <View>
40
50
  <View
41
- pathname="/foo/path"
42
- screenData={Object {}}
51
+ pathname="/river/testId"
52
+ screenData={
53
+ Object {
54
+ "id": "testId",
55
+ }
56
+ }
43
57
  testID="routeManager"
44
58
  />
45
59
  </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,35 +1,37 @@
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";
6
- import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
7
- import { useScreenOrientationHandler } from "./orientationHandler";
8
- import { useScreenConfiguration } from "../River/useScreenConfiguration";
9
- import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
10
5
  import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
6
+
7
+ import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
8
+ import { getComponentModule } from "@applicaster/zapp-react-native-utils/pluginUtils";
9
+ import { getNavigationPropsV2 } from "@applicaster/zapp-react-native-utils/navigationUtils";
10
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
11
+ import {
12
+ useDimensions,
13
+ useRoute,
14
+ useCurrentScreenData,
15
+ useNavbarState,
16
+ useScreenData,
17
+ useNavigation,
18
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
19
+ import { getNavigationPluginModule } from "@applicaster/zapp-react-native-app/App/Layout/layoutHelpers";
20
+
11
21
  import { ScreenContextProvider } from "../../Contexts/ScreenContext";
22
+ import { RouteManager } from "../RouteManager";
23
+ import { useScreenConfiguration } from "../River/useScreenConfiguration";
24
+ import { useScreenOrientationHandler } from "./orientationHandler";
12
25
 
13
- 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;
26
+ const getScreenId = (
27
+ screenData: LegacyNavigationScreenData,
28
+ fallbackRiver: ZappRiver
29
+ ) => {
30
+ return screenData?.targetScreen
31
+ ? screenData?.targetScreen?.id ?? fallbackRiver.id
32
+ : "screen_id" in screenData
33
+ ? screenData.screen_id
34
+ : fallbackRiver.id;
33
35
  };
34
36
 
35
37
  function colorIsNotTransparent(color) {
@@ -49,25 +51,65 @@ function isValidColor(string) {
49
51
  return string && string !== "transparent" && colorIsNotTransparent(string);
50
52
  }
51
53
 
52
- export function Screen(props: Props) {
53
- const { pathname, screenData, NavBar } = props;
54
+ type Props = {
55
+ setToggleMenu: () => void;
56
+ setCloseMenu: () => void;
57
+ };
58
+
59
+ export function Screen({ setToggleMenu, setCloseMenu }: Props) {
60
+ const theme = useTheme<BaseThemePropertiesMobile>();
61
+ const navigation = useNavigation();
54
62
  const { plugins } = usePickFromState(["plugins"]);
55
63
 
56
- const offlinePlugin = useMemo(
64
+ // Gets the data for the current screen configuration
65
+ const currentScreenData = useCurrentScreenData();
66
+ const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
67
+ const insets = useSafeAreaInsets();
68
+
69
+ const { width: screenWidth } = useDimensions("screen", {
70
+ fullDimensions: true,
71
+ });
72
+
73
+ const routeData = useRoute();
74
+
75
+ const currentRiver = useScreenData(
76
+ getScreenId(routeData.screenData, navigation.activeRiver)
77
+ );
78
+
79
+ const { title } = useNavbarState();
80
+
81
+ const navBarProps = React.useMemo(
82
+ () => ({
83
+ ...getNavigationPropsV2({
84
+ currentRiver,
85
+ title,
86
+ category: "nav_bar",
87
+ }),
88
+ setToggleMenu,
89
+ setCloseMenu,
90
+ }),
91
+ [currentRiver, setCloseMenu, setToggleMenu]
92
+ );
93
+
94
+ const NavBar = React.useMemo(
57
95
  () =>
58
- R.compose(
59
- R.prop("module"),
60
- R.find(R.propEq("identifier", "offline-experience"))
61
- )(plugins),
62
- [plugins]
96
+ getNavigationPluginModule(
97
+ "nav_bar",
98
+ currentRiver,
99
+ plugins
100
+ ) as React.ComponentType<MobileNavBarPluginProps>,
101
+ []
63
102
  );
64
103
 
65
- const { OfflineFallbackScreen } = offlinePlugin;
104
+ const { screenData, pathname } = routeData;
66
105
 
67
- // Gets the data for the current screen configuration
68
- const currentScreenData = useCurrentScreenData();
69
- const theme = useTheme();
70
- const { backgroundColor } = useScreenConfiguration(currentScreenData.id);
106
+ const offlinePlugin = getComponentModule({
107
+ plugins,
108
+ components: {},
109
+ componentType: "offline-experience",
110
+ });
111
+
112
+ const { OfflineFallbackScreen } = offlinePlugin;
71
113
 
72
114
  const style = React.useMemo(
73
115
  () => ({
@@ -75,21 +117,28 @@ export function Screen(props: Props) {
75
117
  backgroundColor: isValidColor(backgroundColor)
76
118
  ? backgroundColor
77
119
  : theme.app_background_color,
120
+ paddingTop: 0,
121
+ // paddingBottom: insets.bottom, // Should be applied directly by UI plugin
122
+ // paddingLeft: insets.left, // Should be applied directly by UI plugin
123
+ // paddingRight: insets.right, // Should be applied directly by UI plugin
78
124
  }),
79
- [theme.app_background_color, backgroundColor]
125
+ [insets, screenWidth, theme.app_background_color, backgroundColor]
80
126
  );
81
127
 
82
128
  const targetScreenData =
83
- currentScreenData || screenData?.targetScreen || screenData;
129
+ currentScreenData || (screenData as any)?.targetScreen || screenData;
84
130
 
85
131
  useScreenOrientationHandler({ screenData: targetScreenData });
86
132
 
87
133
  return (
88
134
  <ScreenContextProvider pathname={pathname}>
89
135
  <View style={style}>
90
- <NavBar key={pathname} {...props.navBarProps} />
136
+ <NavBar
137
+ {...{ ...(navBarProps as MobileNavBarPluginProps), id: pathname }}
138
+ />
91
139
 
92
- <OfflineFallbackScreen screenData={screenData}>
140
+ <OfflineFallbackScreen screenData={targetScreenData}>
141
+ {/* @TODO RouteManager doesn't use props, can they be removed ? */}
93
142
  <RouteManager pathname={pathname} screenData={screenData} />
94
143
  </OfflineFallbackScreen>
95
144
  </View>