@applicaster/zapp-react-native-ui-components 15.0.0-alpha.3514407021 → 15.0.0-alpha.3752284136
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/BaseFocusable/index.ios.ts +12 -2
- package/Components/Cell/Cell.tsx +8 -3
- package/Components/Cell/FocusableWrapper.tsx +3 -0
- package/Components/Cell/TvOSCellComponent.tsx +26 -5
- package/Components/Focusable/Focusable.tsx +4 -2
- package/Components/Focusable/FocusableTvOS.tsx +18 -1
- package/Components/Focusable/__tests__/__snapshots__/FocusableTvOS.test.tsx.snap +1 -0
- package/Components/FocusableGroup/FocusableTvOS.tsx +32 -1
- package/Components/GeneralContentScreen/utils/useCurationAPI.ts +14 -3
- 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 +51 -55
- package/Components/PlayerContainer/useRestrictMobilePlayback.tsx +101 -0
- package/Components/PlayerImageBackground/index.tsx +3 -22
- package/Components/River/TV/River.tsx +31 -14
- package/Components/River/TV/index.tsx +8 -4
- package/Components/River/TV/utils/__tests__/toStringOrEmpty.test.ts +30 -0
- package/Components/River/TV/utils/index.ts +4 -0
- package/Components/River/TV/withFocusableGroupForContent.tsx +71 -0
- 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 -44
- package/Components/Screen/hooks.ts +2 -3
- package/Components/Screen/index.tsx +2 -3
- 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/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/ConfigurationWrapper/__tests__/__snapshots__/withConfigurationProvider.test.tsx.snap +1 -0
- package/Decorators/ConfigurationWrapper/const.ts +1 -0
- package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +1 -1
- 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/River/TV/withTVEventHandler.tsx +0 -27
- 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
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { View, StyleSheet } from "react-native";
|
|
3
|
+
|
|
4
|
+
import { FocusableGroup } from "@applicaster/zapp-react-native-ui-components/Components/FocusableGroup";
|
|
5
|
+
import { riverFocusManager } from "@applicaster/zapp-react-native-utils/appUtils/RiverFocusManager";
|
|
6
|
+
|
|
7
|
+
import { topMenuLayoutChange$ } from "@applicaster/zapp-react-native-tvos-app/Layout/topMenu";
|
|
8
|
+
|
|
9
|
+
const styles = StyleSheet.create({
|
|
10
|
+
flexOne: {
|
|
11
|
+
flex: 1,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export const withFocusableGroupForContent = (Component) => {
|
|
16
|
+
return function WithFocusableGroupForContent(props) {
|
|
17
|
+
const { screenId, isInsideContainer } = props;
|
|
18
|
+
|
|
19
|
+
const [topMenuHeight, setTopMenuHeight] = React.useState(0);
|
|
20
|
+
|
|
21
|
+
React.useEffect(() => {
|
|
22
|
+
const subscription = topMenuLayoutChange$.subscribe((layout) => {
|
|
23
|
+
setTopMenuHeight(layout.height);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
return () => {
|
|
27
|
+
subscription.unsubscribe();
|
|
28
|
+
};
|
|
29
|
+
}, []);
|
|
30
|
+
|
|
31
|
+
const focusableId = React.useMemo(
|
|
32
|
+
() =>
|
|
33
|
+
riverFocusManager.screenFocusableGroupId({
|
|
34
|
+
screenId,
|
|
35
|
+
isInsideContainer,
|
|
36
|
+
}),
|
|
37
|
+
[screenId, isInsideContainer]
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
if (isInsideContainer) {
|
|
41
|
+
return <Component {...props} />;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<FocusableGroup
|
|
46
|
+
key={focusableId}
|
|
47
|
+
id={focusableId}
|
|
48
|
+
// The top menu is rendered in its own FocusableGroup, anchored at the top of the screen.
|
|
49
|
+
// When the "content" FocusableGroup starts at y = 0 as well, the two groups visually overlap.
|
|
50
|
+
// On TvOS platform this overlap can confuse the focus engine, because the focusable bounds of
|
|
51
|
+
// the top-menu group and the content group intersect, leading to erratic navigation between
|
|
52
|
+
// the menu and the content (e.g. unexpected jumps or focus getting "stuck").
|
|
53
|
+
//
|
|
54
|
+
// To avoid this, we shift the entire content FocusableGroup down by the dynamic top menu
|
|
55
|
+
// height (marginTop: topMenuHeight). This separates the focus regions of the two groups in
|
|
56
|
+
// focus space, so they no longer intersect.
|
|
57
|
+
//
|
|
58
|
+
// The inner <View> below then applies the inverse margin (marginTop: -topMenuHeight) so that
|
|
59
|
+
// the actual visual position of the content on screen does not change; only the focusable
|
|
60
|
+
// bounds of the outer group are offset.
|
|
61
|
+
style={[styles.flexOne, { marginTop: topMenuHeight }]}
|
|
62
|
+
// this group does not have parent
|
|
63
|
+
groupId={undefined}
|
|
64
|
+
>
|
|
65
|
+
<View style={[styles.flexOne, { marginTop: -1 * topMenuHeight }]}>
|
|
66
|
+
<Component {...props} groupId={focusableId} />
|
|
67
|
+
</View>
|
|
68
|
+
</FocusableGroup>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
};
|
|
@@ -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,67 +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
|
-
<
|
|
5
|
-
|
|
4
|
+
<RNCSafeAreaProvider
|
|
5
|
+
onInsetsChange={[Function]}
|
|
6
6
|
style={
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"flex": 1,
|
|
10
|
+
},
|
|
11
|
+
undefined,
|
|
12
|
+
]
|
|
12
13
|
}
|
|
13
14
|
>
|
|
14
15
|
<View
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
16
|
+
importantForAccessibility="yes"
|
|
17
|
+
style={
|
|
18
|
+
{
|
|
19
|
+
"backgroundColor": "blue",
|
|
20
|
+
"flex": 1,
|
|
21
|
+
"paddingTop": 0,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
>
|
|
23
25
|
<View
|
|
26
|
+
hasMenu={false}
|
|
27
|
+
id="/river/testId"
|
|
24
28
|
pathname="/river/testId"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
testID="routeManager"
|
|
29
|
+
selected="testId"
|
|
30
|
+
testID="navBar"
|
|
31
|
+
title="Test Title"
|
|
31
32
|
/>
|
|
33
|
+
<View>
|
|
34
|
+
<View
|
|
35
|
+
pathname="/river/testId"
|
|
36
|
+
screenData={
|
|
37
|
+
{
|
|
38
|
+
"id": "testId",
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
testID="routeManager"
|
|
42
|
+
/>
|
|
43
|
+
</View>
|
|
32
44
|
</View>
|
|
33
|
-
</
|
|
45
|
+
</RNCSafeAreaProvider>
|
|
34
46
|
`;
|
|
35
47
|
|
|
36
48
|
exports[`<Screen Component /> when the navbar should show renders correctly 1`] = `
|
|
37
|
-
<
|
|
38
|
-
|
|
49
|
+
<RNCSafeAreaProvider
|
|
50
|
+
onInsetsChange={[Function]}
|
|
39
51
|
style={
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
[
|
|
53
|
+
{
|
|
54
|
+
"flex": 1,
|
|
55
|
+
},
|
|
56
|
+
undefined,
|
|
57
|
+
]
|
|
45
58
|
}
|
|
46
59
|
>
|
|
47
60
|
<View
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
61
|
+
importantForAccessibility="yes"
|
|
62
|
+
style={
|
|
63
|
+
{
|
|
64
|
+
"backgroundColor": "blue",
|
|
65
|
+
"flex": 1,
|
|
66
|
+
"paddingTop": 0,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
>
|
|
56
70
|
<View
|
|
71
|
+
hasMenu={false}
|
|
72
|
+
id="/river/testId"
|
|
57
73
|
pathname="/river/testId"
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
testID="routeManager"
|
|
74
|
+
selected="testId"
|
|
75
|
+
testID="navBar"
|
|
76
|
+
title="Test Title"
|
|
64
77
|
/>
|
|
78
|
+
<View>
|
|
79
|
+
<View
|
|
80
|
+
pathname="/river/testId"
|
|
81
|
+
screenData={
|
|
82
|
+
{
|
|
83
|
+
"id": "testId",
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
testID="routeManager"
|
|
87
|
+
/>
|
|
88
|
+
</View>
|
|
65
89
|
</View>
|
|
66
|
-
</
|
|
90
|
+
</RNCSafeAreaProvider>
|
|
67
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
3
|
import { AccessibilityInfo, findNodeHandle, View } from "react-native";
|
|
4
|
-
import {
|
|
5
|
-
|
|
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 {
|
|
@@ -41,7 +40,7 @@ type Props = {
|
|
|
41
40
|
export function Screen(_props: Props) {
|
|
42
41
|
const theme = useTheme<BaseThemePropertiesMobile>();
|
|
43
42
|
const navigation = useNavigation();
|
|
44
|
-
const
|
|
43
|
+
const plugins = usePlugins();
|
|
45
44
|
|
|
46
45
|
// Gets the data for the current screen configuration
|
|
47
46
|
const currentScreenData = useCurrentScreenData();
|
|
@@ -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
|
+
}
|
|
@@ -7,7 +7,7 @@ import {
|
|
|
7
7
|
useGetScreenOrientation,
|
|
8
8
|
} from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
|
|
9
9
|
import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
|
|
10
|
-
import {
|
|
10
|
+
import { usePlugins, useAppData } from "@applicaster/zapp-react-native-redux";
|
|
11
11
|
import { findPluginByType } from "@applicaster/zapp-react-native-utils/pluginUtils";
|
|
12
12
|
import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
13
13
|
|
|
@@ -65,8 +65,8 @@ export function useNewOrientationForScreenData({
|
|
|
65
65
|
}: OrientationHookArgs) {
|
|
66
66
|
const isTablet = useIsTablet();
|
|
67
67
|
|
|
68
|
-
const
|
|
69
|
-
const isTabletPortrait =
|
|
68
|
+
const plugins = usePlugins();
|
|
69
|
+
const { isTabletPortrait } = useAppData();
|
|
70
70
|
const isLandscapeTablet = isTablet && !isTabletPortrait;
|
|
71
71
|
|
|
72
72
|
const screenOrientation = useGetScreenOrientation(screenData);
|
|
@@ -11,12 +11,19 @@ import { LinkHandler } from "../LinkHandler";
|
|
|
11
11
|
import { Favorites } from "../Favorites";
|
|
12
12
|
import { ZappPipesScreenContext } from "../../Contexts";
|
|
13
13
|
import { componentsLogger } from "../../Helpers/logger";
|
|
14
|
-
import {
|
|
15
|
-
|
|
14
|
+
import {
|
|
15
|
+
useAppSelector,
|
|
16
|
+
usePlugins,
|
|
17
|
+
} from "@applicaster/zapp-react-native-redux/hooks";
|
|
18
|
+
import {
|
|
19
|
+
useNavigation,
|
|
20
|
+
useRivers,
|
|
21
|
+
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
16
22
|
import { useScreenAnalytics } from "@applicaster/zapp-react-native-utils/analyticsUtils/helpers/hooks";
|
|
17
23
|
|
|
18
24
|
import { useCallbackActions } from "@applicaster/zapp-react-native-utils/zappFrameworkUtils/HookCallback/useCallbackActions";
|
|
19
25
|
import { ScreenResultCallback } from "@applicaster/zapp-react-native-utils/zappFrameworkUtils/HookCallback/callbackNavigationAction";
|
|
26
|
+
import { selectComponents } from "@applicaster/zapp-react-native-redux";
|
|
20
27
|
|
|
21
28
|
const logger = componentsLogger.addSubsystem("ScreenResolver");
|
|
22
29
|
|
|
@@ -49,11 +56,10 @@ export function ScreenResolverComponent(props: Props) {
|
|
|
49
56
|
|
|
50
57
|
const { hookPlugin } = screenData || {};
|
|
51
58
|
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
]);
|
|
59
|
+
const plugins = usePlugins();
|
|
60
|
+
const rivers = useRivers();
|
|
61
|
+
|
|
62
|
+
const components = useAppSelector(selectComponents);
|
|
57
63
|
|
|
58
64
|
const {
|
|
59
65
|
videoModalState: { mode },
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { makeListOf } from "@applicaster/zapp-react-native-utils/arrayUtils";
|
|
2
2
|
import { isFirstComponentGallery } from "@applicaster/zapp-react-native-utils/componentsUtils";
|
|
3
|
-
import {
|
|
3
|
+
import { race, Subject, Subscription } from "rxjs";
|
|
4
|
+
import { first } from "rxjs/operators";
|
|
5
|
+
|
|
6
|
+
import { withTimeout$ } from "@applicaster/zapp-react-native-utils/idleUtils";
|
|
7
|
+
|
|
8
|
+
const MAX_TIMEOUT_TO_WAIT_COMPONENTS_TO_LOAD = 2000; // 2 seconds
|
|
4
9
|
|
|
5
10
|
const INITIAL_NUMBER_TO_LOAD = 3;
|
|
6
11
|
|
|
@@ -34,7 +39,8 @@ const getNumberOfComponentsWaitToLoadBeforePresent = (
|
|
|
34
39
|
export class ScreenRevealManager {
|
|
35
40
|
public numberOfComponentsWaitToLoadBeforePresent: number;
|
|
36
41
|
private renderingState: Array<ComponentLoadingState>;
|
|
37
|
-
private
|
|
42
|
+
private subject$ = new Subject<void>();
|
|
43
|
+
private subscription: Subscription;
|
|
38
44
|
|
|
39
45
|
constructor(componentsToRender: ZappUIComponent[], callback: Callback) {
|
|
40
46
|
this.numberOfComponentsWaitToLoadBeforePresent =
|
|
@@ -45,32 +51,58 @@ export class ScreenRevealManager {
|
|
|
45
51
|
this.numberOfComponentsWaitToLoadBeforePresent
|
|
46
52
|
);
|
|
47
53
|
|
|
48
|
-
this.
|
|
54
|
+
this.subscription = race(
|
|
55
|
+
withTimeout$(MAX_TIMEOUT_TO_WAIT_COMPONENTS_TO_LOAD),
|
|
56
|
+
this.subject$
|
|
57
|
+
)
|
|
58
|
+
.pipe(first())
|
|
59
|
+
.subscribe(callback);
|
|
49
60
|
}
|
|
50
61
|
|
|
51
62
|
onLoadFinished = (index: number): void => {
|
|
63
|
+
const currentState = this.renderingState[index];
|
|
64
|
+
|
|
65
|
+
if (
|
|
66
|
+
COMPONENT_LOADING_STATE.LOADED_WITH_SUCCESS === currentState ||
|
|
67
|
+
COMPONENT_LOADING_STATE.LOADED_WITH_FAILURE === currentState
|
|
68
|
+
) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
52
72
|
this.renderingState[index] = COMPONENT_LOADING_STATE.LOADED_WITH_SUCCESS;
|
|
53
73
|
|
|
54
74
|
if (
|
|
55
75
|
getNumberOfLoaded(this.renderingState) >=
|
|
56
76
|
this.numberOfComponentsWaitToLoadBeforePresent
|
|
57
77
|
) {
|
|
58
|
-
this.
|
|
78
|
+
this.subject$.next();
|
|
79
|
+
this.subject$.complete();
|
|
59
80
|
}
|
|
60
81
|
};
|
|
61
82
|
|
|
62
83
|
onLoadFailed = (index: number): void => {
|
|
84
|
+
const currentState = this.renderingState[index];
|
|
85
|
+
|
|
86
|
+
if (
|
|
87
|
+
COMPONENT_LOADING_STATE.LOADED_WITH_SUCCESS === currentState ||
|
|
88
|
+
COMPONENT_LOADING_STATE.LOADED_WITH_FAILURE === currentState
|
|
89
|
+
) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
|
|
63
93
|
this.renderingState[index] = COMPONENT_LOADING_STATE.LOADED_WITH_FAILURE;
|
|
64
94
|
|
|
65
95
|
if (
|
|
66
96
|
getNumberOfLoaded(this.renderingState) >=
|
|
67
97
|
this.numberOfComponentsWaitToLoadBeforePresent
|
|
68
98
|
) {
|
|
69
|
-
this.
|
|
99
|
+
this.subject$.next();
|
|
100
|
+
this.subject$.complete();
|
|
70
101
|
}
|
|
71
102
|
};
|
|
72
103
|
|
|
73
|
-
|
|
74
|
-
this.
|
|
75
|
-
|
|
104
|
+
dispose(): void {
|
|
105
|
+
this.subscription?.unsubscribe();
|
|
106
|
+
this.subject$.complete();
|
|
107
|
+
}
|
|
76
108
|
}
|