@applicaster/zapp-react-native-ui-components 12.0.0-alpha.9004455836 → 12.0.0-alpha.9233494544

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 (101) 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 +1 -1
  5. package/Components/Cell/Cell.tsx +7 -3
  6. package/Components/Cell/CellWithFocusable.tsx +38 -19
  7. package/Components/Cell/TvOSCellComponent.tsx +2 -2
  8. package/Components/ErrorScreen/index.tsx +1 -1
  9. package/Components/FocusableCell/index.tsx +7 -7
  10. package/Components/FocusableGroup/index.tsx +1 -0
  11. package/Components/FocusableList/FocusableChild.ts +24 -14
  12. package/Components/FocusableList/FocusableItem.tsx +1 -1
  13. package/Components/FocusableList/FocusableListItemWrapper.tsx +76 -0
  14. package/Components/FocusableList/hooks/useCellState.android.ts +3 -1
  15. package/Components/FocusableList/index.tsx +26 -25
  16. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +6 -3
  17. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +13 -6
  18. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +1 -1
  19. package/Components/HandlePlayable/HandlePlayable.tsx +3 -0
  20. package/Components/HookRenderer/index.tsx +1 -6
  21. package/Components/Image/Image.android.tsx +3 -25
  22. package/Components/Image/Image.tsx +18 -2
  23. package/Components/Image/utils/index.ts +39 -0
  24. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +2 -2
  25. package/Components/Layout/TV/__tests__/index.test.tsx +1 -34
  26. package/Components/Layout/TV/index.tsx +141 -58
  27. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +9 -26
  28. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +5 -3
  29. package/Components/MasterCell/DefaultComponents/Image/hooks/useImageSize.ts +65 -0
  30. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +17 -2
  31. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +3 -2
  32. package/Components/MasterCell/DefaultComponents/Toggle.tsx +5 -1
  33. package/Components/MasterCell/DefaultComponents/__tests__/image.test.js +1 -1
  34. package/Components/MasterCell/SharedUI/CollapsibleTextContainer/index.ts +8 -14
  35. package/Components/MasterCell/utils/index.ts +16 -5
  36. package/Components/ModalComponent/BottomSheetModalContent.tsx +121 -0
  37. package/Components/ModalComponent/Button/Item.tsx +82 -0
  38. package/Components/ModalComponent/Button/ItemIcon.tsx +60 -0
  39. package/Components/ModalComponent/Button/ItemLabel.tsx +101 -0
  40. package/Components/ModalComponent/Button/assets.ts +4 -0
  41. package/Components/ModalComponent/Button/index.tsx +111 -0
  42. package/Components/ModalComponent/Header/CloseButton.tsx +59 -0
  43. package/Components/ModalComponent/Header/Title.tsx +70 -0
  44. package/Components/ModalComponent/Header/assets.ts +4 -0
  45. package/Components/ModalComponent/Header/index.tsx +71 -0
  46. package/Components/ModalComponent/Header/utils.ts +79 -0
  47. package/Components/ModalComponent/index.tsx +38 -0
  48. package/Components/ModalComponent/utils.ts +126 -0
  49. package/Components/PlayerContainer/PlayerContainer.tsx +63 -31
  50. package/Components/PlayerContainer/ProgramInfo/index.tsx +3 -1
  51. package/Components/PlayerImageBackground/index.tsx +34 -8
  52. package/Components/River/ComponentsMap/ComponentsMap.tsx +90 -2
  53. package/Components/River/TV/River.tsx +2 -3
  54. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +1 -1
  55. package/Components/River/__tests__/componentsMap.test.js +7 -0
  56. package/Components/River/useScreenConfiguration.ts +2 -2
  57. package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +1 -0
  58. package/Components/RouteManager/__tests__/routeManager.test.js +9 -2
  59. package/Components/RouteManager/index.tsx +5 -3
  60. package/Components/Screen/TV/index.web.tsx +169 -0
  61. package/Components/Screen/__tests__/Screen.test.tsx +88 -74
  62. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +24 -6
  63. package/Components/Screen/__tests__/navigationHandler.test.ts +1 -178
  64. package/Components/Screen/index.tsx +103 -43
  65. package/Components/Screen/navigationHandler.ts +0 -82
  66. package/Components/ScreenResolver/index.tsx +4 -2
  67. package/Components/Tabs/TV/styles.ts +1 -1
  68. package/Components/VideoLive/LiveImageManager.ts +15 -5
  69. package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -28
  70. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +45 -3
  71. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +18 -28
  72. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +78 -0
  73. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +342 -0
  74. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +151 -0
  75. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +438 -0
  76. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +143 -0
  77. package/Components/VideoModal/ModalAnimation/index.ts +15 -0
  78. package/Components/VideoModal/ModalAnimation/utils.ts +299 -0
  79. package/Components/VideoModal/PlayerDetails.tsx +3 -0
  80. package/Components/VideoModal/PlayerWrapper.tsx +64 -41
  81. package/Components/VideoModal/VideoModal.tsx +8 -25
  82. package/Components/VideoModal/__tests__/PlayerDetails.test.tsx +0 -2
  83. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +5 -1
  84. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +246 -166
  85. package/Components/VideoModal/utils.ts +3 -3
  86. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +26 -21
  87. package/Components/Viewport/ViewportTracker/ViewportTracker.tsx +1 -1
  88. package/Components/Viewport/ViewportTracker/__tests__/viewportTracker.test.js +4 -5
  89. package/Components/Viewport/ViewportTracker/index.tsx +1 -0
  90. package/Components/Viewport/utils.js +1 -1
  91. package/Components/ZappUIComponent/index.tsx +22 -12
  92. package/Components/index.js +2 -0
  93. package/Contexts/MenuToggleContext/{index.js → index.ts} +16 -0
  94. package/Contexts/ScreenContext/__tests__/__snapshots__/index.test.tsx.snap +3 -0
  95. package/Contexts/ScreenContext/__tests__/index.test.tsx +27 -0
  96. package/Contexts/ScreenContext/index.tsx +95 -29
  97. package/Contexts/ZappPipesContext/ZappPipesEntryContext.ts +1 -1
  98. package/Decorators/ComponentsMapWrapper/withComponentsMapProvider.tsx +7 -2
  99. package/package.json +5 -5
  100. package/Components/VideoModal/hooks/usePosition.ts +0 -50
  101. /package/Contexts/{index.js → index.ts} +0 -0
