@applicaster/zapp-react-native-ui-components 12.0.0-rc.10 → 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 (150) 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 +88 -113
  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/ImageContainer/index.tsx +5 -1
  43. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +37 -2
  44. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  45. package/Components/MasterCell/DefaultComponents/Text/index.tsx +14 -2
  46. package/Components/MasterCell/DefaultComponents/Toggle.tsx +5 -1
  47. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  48. package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +24 -9
  49. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +4 -1
  50. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +10 -2
  51. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +6 -10
  52. package/Components/MasterCell/dataAdapter.ts +21 -7
  53. package/Components/MasterCell/hooks/useAsyncRendering/index.ts +1 -1
  54. package/Components/MasterCell/index.tsx +3 -1
  55. package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
  56. package/Components/MasterCell/utils/index.ts +33 -35
  57. package/Components/MeasurmentsPortal/BasicMeasurementsPortal.tsx +11 -7
  58. package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +10 -1
  59. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  60. package/Components/ModalComponent/Button/Item.tsx +82 -0
  61. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  62. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  63. package/Components/ModalComponent/Button/assets.ts +4 -0
  64. package/Components/ModalComponent/Button/index.tsx +111 -0
  65. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  66. package/Components/ModalComponent/Header/Title.tsx +70 -0
  67. package/Components/ModalComponent/Header/assets.ts +4 -0
  68. package/Components/ModalComponent/Header/index.tsx +71 -0
  69. package/Components/ModalComponent/Header/utils.ts +79 -0
  70. package/Components/ModalComponent/index.tsx +38 -0
  71. package/Components/ModalComponent/utils.ts +126 -0
  72. package/Components/Navigator/StackNavigator.tsx +57 -0
  73. package/Components/Navigator/index.ts +1 -0
  74. package/Components/PlayerContainer/PlayerContainer.tsx +66 -31
  75. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  76. package/Components/PlayerImageBackground/index.tsx +34 -8
  77. package/Components/River/ComponentsMap/ComponentsMap.tsx +97 -2
  78. package/Components/River/RefreshControl.tsx +55 -1
  79. package/Components/River/River.tsx +8 -5
  80. package/Components/River/TV/River.tsx +2 -25
  81. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -1
  82. package/Components/River/__tests__/componentsMap.test.js +7 -0
  83. package/Components/River/useScreenConfiguration.ts +2 -2
  84. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -0
  85. package/Components/RouteManager/__tests__/routeManager.test.js +9 -2
  86. package/Components/RouteManager/index.tsx +4 -2
  87. package/Components/Screen/TV/hooks/index.ts +3 -0
  88. package/Components/Screen/TV/hooks/useInitialFocus.ts +70 -0
  89. package/Components/Screen/TV/hooks/useRestoreFocus.ts +22 -0
  90. package/Components/Screen/TV/index.web.tsx +165 -0
  91. package/Components/Screen/__tests__/Screen.test.tsx +91 -74
  92. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +24 -6
  93. package/Components/Screen/__tests__/navigationHandler.test.ts +1 -178
  94. package/Components/Screen/index.tsx +110 -54
  95. package/Components/Screen/navigationHandler.ts +5 -82
  96. package/Components/ScreenResolver/index.tsx +10 -13
  97. package/Components/Tabs/TV/styles.ts +1 -1
  98. package/Components/TrackedView/index.tsx +6 -3
  99. package/Components/Transitioner/Scene.tsx +32 -26
  100. package/Components/Transitioner/Transitioner.tsx +21 -28
  101. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -4
  102. package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +1 -0
  103. package/Components/VideoLive/LiveImageManager.ts +70 -14
  104. package/Components/VideoLive/PlayerLiveImageComponent.tsx +132 -95
  105. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  106. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +21 -29
  107. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +66 -0
  108. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +355 -0
  109. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +161 -0
  110. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +456 -0
  111. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +182 -0
  112. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  113. package/Components/VideoModal/ModalAnimation/utils.ts +302 -0
  114. package/Components/VideoModal/PlayerDetails.tsx +6 -3
  115. package/Components/VideoModal/PlayerWrapper.tsx +81 -49
  116. package/Components/VideoModal/VideoModal.tsx +23 -40
  117. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  118. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +12 -1
  119. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +266 -166
  120. package/Components/VideoModal/hooks/useModalSize.ts +10 -12
  121. package/Components/VideoModal/utils.ts +8 -5
  122. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  123. package/Components/Viewport/ViewportTracker/ViewportTracker.tsx +31 -40
  124. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  125. package/Components/Viewport/ViewportTracker/index.tsx +1 -0
  126. package/Components/Viewport/utils.js +1 -1
  127. package/Components/ZappUIComponent/index.tsx +22 -12
  128. package/Components/index.js +2 -0
  129. package/Contexts/FocusableGroupContext/FocusableGroupContext.ts +3 -0
  130. package/Contexts/FocusableGroupContext/FocusableGroupContextProvider.tsx +16 -0
  131. package/Contexts/FocusableGroupContext/__tests__/FocusableGroupContextProvider.test.tsx +22 -0
  132. package/Contexts/FocusableGroupContext/__tests__/withFocusableContext.test.tsx +26 -0
  133. package/Contexts/FocusableGroupContext/index.ts +7 -0
  134. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +17 -0
  135. package/Contexts/MenuToggleContext/{index.js → index.ts} +16 -0
  136. package/Contexts/ScreenContext/__tests__/__snapshots__/index.test.tsx.snap +3 -0
  137. package/Contexts/ScreenContext/__tests__/index.test.tsx +27 -0
  138. package/Contexts/ScreenContext/index.tsx +95 -29
  139. package/Contexts/ScreenDataContext/index.tsx +20 -0
  140. package/Contexts/ZappPipesContext/ZappPipesEntryContext.ts +1 -1
  141. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  142. package/Decorators/RiverResolver/index.tsx +0 -4
  143. package/Decorators/index.tsx +0 -4
  144. package/events/index.ts +1 -0
  145. package/package.json +5 -6
  146. package/Components/Layout/TV/TransitionOverlay.tsx +0 -64
  147. package/Components/VideoModal/hooks/usePosition.ts +0 -50
  148. /package/Components/FocusableGroup/{index.android.js → index.android.ts} +0 -0
  149. /package/Components/FocusableGroup/{index.ios.js → index.ios.ts} +0 -0
  150. /package/Contexts/{index.js → index.ts} +0 -0
