@applicaster/zapp-react-native-ui-components 15.0.0-rc.5 → 15.0.0-rc.52
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.
- package/Components/AnimatedInOut/index.tsx +69 -26
- package/Components/Cell/Cell.tsx +8 -3
- package/Components/Cell/FocusableWrapper.tsx +44 -0
- package/Components/Cell/TvOSCellComponent.tsx +101 -19
- package/Components/HandlePlayable/HandlePlayable.tsx +17 -65
- package/Components/HandlePlayable/const.ts +3 -0
- package/Components/HandlePlayable/utils.ts +74 -0
- package/Components/Layout/TV/LayoutBackground.tsx +5 -2
- package/Components/Layout/TV/ScreenContainer.tsx +2 -6
- package/Components/Layout/TV/index.tsx +3 -4
- package/Components/Layout/TV/index.web.tsx +3 -4
- package/Components/LinkHandler/LinkHandler.tsx +2 -2
- package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +16 -1
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +30 -2
- package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +5 -1
- package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +11 -3
- package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +9 -1
- package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +15 -14
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +10 -6
- package/Components/MasterCell/DefaultComponents/Text/index.tsx +8 -8
- package/Components/MasterCell/index.tsx +2 -0
- package/Components/MasterCell/utils/__tests__/resolveColor.test.js +82 -3
- package/Components/MasterCell/utils/index.ts +61 -31
- package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +102 -87
- package/Components/MeasurmentsPortal/__tests__/MeasurementsPortal.test.tsx +355 -0
- package/Components/OfflineHandler/NotificationView/NotificationView.tsx +2 -2
- package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +17 -18
- package/Components/OfflineHandler/__tests__/index.test.tsx +27 -18
- package/Components/PlayerContainer/PlayerContainer.tsx +5 -19
- package/Components/PlayerImageBackground/index.tsx +3 -22
- package/Components/Screen/TV/hooks/useInitialFocus.ts +14 -4
- package/Components/Screen/TV/index.web.tsx +4 -2
- package/Components/Screen/__tests__/Screen.test.tsx +65 -42
- package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +68 -42
- package/Components/Screen/hooks.ts +2 -3
- package/Components/Screen/index.tsx +24 -8
- package/Components/Screen/navigationHandler.ts +49 -24
- package/Components/Screen/orientationHandler.ts +3 -3
- package/Components/ScreenResolver/index.tsx +13 -7
- package/Components/ScreenRevealManager/ScreenRevealManager.ts +40 -8
- package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +86 -69
- package/Components/ScreenRevealManager/utils/index.ts +23 -0
- package/Components/ScreenRevealManager/withScreenRevealManager.tsx +54 -24
- package/Components/Tabs/TV/Tabs.tsx +20 -3
- package/Components/Transitioner/Scene.tsx +15 -2
- package/Components/Transitioner/index.js +3 -3
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +118 -171
- package/Components/VideoModal/ModalAnimation/index.ts +2 -13
- package/Components/VideoModal/ModalAnimation/utils.ts +1 -327
- package/Components/VideoModal/PlayerWrapper.tsx +14 -88
- package/Components/VideoModal/VideoModal.tsx +1 -5
- package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -0
- package/Components/VideoModal/hooks/useModalSize.ts +10 -5
- package/Components/VideoModal/playerWrapperStyle.ts +70 -0
- package/Components/VideoModal/playerWrapperUtils.ts +91 -0
- package/Components/VideoModal/utils.ts +19 -9
- package/Decorators/Analytics/index.tsx +6 -5
- package/Decorators/ZappPipesDataConnector/index.tsx +2 -2
- package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +1 -1
- package/Helpers/DataSourceHelper/__tests__/itemLimitForData.test.ts +80 -0
- package/Helpers/DataSourceHelper/index.ts +19 -0
- package/index.d.ts +7 -0
- package/package.json +6 -5
- package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +0 -60
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +0 -417
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +0 -294
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +0 -176
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +0 -93
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +0 -500
- package/Components/VideoModal/ModalAnimation/__tests__/getMoveUpValue.test.ts +0 -108
- package/Helpers/DataSourceHelper/index.js +0 -19
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
|
|
18
18
|
import { TVEventHandlerComponent } from "@applicaster/zapp-react-native-tvos-ui-components/Components/TVEventHandlerComponent";
|
|
19
19
|
import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
|
|
20
|
-
|
|
20
|
+
|
|
21
21
|
import {
|
|
22
22
|
useBackHandler,
|
|
23
23
|
useNavigation,
|
|
@@ -56,15 +56,11 @@ import { toNumber } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
|
56
56
|
import { usePlayNextOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayNextOverlay";
|
|
57
57
|
import { PlayNextState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/OverlayObserver/OverlaysObserver";
|
|
58
58
|
|
|
59
|
-
import {
|
|
60
|
-
PlayerAnimationStateEnum,
|
|
61
|
-
useModalAnimationContext,
|
|
62
|
-
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
63
|
-
|
|
64
59
|
import {
|
|
65
60
|
PlayerNativeCommandTypes,
|
|
66
61
|
PlayerNativeSendCommand,
|
|
67
62
|
} from "@applicaster/zapp-react-native-utils/appUtils/playerManager/playerNativeCommand";
|
|
63
|
+
import { useAppData } from "@applicaster/zapp-react-native-redux";
|
|
68
64
|
|
|
69
65
|
type Props = {
|
|
70
66
|
Player: React.ComponentType<any>;
|
|
@@ -243,14 +239,11 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
243
239
|
const [isLoadingNextVideo, setIsLoadingNextVideo] = React.useState(false);
|
|
244
240
|
|
|
245
241
|
const navigator = useNavigation();
|
|
246
|
-
const {
|
|
242
|
+
const { isTabletPortrait } = useAppData();
|
|
247
243
|
const prevItemId = usePrevious(item?.id);
|
|
248
244
|
const screenData = useTargetScreenData(item);
|
|
249
245
|
const { setVisible: showNavBar } = useSetNavbarState();
|
|
250
246
|
|
|
251
|
-
const { isActiveGesture, startComponentsAnimation, setPlayerAnimationState } =
|
|
252
|
-
useModalAnimationContext();
|
|
253
|
-
|
|
254
247
|
const playerEvent = (event, ...args) => {
|
|
255
248
|
playerManager.invokeHandler(event, ...args);
|
|
256
249
|
};
|
|
@@ -482,8 +475,6 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
482
475
|
if (isModal && mode === VideoModalMode.MAXIMIZED) {
|
|
483
476
|
if (disableMiniPlayer) {
|
|
484
477
|
navigator.closeVideoModal();
|
|
485
|
-
} else {
|
|
486
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
|
|
487
478
|
}
|
|
488
479
|
}
|
|
489
480
|
|
|
@@ -680,16 +671,12 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
680
671
|
autoplay={true}
|
|
681
672
|
controls={false}
|
|
682
673
|
disableCastAction={disableCastAction}
|
|
683
|
-
docked={
|
|
684
|
-
navigator.isVideoModalDocked() &&
|
|
685
|
-
!startComponentsAnimation &&
|
|
686
|
-
!isActiveGesture
|
|
687
|
-
}
|
|
674
|
+
docked={navigator.isVideoModalDocked()}
|
|
688
675
|
entry={item}
|
|
689
676
|
fullscreen={mode === VideoModalMode.FULLSCREEN}
|
|
690
677
|
inline={inline}
|
|
691
678
|
isModal={isModal}
|
|
692
|
-
isTabletPortrait={
|
|
679
|
+
isTabletPortrait={isTabletPortrait}
|
|
693
680
|
muted={false}
|
|
694
681
|
playableItem={item}
|
|
695
682
|
playerEvent={playerEvent}
|
|
@@ -702,7 +689,6 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
702
689
|
setNextVideoPreloadThresholdPercentage={
|
|
703
690
|
setNextVideoPreloadThresholdPercentage
|
|
704
691
|
}
|
|
705
|
-
startComponentsAnimation={startComponentsAnimation}
|
|
706
692
|
>
|
|
707
693
|
{renderApplePlayer(applePlayerProps)}
|
|
708
694
|
</Player>
|
|
@@ -2,12 +2,6 @@ import React, { PropsWithChildren } from "react";
|
|
|
2
2
|
import { ImageBackground, View } from "react-native";
|
|
3
3
|
|
|
4
4
|
import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
|
|
5
|
-
import {
|
|
6
|
-
AnimationComponent,
|
|
7
|
-
ComponentAnimationType,
|
|
8
|
-
useModalAnimationContext,
|
|
9
|
-
PlayerAnimationStateEnum,
|
|
10
|
-
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
11
5
|
|
|
12
6
|
type Props = PropsWithChildren<{
|
|
13
7
|
entry: ZappEntry;
|
|
@@ -25,30 +19,17 @@ const PlayerImageBackgroundComponent = ({
|
|
|
25
19
|
style,
|
|
26
20
|
imageStyle,
|
|
27
21
|
imageKey,
|
|
28
|
-
defaultImageDimensions,
|
|
29
22
|
}: Props) => {
|
|
30
23
|
const source = React.useMemo(
|
|
31
24
|
() => ({ uri: imageSrcFromMediaItem(entry, [imageKey]) }),
|
|
32
25
|
[imageKey, entry]
|
|
33
26
|
);
|
|
34
27
|
|
|
35
|
-
const { playerAnimationState } = useModalAnimationContext();
|
|
36
|
-
|
|
37
28
|
if (!source) return <>{children}</>;
|
|
38
29
|
|
|
39
30
|
return (
|
|
40
|
-
<View
|
|
41
|
-
style={
|
|
42
|
-
playerAnimationState === PlayerAnimationStateEnum.maximize
|
|
43
|
-
? defaultImageDimensions
|
|
44
|
-
: style
|
|
45
|
-
}
|
|
46
|
-
>
|
|
47
|
-
<AnimationComponent
|
|
48
|
-
style={style}
|
|
49
|
-
animationType={ComponentAnimationType.player}
|
|
50
|
-
additionalData={defaultImageDimensions}
|
|
51
|
-
>
|
|
31
|
+
<View style={style}>
|
|
32
|
+
<View style={style}>
|
|
52
33
|
<ImageBackground
|
|
53
34
|
resizeMode="cover"
|
|
54
35
|
style={imageSize}
|
|
@@ -57,7 +38,7 @@ const PlayerImageBackgroundComponent = ({
|
|
|
57
38
|
>
|
|
58
39
|
{children}
|
|
59
40
|
</ImageBackground>
|
|
60
|
-
</
|
|
41
|
+
</View>
|
|
61
42
|
</View>
|
|
62
43
|
);
|
|
63
44
|
};
|
|
@@ -10,6 +10,8 @@ import {
|
|
|
10
10
|
setFocusOnMenu,
|
|
11
11
|
} from "@applicaster/zapp-react-native-utils/appUtils/focusManagerAux";
|
|
12
12
|
|
|
13
|
+
import { waitUntilScreenRevealManagerIsReady } from "@applicaster/zapp-react-native-ui-components/Components/ScreenRevealManager/utils";
|
|
14
|
+
|
|
13
15
|
type Return =
|
|
14
16
|
| {
|
|
15
17
|
onContent: true;
|
|
@@ -57,14 +59,22 @@ export const useInitialFocus = (): void => {
|
|
|
57
59
|
React.useEffect(() => {
|
|
58
60
|
const initialFocus = getInitialFocus(focusOnContent, isNavBarVisible);
|
|
59
61
|
|
|
60
|
-
if (initialFocus.
|
|
61
|
-
|
|
62
|
+
if (initialFocus.onMenu) {
|
|
63
|
+
setFocusOnMenu(currentRoute);
|
|
62
64
|
|
|
63
65
|
return;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
|
-
if (initialFocus.
|
|
67
|
-
|
|
68
|
+
if (initialFocus.onContent) {
|
|
69
|
+
const subscription = waitUntilScreenRevealManagerIsReady().subscribe(
|
|
70
|
+
() => {
|
|
71
|
+
setFocusOnContent(currentRoute);
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
return () => {
|
|
76
|
+
subscription.unsubscribe();
|
|
77
|
+
};
|
|
68
78
|
}
|
|
69
79
|
}, []);
|
|
70
80
|
};
|
|
@@ -9,9 +9,10 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
useIsScreenActive,
|
|
11
11
|
useNavigation,
|
|
12
|
+
useRivers,
|
|
12
13
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
13
14
|
import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
|
|
14
|
-
import {
|
|
15
|
+
import { usePlugins } from "@applicaster/zapp-react-native-redux/hooks";
|
|
15
16
|
import {
|
|
16
17
|
useNavbarState,
|
|
17
18
|
useScreenBackgroundColor,
|
|
@@ -102,7 +103,8 @@ export const Screen = ({ route, Components }: Props) => {
|
|
|
102
103
|
}
|
|
103
104
|
|
|
104
105
|
const navigator = useNavigation();
|
|
105
|
-
const
|
|
106
|
+
const plugins = usePlugins();
|
|
107
|
+
const rivers = useRivers();
|
|
106
108
|
|
|
107
109
|
const pathAttributes = getPathAttributes({ pathname: route });
|
|
108
110
|
const routeState = navigator.getStackForPathname(route);
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { View } from "react-native";
|
|
3
|
-
import {
|
|
3
|
+
import { renderWithProviders } from "@applicaster/zapp-react-native-utils/testUtils";
|
|
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
9
|
const mockIsOrientationCompatible = jest.fn(() => true);
|
|
14
10
|
|
|
15
11
|
jest.mock("react-native-safe-area-context", () => ({
|
|
12
|
+
...jest.requireActual("react-native-safe-area-context"),
|
|
16
13
|
useSafeAreaInsets: () => ({ top: 44 }),
|
|
17
14
|
}));
|
|
18
15
|
|
|
@@ -35,12 +32,14 @@ jest.mock(
|
|
|
35
32
|
);
|
|
36
33
|
|
|
37
34
|
jest.mock("@applicaster/zapp-react-native-utils/analyticsUtils", () => ({
|
|
35
|
+
...jest.requireActual("@applicaster/zapp-react-native-utils/analyticsUtils"),
|
|
38
36
|
useAnalytics: jest.fn(() => ({
|
|
39
37
|
sendScreenEvent: jest.fn(),
|
|
40
38
|
})),
|
|
41
39
|
}));
|
|
42
40
|
|
|
43
41
|
jest.mock("@applicaster/zapp-react-native-utils/theme", () => ({
|
|
42
|
+
...jest.requireActual("@applicaster/zapp-react-native-utils/theme"),
|
|
44
43
|
useTheme: jest.fn(() => ({
|
|
45
44
|
app_background_color: "blue",
|
|
46
45
|
})),
|
|
@@ -77,21 +76,44 @@ jest.mock(
|
|
|
77
76
|
})
|
|
78
77
|
);
|
|
79
78
|
|
|
80
|
-
jest.mock(
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
})
|
|
94
|
-
|
|
79
|
+
jest.mock(
|
|
80
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation",
|
|
81
|
+
() => ({
|
|
82
|
+
...jest.requireActual(
|
|
83
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation"
|
|
84
|
+
),
|
|
85
|
+
useNavigation: jest.fn(() => ({
|
|
86
|
+
canGoBack: () => false,
|
|
87
|
+
currentRoute: "/river/testId",
|
|
88
|
+
activeRiver: { id: "testId" },
|
|
89
|
+
screenData: { id: "testId" },
|
|
90
|
+
data: { screen: { id: "testId" } },
|
|
91
|
+
})),
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
|
|
95
|
+
jest.mock(
|
|
96
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive",
|
|
97
|
+
() => ({
|
|
98
|
+
...jest.requireActual(
|
|
99
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useIsScreenActive"
|
|
100
|
+
),
|
|
101
|
+
useIsScreenActive: jest.fn().mockReturnValue(true),
|
|
102
|
+
})
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
jest.mock(
|
|
106
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute",
|
|
107
|
+
() => ({
|
|
108
|
+
...jest.requireActual(
|
|
109
|
+
"@applicaster/zapp-react-native-utils/reactHooks/navigation/useRoute"
|
|
110
|
+
),
|
|
111
|
+
useRoute: jest.fn(() => ({
|
|
112
|
+
pathname: "/river/testId",
|
|
113
|
+
screenData: { id: "testId" },
|
|
114
|
+
})),
|
|
115
|
+
})
|
|
116
|
+
);
|
|
95
117
|
|
|
96
118
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
97
119
|
...jest.requireActual("@applicaster/zapp-react-native-utils/reactHooks"),
|
|
@@ -112,26 +134,6 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
|
112
134
|
useIsTablet: jest.fn(() => false),
|
|
113
135
|
}));
|
|
114
136
|
|
|
115
|
-
jest.mock("@applicaster/zapp-react-native-redux/hooks", () => {
|
|
116
|
-
const View = jest.requireActual("react-native").View;
|
|
117
|
-
|
|
118
|
-
return {
|
|
119
|
-
...jest.requireActual("@applicaster/zapp-react-native-redux/hooks"),
|
|
120
|
-
usePickFromState: () => ({
|
|
121
|
-
plugins: [
|
|
122
|
-
{
|
|
123
|
-
name: "Offline Plugin",
|
|
124
|
-
identifier: "offline-experience",
|
|
125
|
-
type: "general",
|
|
126
|
-
module: {
|
|
127
|
-
OfflineFallbackScreen: ({ children }) => <View>{children}</View>, // eslint-disable-line
|
|
128
|
-
},
|
|
129
|
-
},
|
|
130
|
-
],
|
|
131
|
-
}),
|
|
132
|
-
};
|
|
133
|
-
});
|
|
134
|
-
|
|
135
137
|
const {
|
|
136
138
|
allowedOrientationsForScreen,
|
|
137
139
|
getOrientation,
|
|
@@ -151,6 +153,19 @@ const screenProps = {
|
|
|
151
153
|
|
|
152
154
|
const { Screen } = require("..");
|
|
153
155
|
|
|
156
|
+
const store = {
|
|
157
|
+
plugins: [
|
|
158
|
+
{
|
|
159
|
+
name: "Offline Plugin",
|
|
160
|
+
identifier: "offline-experience",
|
|
161
|
+
type: "general",
|
|
162
|
+
module: {
|
|
163
|
+
OfflineFallbackScreen: ({ children }) => <View>{children}</View>, // eslint-disable-line
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
};
|
|
168
|
+
|
|
154
169
|
describe("<Screen Component />", () => {
|
|
155
170
|
beforeEach(() => {
|
|
156
171
|
allowedOrientationsForScreen.mockClear();
|
|
@@ -160,14 +175,22 @@ describe("<Screen Component />", () => {
|
|
|
160
175
|
|
|
161
176
|
describe("when the navbar should show", () => {
|
|
162
177
|
it("renders correctly", () => {
|
|
163
|
-
const { toJSON } =
|
|
178
|
+
const { toJSON } = renderWithProviders(
|
|
179
|
+
<Screen {...screenProps} />,
|
|
180
|
+
store
|
|
181
|
+
);
|
|
182
|
+
|
|
164
183
|
expect(toJSON()).toMatchSnapshot();
|
|
165
184
|
});
|
|
166
185
|
});
|
|
167
186
|
|
|
168
187
|
describe("when the navbar should be hidden", () => {
|
|
169
188
|
it("renders correctly", () => {
|
|
170
|
-
const { toJSON } =
|
|
189
|
+
const { toJSON } = renderWithProviders(
|
|
190
|
+
<Screen {...screenProps} />,
|
|
191
|
+
store
|
|
192
|
+
);
|
|
193
|
+
|
|
171
194
|
expect(toJSON()).toMatchSnapshot();
|
|
172
195
|
});
|
|
173
196
|
});
|
|
@@ -1,65 +1,91 @@
|
|
|
1
1
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
2
|
|
|
3
3
|
exports[`<Screen Component /> when the navbar should be hidden renders correctly 1`] = `
|
|
4
|
-
<
|
|
4
|
+
<RNCSafeAreaProvider
|
|
5
|
+
onInsetsChange={[Function]}
|
|
5
6
|
style={
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"flex": 1,
|
|
10
|
+
},
|
|
11
|
+
undefined,
|
|
12
|
+
]
|
|
11
13
|
}
|
|
12
14
|
>
|
|
13
15
|
<View
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
16
|
+
importantForAccessibility="yes"
|
|
17
|
+
style={
|
|
18
|
+
{
|
|
19
|
+
"backgroundColor": "blue",
|
|
20
|
+
"flex": 1,
|
|
21
|
+
"paddingTop": 0,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
>
|
|
22
25
|
<View
|
|
26
|
+
hasMenu={false}
|
|
27
|
+
id="/river/testId"
|
|
23
28
|
pathname="/river/testId"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
testID="routeManager"
|
|
29
|
+
selected="testId"
|
|
30
|
+
testID="navBar"
|
|
31
|
+
title="Test Title"
|
|
30
32
|
/>
|
|
33
|
+
<View>
|
|
34
|
+
<View
|
|
35
|
+
pathname="/river/testId"
|
|
36
|
+
screenData={
|
|
37
|
+
{
|
|
38
|
+
"id": "testId",
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
testID="routeManager"
|
|
42
|
+
/>
|
|
43
|
+
</View>
|
|
31
44
|
</View>
|
|
32
|
-
</
|
|
45
|
+
</RNCSafeAreaProvider>
|
|
33
46
|
`;
|
|
34
47
|
|
|
35
48
|
exports[`<Screen Component /> when the navbar should show renders correctly 1`] = `
|
|
36
|
-
<
|
|
49
|
+
<RNCSafeAreaProvider
|
|
50
|
+
onInsetsChange={[Function]}
|
|
37
51
|
style={
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
52
|
+
[
|
|
53
|
+
{
|
|
54
|
+
"flex": 1,
|
|
55
|
+
},
|
|
56
|
+
undefined,
|
|
57
|
+
]
|
|
43
58
|
}
|
|
44
59
|
>
|
|
45
60
|
<View
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
61
|
+
importantForAccessibility="yes"
|
|
62
|
+
style={
|
|
63
|
+
{
|
|
64
|
+
"backgroundColor": "blue",
|
|
65
|
+
"flex": 1,
|
|
66
|
+
"paddingTop": 0,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
>
|
|
54
70
|
<View
|
|
71
|
+
hasMenu={false}
|
|
72
|
+
id="/river/testId"
|
|
55
73
|
pathname="/river/testId"
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
testID="routeManager"
|
|
74
|
+
selected="testId"
|
|
75
|
+
testID="navBar"
|
|
76
|
+
title="Test Title"
|
|
62
77
|
/>
|
|
78
|
+
<View>
|
|
79
|
+
<View
|
|
80
|
+
pathname="/river/testId"
|
|
81
|
+
screenData={
|
|
82
|
+
{
|
|
83
|
+
"id": "testId",
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
testID="routeManager"
|
|
87
|
+
/>
|
|
88
|
+
</View>
|
|
63
89
|
</View>
|
|
64
|
-
</
|
|
90
|
+
</RNCSafeAreaProvider>
|
|
65
91
|
`;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useAppData } from "@applicaster/zapp-react-native-redux/hooks";
|
|
2
2
|
import {
|
|
3
3
|
useGetScreenOrientation,
|
|
4
4
|
isOrientationCompatible,
|
|
@@ -25,8 +25,7 @@ export const useWaitForValidOrientation = () => {
|
|
|
25
25
|
|
|
26
26
|
const isTablet = useIsTablet();
|
|
27
27
|
|
|
28
|
-
const {
|
|
29
|
-
const isTabletPortrait = appData?.isTabletPortrait;
|
|
28
|
+
const { isTabletPortrait } = useAppData();
|
|
30
29
|
|
|
31
30
|
const layoutData = useMemo(
|
|
32
31
|
() => ({ isTablet, isTabletPortrait, width: screenWidth, height }),
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/// <reference types="@applicaster/applicaster-types" />
|
|
2
2
|
import React from "react";
|
|
3
|
-
import { View } from "react-native";
|
|
4
|
-
import {
|
|
5
|
-
|
|
3
|
+
import { AccessibilityInfo, findNodeHandle, View } from "react-native";
|
|
4
|
+
import { usePlugins } from "@applicaster/zapp-react-native-redux/hooks";
|
|
6
5
|
import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
7
6
|
import { getComponentModule } from "@applicaster/zapp-react-native-utils/pluginUtils";
|
|
8
7
|
import {
|
|
@@ -12,6 +11,7 @@ import {
|
|
|
12
11
|
} from "@applicaster/zapp-react-native-utils/navigationUtils";
|
|
13
12
|
import {
|
|
14
13
|
useCurrentScreenData,
|
|
14
|
+
useIsScreenActive,
|
|
15
15
|
useNavbarState,
|
|
16
16
|
useNavigation,
|
|
17
17
|
useRoute,
|
|
@@ -40,7 +40,7 @@ type Props = {
|
|
|
40
40
|
export function Screen(_props: Props) {
|
|
41
41
|
const theme = useTheme<BaseThemePropertiesMobile>();
|
|
42
42
|
const navigation = useNavigation();
|
|
43
|
-
const
|
|
43
|
+
const plugins = usePlugins();
|
|
44
44
|
|
|
45
45
|
// Gets the data for the current screen configuration
|
|
46
46
|
const currentScreenData = useCurrentScreenData();
|
|
@@ -57,8 +57,8 @@ export function Screen(_props: Props) {
|
|
|
57
57
|
const hasMenu = shouldNavBarDisplayMenu(currentRiver, plugins);
|
|
58
58
|
|
|
59
59
|
const navBarProps = React.useMemo<MobileNavBarPluginProps | null>(
|
|
60
|
-
getNavBarProps(currentRiver, pathname, title),
|
|
61
|
-
[currentRiver, pathname]
|
|
60
|
+
() => getNavBarProps(currentRiver, pathname, title),
|
|
61
|
+
[currentRiver, pathname, title]
|
|
62
62
|
);
|
|
63
63
|
|
|
64
64
|
const NavBar = React.useMemo(
|
|
@@ -89,13 +89,29 @@ export function Screen(_props: Props) {
|
|
|
89
89
|
[theme.app_background_color, backgroundColor]
|
|
90
90
|
);
|
|
91
91
|
|
|
92
|
-
|
|
92
|
+
const isActive = useIsScreenActive();
|
|
93
|
+
|
|
94
|
+
const ref = React.useRef(null);
|
|
93
95
|
const isReady = useWaitForValidOrientation();
|
|
94
96
|
|
|
97
|
+
React.useEffect(() => {
|
|
98
|
+
if (ref.current && isActive && isReady) {
|
|
99
|
+
const nodeHandle = findNodeHandle(ref.current);
|
|
100
|
+
|
|
101
|
+
if (nodeHandle != null) {
|
|
102
|
+
AccessibilityInfo.setAccessibilityFocus(nodeHandle);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}, [isActive, isReady]);
|
|
106
|
+
|
|
95
107
|
// We prevent rendering of the screen until UI is actually rotated to screen desired orientation.
|
|
96
108
|
// This saves unnecessary re-renders and user will not see distorted aspect screen.
|
|
97
109
|
return (
|
|
98
|
-
<View
|
|
110
|
+
<View
|
|
111
|
+
ref={ref}
|
|
112
|
+
style={style}
|
|
113
|
+
importantForAccessibility={!isActive ? "no-hide-descendants" : "yes"}
|
|
114
|
+
>
|
|
99
115
|
{isReady ? (
|
|
100
116
|
<>
|
|
101
117
|
{navBarProps ? <NavBar {...navBarProps} hasMenu={hasMenu} /> : null}
|
|
@@ -1,35 +1,19 @@
|
|
|
1
1
|
import { resolveNavigationPlugin } from "@applicaster/zapp-react-native-utils/navigationUtils";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
*
|
|
10
|
-
* - playable screens
|
|
11
|
-
* - qb_search_screen
|
|
12
|
-
* - screen hooks that specify showNavBar or presentFullScreen
|
|
13
|
-
* - screens or nested screens that have allow_screen_plugin_presentation set to true
|
|
14
|
-
*
|
|
15
|
-
* @param {String} route current route of the screen
|
|
16
|
-
* @param {Object} screenData payload associated with the currently presented screen
|
|
17
|
-
* @returns {Boolean}
|
|
18
|
-
*/
|
|
19
|
-
export function isMenuVisible(route, screenData, plugins) {
|
|
20
|
-
const plugin = resolveNavigationPlugin({
|
|
3
|
+
export const BOTTOM_TABS_PLUGIN_ID = "quick-brick-bottom-tabs";
|
|
4
|
+
|
|
5
|
+
export const SIDE_MENU_PLUGIN_ID = "quick_brick_side_menu";
|
|
6
|
+
|
|
7
|
+
export function getMenuPlugin(screenData, plugins) {
|
|
8
|
+
return resolveNavigationPlugin({
|
|
21
9
|
category: "menu",
|
|
22
10
|
navigations:
|
|
23
11
|
screenData?.navigations || screenData?.targetScreen?.navigations,
|
|
24
12
|
plugins,
|
|
25
13
|
});
|
|
14
|
+
}
|
|
26
15
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
if (!isBottomTabsPlugin) {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
|
|
16
|
+
function shouldShowNavigation(route, screenData) {
|
|
33
17
|
if (route.includes("playable")) {
|
|
34
18
|
return false;
|
|
35
19
|
}
|
|
@@ -56,3 +40,44 @@ export function isMenuVisible(route, screenData, plugins) {
|
|
|
56
40
|
|
|
57
41
|
return true;
|
|
58
42
|
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* This function helps to decide whether the menu should be presented on the screen
|
|
46
|
+
* based on route and / or screen Data
|
|
47
|
+
*
|
|
48
|
+
* is similar to the navbar, except that it covers scenarios where only the navbar (and not)
|
|
49
|
+
* the menu will be hidden
|
|
50
|
+
*
|
|
51
|
+
* - playable screens
|
|
52
|
+
* - qb_search_screen
|
|
53
|
+
* - screen hooks that specify showNavBar or presentFullScreen
|
|
54
|
+
* - screens or nested screens that have allow_screen_plugin_presentation set to true
|
|
55
|
+
*
|
|
56
|
+
* @param {String} route current route of the screen
|
|
57
|
+
* @param {Object} screenData payload associated with the currently presented screen
|
|
58
|
+
* @returns {Boolean}
|
|
59
|
+
*/
|
|
60
|
+
export function isMenuVisible(route, screenData, plugins) {
|
|
61
|
+
const plugin = getMenuPlugin(screenData, plugins);
|
|
62
|
+
|
|
63
|
+
const isBottomTabsPlugin = plugin?.identifier === BOTTOM_TABS_PLUGIN_ID;
|
|
64
|
+
const isSideMenuPlugin = plugin?.identifier === SIDE_MENU_PLUGIN_ID;
|
|
65
|
+
|
|
66
|
+
if (!isBottomTabsPlugin && !isSideMenuPlugin) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return shouldShowNavigation(route, screenData);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function isBottomTabVisible(route, screenData, plugins) {
|
|
74
|
+
const plugin = getMenuPlugin(screenData, plugins);
|
|
75
|
+
|
|
76
|
+
const isBottomTabsPlugin = plugin?.identifier === BOTTOM_TABS_PLUGIN_ID;
|
|
77
|
+
|
|
78
|
+
if (!isBottomTabsPlugin) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return shouldShowNavigation(route, screenData);
|
|
83
|
+
}
|