@@ -1,6 +1,6 @@
1
1
  import * as React from "react";
2
2
  import * as R from "ramda";
3
- import { View, FlatList, StyleSheet, Platform } from "react-native";
3
+ import { View, StyleSheet, Platform, Animated, FlatList } from "react-native";
4
4
  import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
5
5
  import { RiverItem } from "../RiverItem";
6
6
  import { RiverFooter } from "../RiverFooter";
@@ -21,6 +21,8 @@ import {
21
21
  import { useScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData";
22
22
  import { isLast } from "@applicaster/zapp-react-native-utils/arrayUtils";
23
23
  import { withComponentsMapProvider } from "@applicaster/zapp-react-native-ui-components/Decorators/ComponentsMapWrapper";
24
+ import { useScreenContextV2 } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
25
+ import { useShallow } from "zustand/react/shallow";
24
26
 
25
27
  type Props = {
26
28
  feed: ZappFeed;
@@ -40,8 +42,10 @@ const styles = StyleSheet.create({
40
42
  },
41
43
  });
42
44
 
43
- const scrollIndicatorInsets = { right: 1 };
45
+ const getNearestValue = (value, optionA, optionB) =>
46
+ Math.abs(value - optionA) < Math.abs(value - optionB) ? optionA : optionB;
44
47
 
48
+ const scrollIndicatorInsets = { right: 1 };
45
49
  const keyExtractor = R.compose(String, R.prop("id"));
46
50
 
47
51
  function ComponentsMapComponent(props: Props) {
@@ -59,6 +63,7 @@ function ComponentsMapComponent(props: Props) {
59
63
  refreshingPipesV1,
60
64
  } = props;
61
65
 
66
+ const flatListRef = React.useRef<FlatList | null>(null);
62
67
  const screenConfig = useScreenConfiguration(riverId);
63
68
  const screenData = useScreenData(riverId);
64
69
  const pullToRefreshEnabled = screenData?.rules?.pull_to_refresh_enabled;
@@ -193,6 +198,68 @@ function ComponentsMapComponent(props: Props) {
193
198
  []
194
199
  );
195
200
 
201
+ const navBarStore = useScreenContextV2()._navBarStore;
202
+
203
+ const scrollY = navBarStore(
204
+ useShallow(({ scrollYAnimated }) => scrollYAnimated)
205
+ );
206
+
207
+ const canMomentum = React.useRef(false);
208
+
209
+ const onScrollBeginDrag = React.useCallback(() => {
210
+ canMomentum.current = true;
211
+ }, []);
212
+
213
+ /* onMomentumScrollEnd: Handling snap to expanded/collapsed state ( for navbar ) */
214
+ const _onMomentumScrollEnd = React.useCallback(({ nativeEvent }) => {
215
+ if (!canMomentum.current) return;
216
+ canMomentum.current = false;
217
+
218
+ const { height: headerHeight, scrollState } = navBarStore.getState();
219
+
220
+ const offsetY = nativeEvent.contentOffset.y;
221
+
222
+ if (
223
+ !(scrollState === 0 || scrollState === -headerHeight) &&
224
+ flatListRef.current
225
+ ) {
226
+ const offset =
227
+ getNearestValue(Math.round(scrollState), -headerHeight, 0) ===
228
+ -headerHeight
229
+ ? Math.round(offsetY + scrollState + headerHeight)
230
+ : Math.round(offsetY + scrollState);
231
+
232
+ flatListRef.current.scrollToOffset({
233
+ animated: true,
234
+ offset,
235
+ });
236
+ }
237
+ }, []);
238
+
239
+ /* onScrollEnd: Handling snap to expanded/collapsed state ( for navbar ) */
240
+ const _onScrollEndDrag = React.useCallback(({ nativeEvent }) => {
241
+ const { height: headerHeight, scrollState } = navBarStore.getState();
242
+
243
+ const offsetY = nativeEvent.contentOffset.y;
244
+
245
+ if (
246
+ !(scrollState === 0 || scrollState === -headerHeight) &&
247
+ flatListRef.current &&
248
+ nativeEvent.velocity.y === 0
249
+ ) {
250
+ const offset =
251
+ getNearestValue(Math.round(scrollState), -headerHeight, 0) ===
252
+ -headerHeight
253
+ ? Math.round(offsetY + scrollState + headerHeight)
254
+ : Math.round(offsetY + scrollState);
255
+
256
+ flatListRef.current.scrollToOffset({
257
+ animated: true,
258
+ offset,
259
+ });
260
+ }
261
+ }, []);
262
+
196
263
  if (shouldShowLoadingError) {
197
264
  return <RiverError />;
198
265
  }
@@ -208,6 +275,9 @@ function ComponentsMapComponent(props: Props) {
208
275
  >
209
276
  <ViewportTracker>
210
277
  <FlatList
278
+ ref={(ref) => {
279
+ flatListRef.current = ref;
280
+ }}
211
281
  // Fix for WebView rerender crashes on Android API 28+
212
282
  // https://github.com/react-native-webview/react-native-webview/issues/1915#issuecomment-964035468
213
283
  overScrollMode={Platform.OS === "android" ? "never" : "auto"}
@@ -227,6 +297,24 @@ function ComponentsMapComponent(props: Props) {
227
297
  }
228
298
  ListFooterComponent={renderFooter}
229
299
  refreshControl={refreshControl}
300
+ onScrollBeginDrag={onScrollBeginDrag}
301
+ onScroll={Animated.event(
302
+ [
303
+ {
304
+ nativeEvent: {
305
+ contentOffset: {
306
+ y: scrollY,
307
+ },
308
+ },
309
+ },
310
+ ],
311
+ {
312
+ useNativeDriver: false,
313
+ }
314
+ )}
315
+ onMomentumScrollEnd={_onMomentumScrollEnd}
316
+ onScrollEndDrag={_onScrollEndDrag}
317
+ scrollEventThrottle={16}
230
318
  {...scrollViewExtraProps}
231
319
  />
232
320
  </ViewportTracker>
@@ -4,7 +4,6 @@ import * as React from "react";
4
4
  import { Text } from "react-native";
5
5
  import * as R from "ramda";
6
6
 
7
- import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
8
7
  import {
9
8
  useFeedLoader,
10
9
  useLayoutVersion,
@@ -20,6 +19,7 @@ import {
20
19
  useNavbarState,
21
20
  useSetNavbarState,
22
21
  } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
22
+ import { useRivers } from "@applicaster/zapp-react-native-utils/reactHooks/state";
23
23
 
24
24
  type Props = {
25
25
  screenId: string;
@@ -53,7 +53,7 @@ export const River = (props: Props) => {
53
53
 
54
54
  const navigationPluginData = useNavigationPluginData();
55
55
 
56
- const { rivers } = usePickFromState(["rivers"]);
56
+ const rivers = useRivers();
57
57
  const isV2 = useLayoutVersion({ isV2: true });
58
58
 
59
59
  const river = React.useMemo(() => rivers?.[screenId], [screenId]);
@@ -112,7 +112,6 @@ export const River = (props: Props) => {
112
112
 
113
113
  focusManager.setupInitialFocus(groupId, true);
114
114
  focusManager.setInitialFocus();
115
- focusManager.enableAutomaticFocus();
116
115
  }
117
116
  }, [river, componentsMapExtraProps]);
118
117
 
@@ -64,7 +64,7 @@ exports[`componentsMap renders renders components map correctly 1`] = `
64
64
  refreshControl={null}
65
65
  removeClippedSubviews={true}
66
66
  renderItem={[Function]}
67
- scrollEventThrottle={50}
67
+ scrollEventThrottle={16}
68
68
  scrollIndicatorInsets={
69
69
  Object {
70
70
  "right": 1,
@@ -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: _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}
25
- screenData={screenData}
26
- {...otherProps}
27
+ {...props}
28
+ screenData={props.screenData}
27
29
  />
28
30
  </TestId>
29
31
  );
@@ -0,0 +1,169 @@
1
+ import * as React from "react";
2
+ import { last, pathOr } from "ramda";
3
+ import { ScreenResolver } from "../../ScreenResolver";
4
+ import {
5
+ getNavigationProps,
6
+ getPathAttributes,
7
+ resolveNavigationPlugin,
8
+ } from "@applicaster/zapp-react-native-utils/navigationUtils";
9
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
10
+ import { NavBarContainer } from "../../Layout/TV/NavBarContainer";
11
+ import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
12
+ import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
13
+
14
+ import {
15
+ useInitialFocus,
16
+ useRestoreFocus,
17
+ } from "@applicaster/zapp-react-dom-ui-components/Components/River/hooks";
18
+
19
+ type Components = {
20
+ NavBar: React.ComponentType<any>;
21
+ Background: React.ComponentType<any>;
22
+ };
23
+
24
+ type Props = {
25
+ route: string;
26
+ Components: Components;
27
+ };
28
+
29
+ const isPlayer = (routeState): boolean => {
30
+ const pluginType = pathOr(
31
+ "unknown_plugin_type",
32
+ ["state", "screen", "plugin_type"],
33
+ routeState
34
+ );
35
+
36
+ return pluginType === "player";
37
+ };
38
+
39
+ const getActiveRiver = ({
40
+ screenId,
41
+ screenType,
42
+ routeState,
43
+ rivers,
44
+ fallbackActiveRiver,
45
+ }) => {
46
+ if (rivers[screenId]) {
47
+ if (screenType === "hooks") {
48
+ const navigations = routeState?.state?.entry?.payload?.navigations;
49
+ if (navigations) {
50
+ return routeState.state.entry.payload;
51
+ }
52
+ }
53
+
54
+ return routeState?.state?.screen;
55
+ }
56
+
57
+ // screenId is not presented into rivers, use fallback instead
58
+ return fallbackActiveRiver;
59
+ };
60
+
61
+ const getNavigations = ({
62
+ screenId,
63
+ screenType,
64
+ routeState,
65
+ rivers,
66
+ fallbackNavigations,
67
+ }) => {
68
+ if (rivers[screenId]) {
69
+ // river presents
70
+ if (screenType === "hooks") {
71
+ const navigations = routeState?.state?.entry?.payload?.navigations;
72
+ if (navigations) {
73
+ return navigations;
74
+ }
75
+ }
76
+
77
+ return routeState?.state?.screen?.navigations;
78
+ }
79
+
80
+ // screenId is not presented into rivers, use fallback instead
81
+ return fallbackNavigations;
82
+ };
83
+
84
+ export const Screen = (props: Props) => {
85
+ if (!props.route) {
86
+ throw new Error("Required props route is missing");
87
+ }
88
+
89
+ const navigator = useNavigation();
90
+ const { plugins = [], rivers = [] } = usePickFromState(["plugins", "rivers"]);
91
+
92
+ const pathAttributes = getPathAttributes({ pathname: props.route });
93
+ const routeState = navigator.getStackForPathname(props.route);
94
+
95
+ const { screenType, screenId } = last(pathAttributes);
96
+
97
+ useInitialFocus();
98
+ useRestoreFocus();
99
+
100
+ const activeRiver = getActiveRiver({
101
+ screenId,
102
+ screenType,
103
+ routeState,
104
+ rivers,
105
+ fallbackActiveRiver: navigator.activeRiver,
106
+ });
107
+
108
+ console.log("debug_2", "Screen", {
109
+ screenType,
110
+ routeState,
111
+ route: props.route,
112
+ navigator,
113
+ 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 = resolveNavigationPlugin({
135
+ category: "menu",
136
+ navigations,
137
+ plugins,
138
+ }) as QuickBrickPlugin;
139
+
140
+ const NavBar = (props.Components.NavBar ||
141
+ menuPlugin.module) as React.ComponentType<any>;
142
+
143
+ const isNavBarVisible = !isPlayer(routeState);
144
+
145
+ const screenData =
146
+ screenType === "hooks"
147
+ ? routeState?.state?.entry
148
+ : routeState?.state?.screen;
149
+
150
+ return (
151
+ <>
152
+ <NavBarContainer isVisible={isNavBarVisible} onReady={noop}>
153
+ <NavBar
154
+ groupId={props.route}
155
+ isVisible={isNavBarVisible}
156
+ menuPlugin={menuPlugin}
157
+ navigationProps={navigationProps}
158
+ // Maybe activeRiver?
159
+ />
160
+ </NavBarContainer>
161
+ <ScreenResolver
162
+ screenType={screenType}
163
+ screenId={screenId}
164
+ screenData={screenData}
165
+ groupId={props.route}
166
+ />
167
+ </>
168
+ );
169
+ };