@@ -6,6 +6,12 @@ import configureStore from "redux-mock-store";
6
6
 
7
7
  import * as themeUtils from "@applicaster/zapp-react-native-utils/theme";
8
8
 
9
+ // silences the errors related to React-native-gesture-handler in tests
10
+ jest.mock(
11
+ "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation",
12
+ () => () => null
13
+ );
14
+
9
15
  jest.mock("react-native-safe-area-context", () => ({
10
16
  useSafeAreaInsets: () => ({ top: 50 }),
11
17
  }));
@@ -83,6 +89,7 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
83
89
  useNavigation: jest.fn(() => ({ currentRoute: "/river/A1234" })),
84
90
  useRoute: jest.fn(() => ({ pathname: "/river/A1234", screenData })),
85
91
  useProfilerLogging: jest.fn(),
92
+ useIsScreenActive: jest.fn().mockReturnValue(true),
86
93
  }));
87
94
 
88
95
  jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
@@ -1,10 +1,10 @@
1
1
  import * as R from "ramda";
2
2
 
3
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
4
3
  import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
5
4
  import { toCamelCase } from "@applicaster/zapp-react-native-utils/stringUtils";
6
5
  import { useMemo } from "react";
7
6
  import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
7
+ import { useRivers } from "@applicaster/zapp-react-native-utils/reactHooks/state";
8
8
 
