@applicaster/zapp-react-native-ui-components 13.0.0-rc.99 → 14.0.0-alpha.1430213104
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/AudioPlayer/Artwork.tsx +17 -12
- package/Components/AudioPlayer/AudioPlayer.tsx +2 -11
- package/Components/AudioPlayer/AudioPlayerLayout.tsx +9 -9
- package/Components/AudioPlayer/__tests__/__snapshots__/artWork.test.js.snap +9 -4
- package/Components/AudioPlayer/helpers.tsx +0 -2
- package/Components/GeneralContentScreen/GeneralContentScreen.tsx +3 -0
- package/Components/GeneralContentScreen/utils/useCurationAPI.ts +4 -2
- package/Components/GeneralContentScreen/utils/useEventAlerts.ts +30 -0
- package/Components/ModalComponent/BottomSheetModalContent.tsx +32 -46
- package/Components/ModalComponent/Button/index.tsx +25 -29
- package/Components/ModalComponent/Header/index.tsx +9 -8
- package/Components/PlayerContainer/PlayerContainer.tsx +23 -40
- package/Components/River/ComponentsMap/ComponentsMap.tsx +11 -3
- package/Components/River/RiverItem.tsx +6 -2
- package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +7 -1
- package/Components/RouteManager/TestId.tsx +1 -5
- package/Components/RouteManager/__tests__/__snapshots__/routeManager.test.js.snap +0 -1
- package/Components/RouteManager/__tests__/testId.test.js +0 -4
- package/Components/Screen/TV/__tests__/index.web.test.tsx +26 -0
- package/Components/Screen/__tests__/Screen.test.tsx +22 -14
- package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +2 -2
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +1 -2
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +1 -0
- package/Components/VideoModal/ModalAnimation/utils.ts +3 -9
- package/Components/VideoModal/PlayerWrapper.tsx +9 -19
- package/package.json +5 -6
- package/Decorators/Navigator/__tests__/react-router-native-mock.js +0 -11
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { View, Image } from "react-native";
|
|
2
|
+
import { View, Image, StyleSheet } from "react-native";
|
|
3
|
+
import { toNumberWithDefaultZero } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
4
|
+
|
|
5
|
+
const styles = StyleSheet.create({
|
|
6
|
+
container: {
|
|
7
|
+
marginHorizontal: 24,
|
|
8
|
+
},
|
|
9
|
+
image: {
|
|
10
|
+
width: 400,
|
|
11
|
+
height: 400,
|
|
12
|
+
},
|
|
13
|
+
});
|
|
3
14
|
|
|
4
15
|
type Props = {
|
|
5
16
|
srcImage: string;
|
|
@@ -9,25 +20,19 @@ type Props = {
|
|
|
9
20
|
backgroundColor: string;
|
|
10
21
|
backgroundImage: string;
|
|
11
22
|
isRTL: boolean;
|
|
23
|
+
artworkBorderRadius: Option<number>;
|
|
12
24
|
};
|
|
13
25
|
};
|
|
14
26
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
const imageStyles = {
|
|
20
|
-
width: 400,
|
|
21
|
-
height: 400,
|
|
22
|
-
};
|
|
27
|
+
export function Artwork({ srcImage, config }: Props) {
|
|
28
|
+
const borderRadius = toNumberWithDefaultZero(config.artworkBorderRadius);
|
|
23
29
|
|
|
24
|
-
export function Artwork({ srcImage }: Props) {
|
|
25
30
|
return (
|
|
26
|
-
<View style={
|
|
31
|
+
<View style={styles.container}>
|
|
27
32
|
<Image
|
|
28
33
|
fadeDuration={0}
|
|
29
34
|
source={{ uri: srcImage }}
|
|
30
|
-
style={
|
|
35
|
+
style={[styles.image, { borderRadius }]}
|
|
31
36
|
resizeMode="cover"
|
|
32
37
|
/>
|
|
33
38
|
</View>
|
|
@@ -22,8 +22,6 @@ type Props = {
|
|
|
22
22
|
audio_player_title_color?: string;
|
|
23
23
|
audio_player_summary_color?: string;
|
|
24
24
|
audio_player_rtl?: boolean;
|
|
25
|
-
magic_background?: boolean;
|
|
26
|
-
audio_player_background_image_query?: string;
|
|
27
25
|
audio_player_background_image_default_color?: string;
|
|
28
26
|
start_time?: string;
|
|
29
27
|
end_time?: string;
|
|
@@ -34,8 +32,6 @@ type Props = {
|
|
|
34
32
|
audio_player_title_color?: string;
|
|
35
33
|
audio_player_summary_color?: string;
|
|
36
34
|
audio_player_rtl?: string;
|
|
37
|
-
magic_background?: string;
|
|
38
|
-
audio_player_background_image_query?: string;
|
|
39
35
|
audio_player_background_image_default_color?: string;
|
|
40
36
|
audio_player_background_image?: string;
|
|
41
37
|
audio_player_artwork_aspect_ratio?: string;
|
|
@@ -76,11 +72,7 @@ export function AudioPlayer(props: Props) {
|
|
|
76
72
|
const artworkAspectRatio = getProp("audio_player_artwork_aspect_ratio");
|
|
77
73
|
const channelIcon = getProp("audio_player_channel_icon");
|
|
78
74
|
const rtlFlag = getProp("audio_player_rtl");
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
const audioPlayerBackgroundImageQuery = getProp(
|
|
82
|
-
"audio_player_background_image_query"
|
|
83
|
-
);
|
|
75
|
+
const artworkBorderRadius = getProp("audio_player_artwork_border_radius");
|
|
84
76
|
|
|
85
77
|
const audioPlayerBackgroundImageDefaultColor = getProp(
|
|
86
78
|
"audio_player_background_image_default_color"
|
|
@@ -162,9 +154,8 @@ export function AudioPlayer(props: Props) {
|
|
|
162
154
|
runTimeFontSize,
|
|
163
155
|
artworkAspectRatio,
|
|
164
156
|
channelIcon,
|
|
165
|
-
magicBackground,
|
|
166
|
-
audioPlayerBackgroundImageQuery,
|
|
167
157
|
audioPlayerBackgroundImageDefaultColor,
|
|
158
|
+
artworkBorderRadius,
|
|
168
159
|
};
|
|
169
160
|
}, [getProp]);
|
|
170
161
|
|
|
@@ -14,6 +14,7 @@ type Props = {
|
|
|
14
14
|
backgroundColor: string;
|
|
15
15
|
backgroundImage: string;
|
|
16
16
|
isRTL: boolean;
|
|
17
|
+
artworkBorderRadius: Option<number>;
|
|
17
18
|
};
|
|
18
19
|
children: React.ReactNode;
|
|
19
20
|
style: ViewStyle;
|
|
@@ -32,7 +33,7 @@ export function AudioPlayerLayout({ artwork, config, children, style }: Props) {
|
|
|
32
33
|
|
|
33
34
|
const { isRTL, backgroundColor, backgroundImage } = config;
|
|
34
35
|
|
|
35
|
-
const
|
|
36
|
+
const backgroundImageSource = { uri: backgroundImage };
|
|
36
37
|
|
|
37
38
|
const backgroundColorStyle = backgroundImage
|
|
38
39
|
? "transparent"
|
|
@@ -97,15 +98,14 @@ export function AudioPlayerLayout({ artwork, config, children, style }: Props) {
|
|
|
97
98
|
|
|
98
99
|
const backgroundImgStyles = platformSelect({
|
|
99
100
|
tvos: {
|
|
100
|
-
width:
|
|
101
|
-
height:
|
|
101
|
+
width: "100%",
|
|
102
|
+
height: "100%",
|
|
102
103
|
alignItems: "center",
|
|
103
104
|
justifyContent: "center",
|
|
104
105
|
},
|
|
105
106
|
android_tv: {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
height: 1080,
|
|
107
|
+
width: "100%",
|
|
108
|
+
height: "100%",
|
|
109
109
|
alignItems: "center",
|
|
110
110
|
justifyContent: "center",
|
|
111
111
|
},
|
|
@@ -146,9 +146,9 @@ export function AudioPlayerLayout({ artwork, config, children, style }: Props) {
|
|
|
146
146
|
},
|
|
147
147
|
});
|
|
148
148
|
|
|
149
|
-
const audioPlayerLayoutTV =
|
|
149
|
+
const audioPlayerLayoutTV = backgroundImageSource?.uri ? (
|
|
150
150
|
<ImageBackground
|
|
151
|
-
source={
|
|
151
|
+
source={backgroundImageSource}
|
|
152
152
|
style={backgroundImgStyles}
|
|
153
153
|
resizeMode="cover"
|
|
154
154
|
>
|
|
@@ -178,7 +178,7 @@ export function AudioPlayerLayout({ artwork, config, children, style }: Props) {
|
|
|
178
178
|
]}
|
|
179
179
|
>
|
|
180
180
|
<ImageBackground
|
|
181
|
-
source={
|
|
181
|
+
source={backgroundImageSource}
|
|
182
182
|
style={backgroundImgStyles}
|
|
183
183
|
resizeMode="cover"
|
|
184
184
|
>
|
|
@@ -11,6 +11,7 @@ import { allSettled } from "promise";
|
|
|
11
11
|
import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
|
|
12
12
|
import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
|
|
13
13
|
import { ScreenTrackedViewPositionsContext } from "@applicaster/zapp-react-native-ui-components/Contexts/ScreenTrackedViewPositionsContext";
|
|
14
|
+
import { useEventAlerts } from "./utils/useEventAlerts";
|
|
14
15
|
|
|
15
16
|
const { log_info } = createLogger({
|
|
16
17
|
category: "ScreenContainer",
|
|
@@ -103,6 +104,8 @@ export const GeneralContentScreen = ({
|
|
|
103
104
|
[typeof cellTapAction === "function" ? cellTapAction : onCellTapAction]
|
|
104
105
|
);
|
|
105
106
|
|
|
107
|
+
useEventAlerts(screenData);
|
|
108
|
+
|
|
106
109
|
if (!isReady || isNilOrEmpty(components || uiComponents)) return null;
|
|
107
110
|
|
|
108
111
|
return (
|
|
@@ -3,8 +3,10 @@ import { all, equals, path, prop, isEmpty, pluck, values } from "ramda";
|
|
|
3
3
|
import { useEffect, useMemo } from "react";
|
|
4
4
|
import { useDispatch } from "react-redux";
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
|
|
6
|
+
import {
|
|
7
|
+
useLayoutPresets,
|
|
8
|
+
useZappPipesFeeds,
|
|
9
|
+
} from "@applicaster/zapp-react-native-redux/hooks";
|
|
8
10
|
import { loadPipesData } from "@applicaster/zapp-react-native-redux/ZappPipes";
|
|
9
11
|
import { isEmptyOrNil } from "@applicaster/zapp-react-native-utils/cellUtils";
|
|
10
12
|
import { Categories } from "./logger";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { showAlertDialog } from "@applicaster/zapp-react-native-utils/alertUtils";
|
|
3
|
+
import { TOGGLE_FLAG_MAX_ITEMS_REACHED_EVENT } from "@applicaster/zapp-react-native-utils/actionsExecutor/consts";
|
|
4
|
+
import { useLocalizedStrings } from "@applicaster/zapp-react-native-utils/localizationUtils";
|
|
5
|
+
import { useIsScreenActive } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
6
|
+
import { useSubscriberFor } from "@applicaster/zapp-react-native-utils/reactHooks/useSubscriberFor";
|
|
7
|
+
|
|
8
|
+
export const useEventAlerts = (screenData: ZappRiver) => {
|
|
9
|
+
const localizations = useLocalizedStrings({
|
|
10
|
+
localizations: screenData?.localizations || {},
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const isActive = useIsScreenActive();
|
|
14
|
+
|
|
15
|
+
const onMaxTagsReached = React.useCallback(() => {
|
|
16
|
+
// We can't skip subscribe hook call, so we have to check.
|
|
17
|
+
if (!isActive || !localizations?.msg_maximum_selection_reached_message) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
showAlertDialog({
|
|
22
|
+
title: "",
|
|
23
|
+
message: localizations.msg_maximum_selection_reached_message,
|
|
24
|
+
okButtonText:
|
|
25
|
+
localizations.msg_maximum_selection_reached_message_ok_button || "OK",
|
|
26
|
+
});
|
|
27
|
+
}, [localizations, isActive]);
|
|
28
|
+
|
|
29
|
+
useSubscriberFor(TOGGLE_FLAG_MAX_ITEMS_REACHED_EVENT, onMaxTagsReached);
|
|
30
|
+
};
|
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import React, {
|
|
2
|
-
|
|
3
|
-
useEffect,
|
|
4
|
-
useMemo,
|
|
5
|
-
useRef,
|
|
6
|
-
useState,
|
|
7
|
-
} from "react";
|
|
8
|
-
import { View, LayoutChangeEvent, ScrollView } from "react-native";
|
|
1
|
+
import React, { useCallback, useEffect, useMemo, useRef } from "react";
|
|
2
|
+
import { View, ScrollView } from "react-native";
|
|
9
3
|
import { Button } from "./Button";
|
|
10
4
|
import { ItemIconProps } from "./Button/ItemIcon";
|
|
11
5
|
import { ItemProps } from "./Button/Item";
|
|
@@ -15,7 +9,8 @@ import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
|
15
9
|
|
|
16
10
|
import type { PluginConfiguration } from "./";
|
|
17
11
|
|
|
18
|
-
import { ModalHeader } from "./Header";
|
|
12
|
+
import { ModalHeader as DefaultModalHeader } from "./Header";
|
|
13
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
19
14
|
|
|
20
15
|
type ModalComponentProps = {
|
|
21
16
|
items: any[];
|
|
@@ -27,6 +22,7 @@ type ModalComponentProps = {
|
|
|
27
22
|
title?: string;
|
|
28
23
|
maxHeight?: number;
|
|
29
24
|
dismiss: () => void;
|
|
25
|
+
headerComponent?: React.ComponentType;
|
|
30
26
|
buttonComponent?: React.ComponentType;
|
|
31
27
|
iconProps?: ItemIconProps | ((theme: PluginConfiguration) => ItemIconProps);
|
|
32
28
|
itemProps?:
|
|
@@ -48,33 +44,25 @@ export function BottomSheetModalContent(props: ModalComponentProps) {
|
|
|
48
44
|
const {
|
|
49
45
|
items,
|
|
50
46
|
currentRoute,
|
|
51
|
-
maxHeight,
|
|
52
47
|
current_selection = null,
|
|
53
48
|
onPress,
|
|
54
49
|
dismiss,
|
|
55
50
|
summary,
|
|
56
51
|
title,
|
|
52
|
+
headerComponent: ModalHeader = DefaultModalHeader,
|
|
57
53
|
buttonComponent: ButtonComponent = Button,
|
|
58
|
-
getSelectedItemIcon = (
|
|
59
|
-
|
|
54
|
+
getSelectedItemIcon = ({
|
|
55
|
+
modal_bottom_sheet_item_selected_icon,
|
|
56
|
+
}: BaseThemePropertiesMobile) => modal_bottom_sheet_item_selected_icon,
|
|
60
57
|
getDefaultItemIcon = () => null,
|
|
61
58
|
iconPlacement,
|
|
62
59
|
} = props;
|
|
63
60
|
|
|
64
|
-
const [headerHeight, setHeaderHeight] = useState(0);
|
|
65
61
|
const route = useRef(currentRoute);
|
|
66
62
|
const theme = useTheme<BaseThemePropertiesMobile>();
|
|
67
63
|
const paddingTop = Number(theme.modal_bottom_sheet_padding_top);
|
|
68
64
|
const paddingBottom = Number(theme.modal_bottom_sheet_padding_bottom);
|
|
69
65
|
|
|
70
|
-
const maxContentHeight = maxHeight
|
|
71
|
-
? maxHeight - headerHeight - paddingTop
|
|
72
|
-
: undefined;
|
|
73
|
-
|
|
74
|
-
const onHeaderLayout = useCallback((event: LayoutChangeEvent) => {
|
|
75
|
-
setHeaderHeight(event.nativeEvent.layout.height);
|
|
76
|
-
}, []);
|
|
77
|
-
|
|
78
66
|
useEffect(() => {
|
|
79
67
|
if (currentRoute !== route.current) {
|
|
80
68
|
props.dismiss();
|
|
@@ -101,46 +89,44 @@ export function BottomSheetModalContent(props: ModalComponentProps) {
|
|
|
101
89
|
[onPress, dismiss]
|
|
102
90
|
);
|
|
103
91
|
|
|
92
|
+
const bottomInset = useSafeAreaInsets().bottom;
|
|
93
|
+
|
|
104
94
|
return (
|
|
105
95
|
<View
|
|
106
96
|
style={{
|
|
107
|
-
|
|
108
|
-
paddingTop,
|
|
97
|
+
maxHeight: props.maxHeight,
|
|
98
|
+
paddingTop: paddingTop,
|
|
109
99
|
}}
|
|
110
100
|
>
|
|
111
101
|
<ModalHeader
|
|
112
|
-
width={props.width}
|
|
113
102
|
dismiss={dismiss}
|
|
114
103
|
configuration={theme}
|
|
115
|
-
onLayout={onHeaderLayout}
|
|
116
104
|
summary={summary}
|
|
117
105
|
title={title}
|
|
118
106
|
/>
|
|
119
107
|
<ScrollView
|
|
120
|
-
bounces={false}
|
|
121
|
-
style={{ maxHeight: maxContentHeight }}
|
|
122
108
|
contentContainerStyle={{
|
|
123
|
-
paddingBottom,
|
|
124
|
-
paddingTop,
|
|
109
|
+
paddingBottom: paddingBottom + bottomInset,
|
|
125
110
|
}}
|
|
126
111
|
>
|
|
127
|
-
{items.map((item, index) =>
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
112
|
+
{items.map((item, index) =>
|
|
113
|
+
item ? (
|
|
114
|
+
<ButtonComponent
|
|
115
|
+
key={index}
|
|
116
|
+
configuration={theme}
|
|
117
|
+
selectedItem={current_selection}
|
|
118
|
+
item={item}
|
|
119
|
+
onPress={handlePress}
|
|
120
|
+
label={theme[item?.label] ?? item?.label}
|
|
121
|
+
iconBaseProps={iconBaseProps}
|
|
122
|
+
itemBaseProps={itemBaseProps}
|
|
123
|
+
labelBaseProps={labelBaseProps}
|
|
124
|
+
selectedItemIcon={getSelectedItemIcon(theme)}
|
|
125
|
+
defaultItemIcon={getDefaultItemIcon(theme)}
|
|
126
|
+
iconPlacement={iconPlacement}
|
|
127
|
+
/>
|
|
128
|
+
) : null
|
|
129
|
+
)}
|
|
144
130
|
</ScrollView>
|
|
145
131
|
</View>
|
|
146
132
|
);
|
|
@@ -7,7 +7,6 @@ import { defaultSelectedAsset } from "./assets";
|
|
|
7
7
|
|
|
8
8
|
type ButtonProps = {
|
|
9
9
|
configuration: any;
|
|
10
|
-
width: number;
|
|
11
10
|
selectedItem?: any;
|
|
12
11
|
item: any; // Adjust type as needed
|
|
13
12
|
onPress: (item: any) => void; // Adjust type as needed
|
|
@@ -33,7 +32,6 @@ export function Button({
|
|
|
33
32
|
item,
|
|
34
33
|
onPress,
|
|
35
34
|
configuration,
|
|
36
|
-
width,
|
|
37
35
|
iconBaseProps,
|
|
38
36
|
itemBaseProps: itemProps,
|
|
39
37
|
labelBaseProps,
|
|
@@ -65,34 +63,32 @@ export function Button({
|
|
|
65
63
|
if (disabled) return null;
|
|
66
64
|
|
|
67
65
|
return (
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
>
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
{iconPlacement === "left" && renderItemIcon}
|
|
66
|
+
<TouchableOpacity
|
|
67
|
+
activeOpacity={1}
|
|
68
|
+
onPress={() => onPress(item)}
|
|
69
|
+
onPressIn={() => setFocused(true)}
|
|
70
|
+
onPressOut={() => setFocused(false)}
|
|
71
|
+
>
|
|
72
|
+
<Item {...itemProps} focused={focused} selected={selected}>
|
|
73
|
+
<View style={styles.label_icon_container}>
|
|
74
|
+
{iconPlacement === "left" && renderItemIcon}
|
|
78
75
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
76
|
+
{label ? (
|
|
77
|
+
<ItemLabel
|
|
78
|
+
{...labelBaseProps}
|
|
79
|
+
label={label ?? null}
|
|
80
|
+
focused={focused}
|
|
81
|
+
selected={selected}
|
|
82
|
+
/>
|
|
83
|
+
) : null}
|
|
84
|
+
</View>
|
|
88
85
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
</View>
|
|
86
|
+
{selected ? (
|
|
87
|
+
<ItemIcon {...iconBaseProps} asset={selectedItemIconPropsAssets} />
|
|
88
|
+
) : (
|
|
89
|
+
iconPlacement === "right" && renderItemIcon
|
|
90
|
+
)}
|
|
91
|
+
</Item>
|
|
92
|
+
</TouchableOpacity>
|
|
97
93
|
);
|
|
98
94
|
}
|
|
@@ -8,13 +8,18 @@ import { PluginConfiguration } from "../index";
|
|
|
8
8
|
type Props = {
|
|
9
9
|
dismiss: () => void;
|
|
10
10
|
configuration: PluginConfiguration;
|
|
11
|
-
width: number;
|
|
12
11
|
onLayout?: (event: LayoutChangeEvent) => void;
|
|
13
12
|
summary?: string;
|
|
14
13
|
title?: string;
|
|
15
14
|
};
|
|
16
15
|
|
|
17
16
|
const styles = StyleSheet.create({
|
|
17
|
+
noFlex: {
|
|
18
|
+
flex: 0,
|
|
19
|
+
},
|
|
20
|
+
flex: {
|
|
21
|
+
flex: 1,
|
|
22
|
+
},
|
|
18
23
|
container: {
|
|
19
24
|
flexDirection: "row",
|
|
20
25
|
alignItems: "center",
|
|
@@ -22,7 +27,7 @@ const styles = StyleSheet.create({
|
|
|
22
27
|
});
|
|
23
28
|
|
|
24
29
|
export function ModalHeader(props: Props) {
|
|
25
|
-
const { configuration, dismiss,
|
|
30
|
+
const { configuration, dismiss, onLayout, summary, title } = props;
|
|
26
31
|
|
|
27
32
|
const closeButtonProps = useMemo<CloseButtonProps>(
|
|
28
33
|
() => ({
|
|
@@ -55,15 +60,11 @@ export function ModalHeader(props: Props) {
|
|
|
55
60
|
|
|
56
61
|
return (
|
|
57
62
|
<View onLayout={onLayout} style={styles.container}>
|
|
58
|
-
<View
|
|
59
|
-
style={{
|
|
60
|
-
width: width - buttonsContainerWidth,
|
|
61
|
-
}}
|
|
62
|
-
>
|
|
63
|
+
<View style={styles.flex}>
|
|
63
64
|
{title ? <Title {...titleProps} /> : null}
|
|
64
65
|
{summary ? <Title {...summaryProps} /> : null}
|
|
65
66
|
</View>
|
|
66
|
-
<View style={{ width: buttonsContainerWidth }}>
|
|
67
|
+
<View style={[styles.noFlex, { width: buttonsContainerWidth }]}>
|
|
67
68
|
<CloseButton {...closeButtonProps} />
|
|
68
69
|
</View>
|
|
69
70
|
</View>
|
|
@@ -6,11 +6,15 @@ import * as R from "ramda";
|
|
|
6
6
|
import uuid from "uuid/v4";
|
|
7
7
|
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils/playerManager";
|
|
8
8
|
import {
|
|
9
|
-
isApplePlatform,
|
|
10
9
|
isTV,
|
|
11
10
|
platformSelect,
|
|
12
11
|
isAndroidTVPlatform,
|
|
12
|
+
isTvOSPlatform,
|
|
13
13
|
} from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
14
|
+
import {
|
|
15
|
+
isAudioItem,
|
|
16
|
+
isInlineTV as isInlineTVUtil,
|
|
17
|
+
} from "@applicaster/zapp-react-native-utils/playerUtils";
|
|
14
18
|
|
|
15
19
|
import { TVEventHandlerComponent } from "@applicaster/zapp-react-native-tvos-ui-components/Components/TVEventHandlerComponent";
|
|
16
20
|
import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
|
|
@@ -21,7 +25,7 @@ import {
|
|
|
21
25
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
22
26
|
|
|
23
27
|
import { PlayerStateContext } from "../../Contexts/PlayerStateContext";
|
|
24
|
-
|
|
28
|
+
|
|
25
29
|
import {
|
|
26
30
|
QUICK_BRICK_EVENTS,
|
|
27
31
|
QuickBrickEvent,
|
|
@@ -96,6 +100,11 @@ const focusableBottomContainerId = "player-container-bottom";
|
|
|
96
100
|
|
|
97
101
|
const isAndroidTV = isAndroidTVPlatform();
|
|
98
102
|
|
|
103
|
+
const isTvOS = isTvOSPlatform();
|
|
104
|
+
|
|
105
|
+
// height for container with additional content below player
|
|
106
|
+
const INLINE_CONTAINER_CONTENT_HEIGHT = 400;
|
|
107
|
+
|
|
99
108
|
const withBorderHack = () => {
|
|
100
109
|
if (isAndroidTV) {
|
|
101
110
|
/* @HACK: see GH#7269 */
|
|
@@ -125,7 +134,7 @@ const webStyles = {
|
|
|
125
134
|
flex: "initial",
|
|
126
135
|
},
|
|
127
136
|
inlineRiver: {
|
|
128
|
-
height:
|
|
137
|
+
height: INLINE_CONTAINER_CONTENT_HEIGHT,
|
|
129
138
|
},
|
|
130
139
|
};
|
|
131
140
|
|
|
@@ -143,7 +152,7 @@ const nativeStyles = {
|
|
|
143
152
|
flex: 1,
|
|
144
153
|
},
|
|
145
154
|
inlineRiver: {
|
|
146
|
-
height:
|
|
155
|
+
height: INLINE_CONTAINER_CONTENT_HEIGHT,
|
|
147
156
|
},
|
|
148
157
|
};
|
|
149
158
|
|
|
@@ -163,12 +172,11 @@ const renderApplePlayer = ({
|
|
|
163
172
|
videoStyle,
|
|
164
173
|
playNextData,
|
|
165
174
|
}) => {
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
if (!isAppleTV() || !player) {
|
|
175
|
+
if (!isTvOS || !player) {
|
|
169
176
|
return null;
|
|
170
177
|
}
|
|
171
178
|
|
|
179
|
+
// render audio_player for tvos
|
|
172
180
|
if (isAudioContent) {
|
|
173
181
|
return (
|
|
174
182
|
<AudioPlayer
|
|
@@ -182,6 +190,8 @@ const renderApplePlayer = ({
|
|
|
182
190
|
return null;
|
|
183
191
|
}
|
|
184
192
|
|
|
193
|
+
const { title, summary } = item || {};
|
|
194
|
+
|
|
185
195
|
return (
|
|
186
196
|
<ProgramInfo
|
|
187
197
|
title={title}
|
|
@@ -192,21 +202,6 @@ const renderApplePlayer = ({
|
|
|
192
202
|
);
|
|
193
203
|
};
|
|
194
204
|
|
|
195
|
-
const renderRestPlayers = ({ item, showAudioPlayer, pluginConfiguration }) => {
|
|
196
|
-
if (isApplePlatform()) {
|
|
197
|
-
return null;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
return (
|
|
201
|
-
showAudioPlayer && (
|
|
202
|
-
<AudioPlayer
|
|
203
|
-
audio_item={item}
|
|
204
|
-
plugin_configuration={pluginConfiguration}
|
|
205
|
-
/>
|
|
206
|
-
)
|
|
207
|
-
);
|
|
208
|
-
};
|
|
209
|
-
|
|
210
205
|
const PlayerContainerComponent = (props: Props) => {
|
|
211
206
|
const {
|
|
212
207
|
Player,
|
|
@@ -336,7 +331,7 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
336
331
|
|
|
337
332
|
setState({ error: errorObj });
|
|
338
333
|
|
|
339
|
-
if (!
|
|
334
|
+
if (!isTvOS) {
|
|
340
335
|
setTimeout(() => {
|
|
341
336
|
close();
|
|
342
337
|
}, 800);
|
|
@@ -493,9 +488,7 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
493
488
|
// TODO: Skip hook call on TV platform
|
|
494
489
|
useBackHandler(backHandler);
|
|
495
490
|
|
|
496
|
-
const isAudioContent =
|
|
497
|
-
typeof item?.content?.type === "string" &&
|
|
498
|
-
item?.content?.type.includes("audio");
|
|
491
|
+
const isAudioContent = isAudioItem(item);
|
|
499
492
|
|
|
500
493
|
useEffect(() => {
|
|
501
494
|
if (!isAudioContent) {
|
|
@@ -569,10 +562,7 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
569
562
|
|
|
570
563
|
const uri = item?.content ? item.content?.src : null;
|
|
571
564
|
|
|
572
|
-
const isInlineTV =
|
|
573
|
-
screenData?.ui_components &&
|
|
574
|
-
screenData?.ui_components?.length > 0 &&
|
|
575
|
-
isTV();
|
|
565
|
+
const isInlineTV = isInlineTVUtil(screenData);
|
|
576
566
|
|
|
577
567
|
const inline =
|
|
578
568
|
[VideoModalMode.MAXIMIZED, VideoModalMode.MINIMIZED].includes(mode) ||
|
|
@@ -597,7 +587,7 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
597
587
|
);
|
|
598
588
|
}
|
|
599
589
|
|
|
600
|
-
if (screen_background_color) {
|
|
590
|
+
if (screen_background_color && mode !== VideoModalMode.FULLSCREEN) {
|
|
601
591
|
updatedStyles.playerScreen.backgroundColor = screen_background_color;
|
|
602
592
|
}
|
|
603
593
|
|
|
@@ -615,6 +605,7 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
615
605
|
tv_component_container_height,
|
|
616
606
|
screen_background_color,
|
|
617
607
|
isInlineTV,
|
|
608
|
+
mode,
|
|
618
609
|
]);
|
|
619
610
|
|
|
620
611
|
const applePlayerProps = {
|
|
@@ -626,12 +617,6 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
626
617
|
playNextData,
|
|
627
618
|
};
|
|
628
619
|
|
|
629
|
-
const restPlayerProps = {
|
|
630
|
-
item,
|
|
631
|
-
showAudioPlayer: isAudioContent,
|
|
632
|
-
pluginConfiguration,
|
|
633
|
-
};
|
|
634
|
-
|
|
635
620
|
return (
|
|
636
621
|
<PlayerStateContext.Provider value={value}>
|
|
637
622
|
<PlayerContainerContextProvider
|
|
@@ -707,8 +692,6 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
707
692
|
</Player>
|
|
708
693
|
</PlayerFocusableWrapperView>
|
|
709
694
|
|
|
710
|
-
{renderRestPlayers(restPlayerProps)}
|
|
711
|
-
|
|
712
695
|
{state.error ? <ErrorDisplay error={state.error} /> : null}
|
|
713
696
|
</View>
|
|
714
697
|
{/* Components container */}
|
|
@@ -732,7 +715,7 @@ const PlayerContainerComponent = (props: Props) => {
|
|
|
732
715
|
screenId={screenData.id}
|
|
733
716
|
key={item.id}
|
|
734
717
|
groupId={FocusableGroupMainContainerId}
|
|
735
|
-
cellTapAction={
|
|
718
|
+
cellTapAction={onCellTap}
|
|
736
719
|
extraAnchorPointYOffset={-600}
|
|
737
720
|
isScreenWrappedInContainer={true}
|
|
738
721
|
containerHeight={styles.inlineRiver.height}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import * as R from "ramda";
|
|
3
|
-
import { View, StyleSheet,
|
|
3
|
+
import { View, StyleSheet, 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";
|
|
@@ -24,6 +24,10 @@ import { withComponentsMapProvider } from "@applicaster/zapp-react-native-ui-com
|
|
|
24
24
|
import { useScreenContextV2 } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenContext";
|
|
25
25
|
import { useShallow } from "zustand/react/shallow";
|
|
26
26
|
|
|
27
|
+
import { isAndroidPlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
28
|
+
|
|
29
|
+
const isAndroid = isAndroidPlatform();
|
|
30
|
+
|
|
27
31
|
type Props = {
|
|
28
32
|
feed: ZappFeed;
|
|
29
33
|
groupId?: string;
|
|
@@ -273,12 +277,12 @@ function ComponentsMapComponent(props: Props) {
|
|
|
273
277
|
}}
|
|
274
278
|
// Fix for WebView rerender crashes on Android API 28+
|
|
275
279
|
// https://github.com/react-native-webview/react-native-webview/issues/1915#issuecomment-964035468
|
|
276
|
-
overScrollMode={
|
|
280
|
+
overScrollMode={isAndroid ? "never" : "auto"}
|
|
277
281
|
scrollIndicatorInsets={scrollIndicatorInsets}
|
|
278
282
|
extraData={feed}
|
|
279
283
|
stickyHeaderIndices={stickyHeaderIndices}
|
|
280
284
|
onLayout={handleOnLayout}
|
|
281
|
-
removeClippedSubviews
|
|
285
|
+
removeClippedSubviews={isAndroid}
|
|
282
286
|
initialNumToRender={3}
|
|
283
287
|
maxToRenderPerBatch={10}
|
|
284
288
|
windowSize={12}
|
|
@@ -299,6 +303,10 @@ function ComponentsMapComponent(props: Props) {
|
|
|
299
303
|
onMomentumScrollEnd={_onMomentumScrollEnd}
|
|
300
304
|
onScrollEndDrag={_onScrollEndDrag}
|
|
301
305
|
scrollEventThrottle={16}
|
|
306
|
+
maintainVisibleContentPosition={{
|
|
307
|
+
minIndexForVisible: 0,
|
|
308
|
+
autoscrollToTopThreshold: 10,
|
|
309
|
+
}}
|
|
302
310
|
{...scrollViewExtraProps}
|
|
303
311
|
/>
|
|
304
312
|
</ViewportTracker>
|
|
@@ -48,16 +48,20 @@ const useLoadingState = (
|
|
|
48
48
|
loadingState: RiverItemType["loadingState"]
|
|
49
49
|
) => {
|
|
50
50
|
const [readyToBeDisplayed, setReadyToBeDisplayed] = React.useState(
|
|
51
|
-
loadingState.getValue().index + 1
|
|
51
|
+
loadingState.getValue().index + 1 >= currentIndex
|
|
52
52
|
);
|
|
53
53
|
|
|
54
54
|
useEffect(() => {
|
|
55
55
|
const subscription = loadingState.subscribe(({ index }) => {
|
|
56
|
-
if (index + 1
|
|
56
|
+
if (index + 1 >= currentIndex) {
|
|
57
57
|
setReadyToBeDisplayed(true);
|
|
58
58
|
}
|
|
59
59
|
});
|
|
60
60
|
|
|
61
|
+
if (loadingState.getValue().index + 1 >= currentIndex) {
|
|
62
|
+
setReadyToBeDisplayed(true);
|
|
63
|
+
}
|
|
64
|
+
|
|
61
65
|
return () => {
|
|
62
66
|
subscription.unsubscribe();
|
|
63
67
|
};
|
|
@@ -135,6 +135,12 @@ exports[`componentsMap renders renders components map correctly 1`] = `
|
|
|
135
135
|
getItemCount={[Function]}
|
|
136
136
|
initialNumToRender={3}
|
|
137
137
|
keyExtractor={[Function]}
|
|
138
|
+
maintainVisibleContentPosition={
|
|
139
|
+
{
|
|
140
|
+
"autoscrollToTopThreshold": 10,
|
|
141
|
+
"minIndexForVisible": 0,
|
|
142
|
+
}
|
|
143
|
+
}
|
|
138
144
|
maxToRenderPerBatch={10}
|
|
139
145
|
onContentSizeChange={[Function]}
|
|
140
146
|
onLayout={[Function]}
|
|
@@ -145,7 +151,7 @@ exports[`componentsMap renders renders components map correctly 1`] = `
|
|
|
145
151
|
onScrollEndDrag={[Function]}
|
|
146
152
|
overScrollMode="auto"
|
|
147
153
|
refreshControl={null}
|
|
148
|
-
removeClippedSubviews={
|
|
154
|
+
removeClippedSubviews={false}
|
|
149
155
|
renderItem={[Function]}
|
|
150
156
|
scrollEventThrottle={16}
|
|
151
157
|
scrollIndicatorInsets={
|
|
@@ -12,11 +12,7 @@ const styles = StyleSheet.create({
|
|
|
12
12
|
|
|
13
13
|
export function TestId({ screenId, children }: Props) {
|
|
14
14
|
return (
|
|
15
|
-
<View
|
|
16
|
-
testID={screenId}
|
|
17
|
-
accessibilityLabel={screenId}
|
|
18
|
-
style={styles.container}
|
|
19
|
-
>
|
|
15
|
+
<View testID={screenId} style={styles.container}>
|
|
20
16
|
{children}
|
|
21
17
|
</View>
|
|
22
18
|
);
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const {
|
|
2
|
+
useScreenBackgroundColor,
|
|
3
|
+
} = require("@applicaster/zapp-react-native-utils/reactHooks/screen");
|
|
4
|
+
|
|
5
|
+
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/screen", () => ({
|
|
6
|
+
useScreenBackgroundColor: jest.fn(),
|
|
7
|
+
useNavbarState: jest.fn().mockReturnValue({ visible: true }),
|
|
8
|
+
}));
|
|
9
|
+
|
|
10
|
+
describe("TV Screen Component", () => {
|
|
11
|
+
it("uses the useScreenBackgroundColor hook with the correct screen ID", () => {
|
|
12
|
+
useScreenBackgroundColor.mockReturnValue("#FF0000");
|
|
13
|
+
|
|
14
|
+
expect(useScreenBackgroundColor("test-screen-id")).toBe("#FF0000");
|
|
15
|
+
|
|
16
|
+
// Verify the hook was called with the correct screen ID
|
|
17
|
+
expect(useScreenBackgroundColor).toHaveBeenCalledWith("test-screen-id");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("returns 'transparent' when the screen background color is not defined", () => {
|
|
21
|
+
useScreenBackgroundColor.mockReturnValue("transparent");
|
|
22
|
+
|
|
23
|
+
// Verify the hook returns 'transparent'
|
|
24
|
+
expect(useScreenBackgroundColor("test-screen-id")).toBe("transparent");
|
|
25
|
+
});
|
|
26
|
+
});
|
|
@@ -68,21 +68,21 @@ jest.mock(
|
|
|
68
68
|
})
|
|
69
69
|
);
|
|
70
70
|
|
|
71
|
-
jest.mock(
|
|
72
|
-
"@applicaster/zapp-react-native-utils/reactHooks/screen/useScreenData",
|
|
73
|
-
() => ({
|
|
74
|
-
useScreenData: jest.fn(() => ({
|
|
75
|
-
id: "testId",
|
|
76
|
-
navigations: [{ id: "testId", category: "nav_bar" }],
|
|
77
|
-
})),
|
|
78
|
-
})
|
|
79
|
-
);
|
|
80
|
-
|
|
81
71
|
jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
82
72
|
isNavBarVisible: mockIsNavBarVisible,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
73
|
+
useIsScreenActive: jest.fn().mockReturnValue(true),
|
|
74
|
+
}));
|
|
75
|
+
|
|
76
|
+
jest.mock("@applicaster/zapp-react-native-utils/reactHooks", () => ({
|
|
77
|
+
useCurrentScreenData: jest.fn(() => ({
|
|
78
|
+
id: "testId",
|
|
79
|
+
})),
|
|
80
|
+
useNavbarState: jest.fn(() => ({
|
|
81
|
+
title: "Test Title",
|
|
82
|
+
})),
|
|
83
|
+
useScreenData: jest.fn(() => ({
|
|
84
|
+
id: "testId",
|
|
85
|
+
navigations: [{ id: "testId", category: "nav_bar" }],
|
|
86
86
|
})),
|
|
87
87
|
useNavigation: jest.fn(() => ({
|
|
88
88
|
canGoBack: () => false,
|
|
@@ -91,7 +91,15 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
|
91
91
|
screenData: { id: "testId" },
|
|
92
92
|
data: { screen: { id: "testId" } },
|
|
93
93
|
})),
|
|
94
|
-
|
|
94
|
+
useRoute: jest.fn(() => ({
|
|
95
|
+
pathname: "/river/testId",
|
|
96
|
+
screenData: { id: "testId" },
|
|
97
|
+
})),
|
|
98
|
+
useDimensions: jest.fn(() => ({
|
|
99
|
+
width: 1920,
|
|
100
|
+
height: 1080,
|
|
101
|
+
})),
|
|
102
|
+
useIsTablet: jest.fn(() => false),
|
|
95
103
|
}));
|
|
96
104
|
|
|
97
105
|
jest.mock("@applicaster/zapp-react-native-redux/hooks/usePickFromState", () => {
|
|
@@ -16,7 +16,7 @@ exports[`<Screen Component /> when the navbar should be hidden renders correctly
|
|
|
16
16
|
pathname="/river/testId"
|
|
17
17
|
selected="testId"
|
|
18
18
|
testID="navBar"
|
|
19
|
-
title=""
|
|
19
|
+
title="Test Title"
|
|
20
20
|
/>
|
|
21
21
|
<View>
|
|
22
22
|
<View
|
|
@@ -48,7 +48,7 @@ exports[`<Screen Component /> when the navbar should show renders correctly 1`]
|
|
|
48
48
|
pathname="/river/testId"
|
|
49
49
|
selected="testId"
|
|
50
50
|
testID="navBar"
|
|
51
|
-
title=""
|
|
51
|
+
title="Test Title"
|
|
52
52
|
/>
|
|
53
53
|
<View>
|
|
54
54
|
<View
|
|
@@ -94,7 +94,7 @@ export const AnimationView = ({
|
|
|
94
94
|
const isAudioItem = React.useMemo(
|
|
95
95
|
() =>
|
|
96
96
|
videoModalItem?.content?.type?.includes?.("audio") ||
|
|
97
|
-
videoModalItem?.type?.value
|
|
97
|
+
videoModalItem?.type?.value?.includes?.("audio"),
|
|
98
98
|
[videoModalItem]
|
|
99
99
|
);
|
|
100
100
|
|
|
@@ -107,7 +107,6 @@ export const AnimationView = ({
|
|
|
107
107
|
progressBarHeight,
|
|
108
108
|
isTablet,
|
|
109
109
|
isTabletLandscape,
|
|
110
|
-
inlineAudioPlayer,
|
|
111
110
|
tabletLandscapePlayerTopPosition,
|
|
112
111
|
});
|
|
113
112
|
|
|
@@ -309,7 +309,6 @@ export const getMoveUpValue = ({
|
|
|
309
309
|
progressBarHeight,
|
|
310
310
|
isTablet,
|
|
311
311
|
isTabletLandscape,
|
|
312
|
-
inlineAudioPlayer,
|
|
313
312
|
tabletLandscapePlayerTopPosition,
|
|
314
313
|
}) => {
|
|
315
314
|
if (additionalData.saveArea) {
|
|
@@ -322,17 +321,12 @@ export const getMoveUpValue = ({
|
|
|
322
321
|
}
|
|
323
322
|
|
|
324
323
|
if (isTablet) {
|
|
325
|
-
if (
|
|
326
|
-
isTabletLandscape &&
|
|
327
|
-
(!isAudioItem || (isAudioItem && inlineAudioPlayer))
|
|
328
|
-
) {
|
|
324
|
+
if (isTabletLandscape) {
|
|
329
325
|
return -tabletLandscapePlayerTopPosition + progressBarHeight;
|
|
326
|
+
} else {
|
|
327
|
+
return -130;
|
|
330
328
|
}
|
|
331
|
-
|
|
332
|
-
// for audioPlayer(tablet/isTabletPortrait) in docked mode
|
|
333
|
-
return -130;
|
|
334
329
|
}
|
|
335
330
|
|
|
336
|
-
// for audioPlayer(mobile) in docked mode
|
|
337
331
|
return -50 + progressBarHeight;
|
|
338
332
|
};
|
|
@@ -74,20 +74,6 @@ const getScreenAspectRatio = () => {
|
|
|
74
74
|
return longEdge / shortEdge;
|
|
75
75
|
};
|
|
76
76
|
|
|
77
|
-
const safeAreaStyles = (
|
|
78
|
-
configuration: Configuration,
|
|
79
|
-
isTablet: boolean
|
|
80
|
-
): ViewStyle => {
|
|
81
|
-
const tablet_landscape_player_container_background_color =
|
|
82
|
-
configuration?.tablet_landscape_player_container_background_color;
|
|
83
|
-
|
|
84
|
-
return {
|
|
85
|
-
backgroundColor: isTablet
|
|
86
|
-
? tablet_landscape_player_container_background_color
|
|
87
|
-
: "transparent",
|
|
88
|
-
};
|
|
89
|
-
};
|
|
90
|
-
|
|
91
77
|
const getEdges = (isTablet: boolean, isInlineModal: boolean) => {
|
|
92
78
|
if (isTablet) {
|
|
93
79
|
return ["top"];
|
|
@@ -156,6 +142,7 @@ const PlayerWrapperComponent = (props: Props) => {
|
|
|
156
142
|
children,
|
|
157
143
|
isTabletPortrait,
|
|
158
144
|
configuration,
|
|
145
|
+
fullscreen,
|
|
159
146
|
pip,
|
|
160
147
|
} = props;
|
|
161
148
|
|
|
@@ -211,14 +198,17 @@ const PlayerWrapperComponent = (props: Props) => {
|
|
|
211
198
|
[containerDimensions, playerDimensionsHack]
|
|
212
199
|
);
|
|
213
200
|
|
|
201
|
+
const wrapperViewStyle: ViewStyle = {
|
|
202
|
+
backgroundColor:
|
|
203
|
+
isTablet && !fullscreen
|
|
204
|
+
? configuration?.tablet_landscape_player_container_background_color
|
|
205
|
+
: "transparent",
|
|
206
|
+
};
|
|
207
|
+
|
|
214
208
|
return (
|
|
215
209
|
<WrapperView
|
|
216
210
|
edges={getEdges(isTablet, isInlineModal) as readonly Edge[]}
|
|
217
|
-
style={[
|
|
218
|
-
safeAreaStyles(configuration, isTablet),
|
|
219
|
-
style,
|
|
220
|
-
playerDimensionsHack,
|
|
221
|
-
]}
|
|
211
|
+
style={[wrapperViewStyle, style, playerDimensionsHack]}
|
|
222
212
|
>
|
|
223
213
|
<AnimationComponent
|
|
224
214
|
animationType={ComponentAnimationType.moveUpComponent}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-ui-components",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "14.0.0-alpha.1430213104",
|
|
4
4
|
"description": "Applicaster Zapp React Native ui components for the Quick Brick App",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -31,12 +31,11 @@
|
|
|
31
31
|
"redux-mock-store": "^1.5.3"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@applicaster/applicaster-types": "
|
|
35
|
-
"@applicaster/zapp-react-native-bridge": "
|
|
36
|
-
"@applicaster/zapp-react-native-redux": "
|
|
37
|
-
"@applicaster/zapp-react-native-utils": "
|
|
34
|
+
"@applicaster/applicaster-types": "14.0.0-alpha.1430213104",
|
|
35
|
+
"@applicaster/zapp-react-native-bridge": "14.0.0-alpha.1430213104",
|
|
36
|
+
"@applicaster/zapp-react-native-redux": "14.0.0-alpha.1430213104",
|
|
37
|
+
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.1430213104",
|
|
38
38
|
"promise": "^8.3.0",
|
|
39
|
-
"react-router-native": "^5.1.2",
|
|
40
39
|
"url": "^0.11.0",
|
|
41
40
|
"uuid": "^3.3.2"
|
|
42
41
|
},
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
|
|
3
|
-
const reactRouter = jest.genMockFromModule("react-router-native");
|
|
4
|
-
|
|
5
|
-
function withRouter(Component) {
|
|
6
|
-
return (props) => <Component {...props} />; // eslint-disable-line react/display-name
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
reactRouter.withRouter = withRouter;
|
|
10
|
-
|
|
11
|
-
module.exports = reactRouter;
|