9
9
  type GeneralContentScreen = ZappRiver & {
10
10
  styles: {
@@ -46,7 +46,7 @@ const stylingKeys = [
46
46
  ];
47
47
 
48
48
  export function useScreenConfiguration(screenId: string): ScreenConfiguration {
49
- const { rivers } = usePickFromState(["rivers"]);
49
+ const rivers = useRivers();
50
50
  const isTablet = useIsTablet();
51
51
 
52
52
  return useMemo(() => {
@@ -5,6 +5,7 @@ exports[`<RouteManager /> renders correctly 1`] = `
5
5
  screenId="A1234"
6
6
  >
7
7
  <WithProvider
8
+ pathname="/river/A1234"
8
9
  screenData={
9
10
  Object {
10
11
  "id": "A1234",
@@ -2,11 +2,17 @@ import React from "react";
2
2
  import { shallow } from "enzyme";
3
3
  import { shallowToJson } from "enzyme-to-json";
4
4
 
5
- import { ScreenResolver } from "@applicaster/zapp-react-native-ui-components/Components/ScreenResolver";
6
-
7
5
  const pathname = "/river/A1234";
8
6
  const screenData = { id: "A1234" };
9
7
 
8
+ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
9
+ useRoute: jest.fn(() => ({ pathname: pathname, screenData: screenData })),
10
+ }));
11
+
12
+ const {
13
+ ScreenResolver,
14
+ } = require("@applicaster/zapp-react-native-ui-components/Components/ScreenResolver");
15
+
10
16
  const { RouteManager } = require("../index");
11
17
 
12
18
  describe("<RouteManager />", () => {
@@ -20,6 +26,7 @@ describe("<RouteManager />", () => {
20
26
 
21
27
  it("passes the correct props to ScreenResolver", () => {
22
28
  expect(wrapper.find(ScreenResolver).props()).toEqual({
29
+ pathname: "/river/A1234",
23
30
  screenType: "river",
24
31
  screenId: "A1234",
25
32
  screenData: { id: "A1234" },
@@ -2,6 +2,7 @@ import * as React from "react";
2
2
  import * as R from "ramda";
3
3
 
4
4
  import { getPathAttributes } from "@applicaster/zapp-react-native-utils/navigationUtils";
5
+ import { useRoute } from "@applicaster/zapp-react-native-utils/reactHooks";
5
6
  import { ScreenResolver } from "../ScreenResolver";
6
7
  import { TestId } from "./TestId";
7
8
 
@@ -12,7 +13,8 @@ type Props = { pathname: string; screenData: Record<string, any> };
12
13
  * and reconciles data returned from hook plugins if needed
13
14
  * @param {Props}: see props above
14
15
  */
15
- export function RouteManager({ pathname, screenData, ...otherProps }: Props) {
16
+ export function RouteManager(props: Props) {
17
+ const { pathname, screenData } = useRoute();
16
18
  const pathAttributes = getPathAttributes({ pathname });
17
19
 
18
20
  const { screenType, screenId } = R.last(pathAttributes);
@@ -22,8 +24,8 @@ export function RouteManager({ pathname, screenData, ...otherProps }: Props) {
22
24
  <ScreenResolver
23
25
  screenType={screenType}
24
26
  screenId={screenId}
27
+ {...props}
25
28
  screenData={screenData}
26
- {...otherProps}
27
29
  />
28
30
  </TestId>
29
31
  );
@@ -0,0 +1,3 @@
1
+ export { useInitialFocus } from "./useInitialFocus";
2
+
3
+ export { useRestoreFocus } from "./useRestoreFocus";
@@ -0,0 +1,70 @@
1
+ import * as React from "react";
2
+ import {
3
+ useNavigationPluginData,
4
+ useIsNavBarVisible,
5
+ useRoute,
6
+ } from "@applicaster/zapp-react-native-utils/reactHooks";
7
+ import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
8
+ import {
9
+ setFocusOnContent,
10
+ setFocusOnMenu,
11
+ } from "@applicaster/zapp-react-native-utils/appUtils/focusManagerAux";
12
+
13
+ type Return =
14
+ | {
15
+ onContent: true;
16
+ onMenu: false;
17
+ }
18
+ | {
19
+ onContent: false;
20
+ onMenu: true;
21
+ };
22
+
23
+ const getInitialFocus = (focusOnContent, isNavBarVisible): Return => {
24
+ if (focusOnContent) {
25
+ return {
26
+ onContent: true,
27
+ onMenu: false,
28
+ };
29
+ }
30
+
31
+ if (!focusOnContent && isNavBarVisible) {
32
+ // put focus on navbar
33
+ return {
34
+ onContent: false,
35
+ onMenu: true,
36
+ };
37
+ }
38
+
39
+ // we don't have navbar, put focus on content anyway
40
+ return {
41
+ onContent: true,
42
+ onMenu: false,
43
+ };
44
+ };
45
+
46
+ export const useInitialFocus = (): void => {
47
+ const navigationPluginData = useNavigationPluginData();
48
+
49
+ const focusOnContent = toBooleanWithDefaultFalse(
50
+ navigationPluginData?.rules?.focus_on_content
51
+ );
52
+
53
+ const isNavBarVisible = useIsNavBarVisible();
54
+
55
+ const { pathname: currentRoute } = useRoute();
56
+
57
+ React.useEffect(() => {
58
+ const initialFocus = getInitialFocus(focusOnContent, isNavBarVisible);
59
+
60
+ if (initialFocus.onContent) {
61
+ setFocusOnContent(currentRoute);
62
+
63
+ return;
64
+ }
65
+
66
+ if (initialFocus.onMenu) {
67
+ setFocusOnMenu(currentRoute);
68
+ }
69
+ }, []);
70
+ };
@@ -0,0 +1,22 @@
1
+ import * as React from "react";
2
+ import { isNil } from "ramda";
3
+ import { useIsScreenActive } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
4
+ import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
5
+ import { focusManager } from "@applicaster/zapp-react-native-utils/appUtils/focusManager";
6
+
7
+ export const useRestoreFocus = (): void => {
8
+ const isScreenActive = useIsScreenActive();
9
+ const previousIsScreenActive = usePrevious(isScreenActive);
10
+
11
+ React.useEffect(() => {
12
+ if (isNil(previousIsScreenActive)) {
13
+ // it's initial mounting of the screen, do nothing here
14
+ return;
15
+ }
16
+
17
+ if (!previousIsScreenActive && isScreenActive) {
18
+ // restore focus when we go back from next screen
19
+ focusManager.setInitialFocus();
20
+ }
21
+ }, [previousIsScreenActive, isScreenActive]);
22
+ };
@@ -0,0 +1,165 @@
1
+ import * as React from "react";
2
+ import { last } from "ramda";
3
+ import { View, StyleSheet } from "react-native";
4
+ import {
5
+ findMenuPlugin,
6
+ getNavigationProps,
7
+ getPathAttributes,
8
+ } from "@applicaster/zapp-react-native-utils/navigationUtils";
9
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
10
+ import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
11
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
12
+ import {
13
+ useNavbarState,
14
+ useScreenBackgroundColor,
15
+ } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
16
+ import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
17
+
18
+ import { NavBarContainer } from "../../Layout/TV/NavBarContainer";
19
+ import { ScreenResolver } from "../../ScreenResolver";
20
+ import { useInitialFocus, useRestoreFocus } from "./hooks";
21
+ import { isPlayerPlugin } from "@applicaster/zapp-react-native-utils/pluginUtils";
22
+
23
+ const styles = StyleSheet.create({
24
+ container: {
25
+ position: "absolute",
26
+ top: 0,
27
+ left: 0,
28
+ right: 0,
29
+ bottom: 0,
30
+ },
31
+ });
32
+
33
+ type Components = {
34
+ NavBar: React.ComponentType<any>;
35
+ Background: React.ComponentType<any>;
36
+ };
37
+
38
+ type Props = {
39
+ route: string;
40
+ Components: Components;
41
+ };
42
+
43
+ const getActiveRiver = ({
44
+ screenId,
45
+ screenType,
46
+ routeState,
47
+ rivers,
48
+ fallbackActiveRiver,
49
+ }) => {
50
+ if (rivers[screenId]) {
51
+ if (screenType === "hooks") {
52
+ const navigations = routeState?.state?.entry?.payload?.navigations;
53
+
54
+ if (navigations) {
55
+ return routeState.state.entry.payload;
56
+ }
57
+ }
58
+
59
+ return routeState?.state?.screen;
60
+ }
61
+
62
+ // screenId is not presented into rivers, use fallback instead
63
+ return fallbackActiveRiver;
64
+ };
65
+
66
+ const getNavigations = ({
67
+ screenId,
68
+ screenType,
69
+ routeState,
70
+ rivers,
71
+ fallbackNavigations,
72
+ }) => {
73
+ if (rivers[screenId]) {
74
+ // river presents
75
+ if (screenType === "hooks") {
76
+ const navigations = routeState?.state?.entry?.payload?.navigations;
77
+
78
+ if (navigations) {
79
+ return navigations;
80
+ }
81
+ }
82
+
83
+ return routeState?.state?.screen?.navigations;
84
+ }
85
+
86
+ // screenId is not presented into rivers, use fallback instead
87
+ return fallbackNavigations;
88
+ };
89
+
90
+ export const Screen = ({ route, Components }: Props) => {
91
+ if (isNilOrEmpty(route)) {
92
+ throw Error("Required props: route is missing");
93
+ }
94
+
95
+ const navigator = useNavigation();
96
+ const { plugins = [], rivers = [] } = usePickFromState(["plugins", "rivers"]);
97
+
98
+ const pathAttributes = getPathAttributes({ pathname: route });
99
+ const routeState = navigator.getStackForPathname(route);
100
+
101
+ const { screenType, screenId } = last(pathAttributes);
102
+
103
+ const backgroundColor = useScreenBackgroundColor(screenId);
104
+
105
+ useInitialFocus();
106
+ useRestoreFocus();
107
+
108
+ const activeRiver = getActiveRiver({
109
+ screenId,
110
+ screenType,
111
+ routeState,
112
+ rivers,
113
+ fallbackActiveRiver: navigator.activeRiver,
114
+ });
115
+
116
+ const navigationProps = getNavigationProps({
117
+ navigator: {
118
+ // @ts-ignore
119
+ activeRiver,
120
+ // @ts-ignore
121
+ screenTitle: routeState.state.entry?.title || routeState.screen?.name,
122
+ },
123
+ category: "menu",
124
+ });
125
+
126
+ const navigations = getNavigations({
127
+ screenId,
128
+ screenType,
129
+ routeState,
130
+ rivers,
131
+ fallbackNavigations: navigator.activeRiver.navigations,
132
+ });
133
+
134
+ const menuPlugin = findMenuPlugin(navigations, plugins);
135
+
136
+ const NavBar = (Components.NavBar ||
137
+ menuPlugin.module) as React.ComponentType<any>;
138
+
139
+ const isPlayer = isPlayerPlugin(routeState);
140
+
141
+ const { visible: isNavBarVisible } = useNavbarState();
142
+
143
+ const screenData =
144
+ screenType === "hooks" || isPlayer
145
+ ? routeState?.state?.entry
146
+ : routeState?.state?.screen;
147
+
148
+ return (
149
+ <View style={[styles.container, { backgroundColor }]}>
150
+ <NavBarContainer isVisible={isNavBarVisible} onReady={noop}>
151
+ <NavBar
152
+ isVisible={isNavBarVisible}
153
+ menuPlugin={menuPlugin}
154
+ navigationProps={navigationProps}
155
+ />
156
+ </NavBarContainer>
157
+ <ScreenResolver
158
+ screenType={screenType}
159
+ screenId={screenId}
160
+ screenData={screenData}
161
+ groupId={route}
162
+ />
163
+ </View>
164
+ );
165
+ };
@@ -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>