@applicaster/zapp-react-native-ui-components 12.0.0-alpha.4534459584 → 12.0.0-alpha.5114122134
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 +18 -10
- package/Components/Image/Image.android.tsx +4 -1
- package/Components/PlayerContainer/ErrorDisplay/ErrorDisplay.tsx +4 -7
- package/Components/River/River.tsx +8 -5
- package/Components/River/useScreenConfiguration.ts +3 -4
- package/Components/Screen/__tests__/Screen.test.tsx +40 -42
- package/Components/Screen/index.tsx +0 -1
- package/Components/Screen/orientationHandler.ts +1 -1
- package/Components/VideoLive/LiveImageManager.ts +5 -3
- package/Components/VideoModal/PlayerWrapper.tsx +66 -65
- package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +3 -2
- package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +8 -12
- package/Components/VideoModal/hooks/useModalSize.ts +13 -4
- package/Decorators/RiverResolver/index.tsx +0 -4
- package/Decorators/index.tsx +0 -4
- package/package.json +5 -6
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { Animated, EasingFunction, StyleProp, ViewStyle } from "react-native";
|
|
3
|
-
|
|
3
|
+
import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
|
|
4
|
+
import { toBooleanWithDefaultFalse } from "@applicaster/zapp-react-native-utils/booleanUtils";
|
|
4
5
|
import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
|
|
5
6
|
|
|
6
7
|
type AnimatedInterpolatedStyle =
|
|
@@ -35,11 +36,16 @@ function getAnimation(config: AnimatedInConfig, phase: "in" | "out") {
|
|
|
35
36
|
return config[phase] || config;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
|
-
export function AnimatedInOut(
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
export function AnimatedInOut({
|
|
40
|
+
visible,
|
|
41
|
+
animationConfig,
|
|
42
|
+
staticStyles = {},
|
|
43
|
+
children,
|
|
44
|
+
}: Props) {
|
|
41
45
|
const [animatedValue] = React.useState(new Animated.Value(visible ? 1 : 0));
|
|
42
|
-
const [animating, setAnimating] = React.useState(
|
|
46
|
+
const [animating, setAnimating] = React.useState(undefined);
|
|
47
|
+
|
|
48
|
+
const previousVisible = usePrevious(toBooleanWithDefaultFalse(visible));
|
|
43
49
|
|
|
44
50
|
function startAnimation(toValue, config) {
|
|
45
51
|
if (animating) {
|
|
@@ -55,7 +61,7 @@ export function AnimatedInOut(props: Props) {
|
|
|
55
61
|
delay,
|
|
56
62
|
useNativeDriver: true,
|
|
57
63
|
}).start(() => {
|
|
58
|
-
setAnimating(
|
|
64
|
+
setAnimating(undefined);
|
|
59
65
|
onAnimationEnd();
|
|
60
66
|
});
|
|
61
67
|
|
|
@@ -63,12 +69,14 @@ export function AnimatedInOut(props: Props) {
|
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
React.useEffect(() => {
|
|
66
|
-
if (visible) {
|
|
72
|
+
if (!previousVisible && visible) {
|
|
67
73
|
startAnimation(1.0, getAnimation(animationConfig, "in"));
|
|
68
|
-
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (previousVisible && !visible) {
|
|
69
77
|
startAnimation(0.0, getAnimation(animationConfig, "out"));
|
|
70
78
|
}
|
|
71
|
-
}, [visible,
|
|
79
|
+
}, [visible, previousVisible]);
|
|
72
80
|
|
|
73
81
|
const styles = visible
|
|
74
82
|
? getAnimation(animationConfig, "in").styles
|
|
@@ -77,7 +85,7 @@ export function AnimatedInOut(props: Props) {
|
|
|
77
85
|
return (
|
|
78
86
|
<Animated.View
|
|
79
87
|
renderToHardwareTextureAndroid={animating}
|
|
80
|
-
style={[styles(animatedValue),
|
|
88
|
+
style={[styles(animatedValue), staticStyles]}
|
|
81
89
|
>
|
|
82
90
|
{children}
|
|
83
91
|
</Animated.View>
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
|
|
3
2
|
import FastImage, {
|
|
4
3
|
FastImageProps,
|
|
5
4
|
} from "@applicaster/react-native-fast-image";
|
|
@@ -15,6 +14,8 @@ export const QBImage = (props: FastImageProps) => {
|
|
|
15
14
|
headers: props.source.headers,
|
|
16
15
|
priority: props.source.priority,
|
|
17
16
|
cache: props.source.cache,
|
|
17
|
+
maxWidth: props.source.maxWidth,
|
|
18
|
+
maxHeight: props.source.maxHeight,
|
|
18
19
|
};
|
|
19
20
|
}, [
|
|
20
21
|
...(typeof props.source === "object"
|
|
@@ -23,6 +24,8 @@ export const QBImage = (props: FastImageProps) => {
|
|
|
23
24
|
props.source?.priority,
|
|
24
25
|
props.source?.cache,
|
|
25
26
|
props.source?.headers,
|
|
27
|
+
props.source?.maxWidth,
|
|
28
|
+
props.source?.maxHeight,
|
|
26
29
|
]
|
|
27
30
|
: []),
|
|
28
31
|
]);
|
|
@@ -4,7 +4,6 @@ import { Text, TextStyle, View, ViewStyle } from "react-native";
|
|
|
4
4
|
|
|
5
5
|
import { getLocalizations } from "@applicaster/zapp-react-native-utils/localizationUtils";
|
|
6
6
|
import { getAppStylesColor } from "@applicaster/zapp-react-native-utils/stylesUtils";
|
|
7
|
-
import { useDimensions } from "@applicaster/zapp-react-native-utils/reactHooks/layout";
|
|
8
7
|
import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
9
8
|
import { styleKeys } from "@applicaster/zapp-react-native-utils/styleKeysUtils";
|
|
10
9
|
|
|
@@ -26,10 +25,10 @@ const textStyles = (appStyles = defaultAppStyles): TextStyle => ({
|
|
|
26
25
|
textAlign: "center",
|
|
27
26
|
});
|
|
28
27
|
|
|
29
|
-
const errorStyles = ({
|
|
28
|
+
const errorStyles = ({ backgroundColor }): ViewStyle => ({
|
|
30
29
|
flex: 1,
|
|
31
|
-
width,
|
|
32
|
-
height,
|
|
30
|
+
width: "100%",
|
|
31
|
+
height: "100%",
|
|
33
32
|
justifyContent: "center",
|
|
34
33
|
alignItems: "center",
|
|
35
34
|
position: "absolute",
|
|
@@ -41,8 +40,6 @@ export function ErrorDisplayComponent({
|
|
|
41
40
|
styles,
|
|
42
41
|
remoteConfigurations: { localizations },
|
|
43
42
|
}: Props) {
|
|
44
|
-
const { width, height } = useDimensions("window");
|
|
45
|
-
|
|
46
43
|
const theme = useTheme();
|
|
47
44
|
const backgroundColor = theme?.app_background_color;
|
|
48
45
|
|
|
@@ -53,7 +50,7 @@ export function ErrorDisplayComponent({
|
|
|
53
50
|
const appStyles = R.prop(styleKeys.style_namespace, styles);
|
|
54
51
|
|
|
55
52
|
return (
|
|
56
|
-
<View style={errorStyles({
|
|
53
|
+
<View style={errorStyles({ backgroundColor })}>
|
|
57
54
|
<Text style={textStyles(appStyles)}>{stream_error_message}</Text>
|
|
58
55
|
</View>
|
|
59
56
|
);
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import * as R from "ramda";
|
|
3
|
+
import { GeneralContentScreen } from "@applicaster/zapp-react-native-ui-components/Components/GeneralContentScreen";
|
|
3
4
|
|
|
4
5
|
import { FeedLoader } from "../FeedLoader";
|
|
5
6
|
import { ScreenResolver } from "../ScreenResolver";
|
|
6
7
|
|
|
7
|
-
import type { ZappScreenProps } from "@applicaster/zapp-react-native-flow-types";
|
|
8
|
-
|
|
9
|
-
import { GeneralContentScreen } from "../GeneralContentScreen";
|
|
10
|
-
|
|
11
8
|
type Props = ZappScreenProps & {
|
|
12
9
|
feedUrl?: string;
|
|
13
10
|
isInsideContainer?: boolean;
|
|
@@ -18,6 +15,12 @@ type Props = ZappScreenProps & {
|
|
|
18
15
|
| import("react-native").FlatListProps<any>
|
|
19
16
|
) &
|
|
20
17
|
Record<string, any>;
|
|
18
|
+
appData: AppDataKeys;
|
|
19
|
+
screenTitle: string;
|
|
20
|
+
screenSummary: string;
|
|
21
|
+
setIsScreenWrappedInContainer: (isInsideContainer: boolean) => void;
|
|
22
|
+
screenContext: ZappRiver;
|
|
23
|
+
river: ZappRiver;
|
|
21
24
|
};
|
|
22
25
|
|
|
23
26
|
type State = {
|
|
@@ -27,7 +30,7 @@ type State = {
|
|
|
27
30
|
export class RiverComponent extends React.Component<Props, State> {
|
|
28
31
|
private currentScreenTitle: string;
|
|
29
32
|
private currentScreenSummary: string;
|
|
30
|
-
constructor(props) {
|
|
33
|
+
constructor(props: Props) {
|
|
31
34
|
super(props);
|
|
32
35
|
|
|
33
36
|
this.state = {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as R from "ramda";
|
|
2
2
|
|
|
3
3
|
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
4
|
-
import {
|
|
4
|
+
import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
5
5
|
import { toCamelCase } from "@applicaster/zapp-react-native-utils/stringUtils";
|
|
6
6
|
import { useMemo } from "react";
|
|
7
7
|
import { isNilOrEmpty } from "@applicaster/zapp-react-native-utils/reactUtils/helpers";
|
|
@@ -47,7 +47,7 @@ const stylingKeys = [
|
|
|
47
47
|
|
|
48
48
|
export function useScreenConfiguration(screenId: string): ScreenConfiguration {
|
|
49
49
|
const { rivers } = usePickFromState(["rivers"]);
|
|
50
|
-
const
|
|
50
|
+
const isTablet = useIsTablet();
|
|
51
51
|
|
|
52
52
|
return useMemo(() => {
|
|
53
53
|
const config = {} as ScreenConfiguration;
|
|
@@ -56,8 +56,7 @@ export function useScreenConfiguration(screenId: string): ScreenConfiguration {
|
|
|
56
56
|
if (screenData) {
|
|
57
57
|
const { styles } = screenData;
|
|
58
58
|
|
|
59
|
-
const keyPrefix =
|
|
60
|
-
deviceInfo?.isTablet && styles?.tablet_theme ? "tablet_" : "";
|
|
59
|
+
const keyPrefix = isTablet && styles?.tablet_theme ? "tablet_" : "";
|
|
61
60
|
|
|
62
61
|
stylingKeys.forEach(([key, castFn]) => {
|
|
63
62
|
const styleKey = `${keyPrefix}${key}`;
|
|
@@ -2,8 +2,6 @@ import * as React from "react";
|
|
|
2
2
|
import { View } from "react-native";
|
|
3
3
|
import { create, act } from "react-test-renderer";
|
|
4
4
|
|
|
5
|
-
import { ORIENTATIONS } from "@applicaster/zapp-react-native-utils/appUtils/orientationHelper";
|
|
6
|
-
|
|
7
5
|
const Mocked_RouteManager = jest.fn((props) => (
|
|
8
6
|
<View testID="routeManager" {...props} />
|
|
9
7
|
));
|
|
@@ -144,44 +142,44 @@ describe("<Screen Component />", () => {
|
|
|
144
142
|
});
|
|
145
143
|
});
|
|
146
144
|
|
|
147
|
-
it("invokes the orientation hook when the route changes", () => {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
});
|
|
145
|
+
// it("invokes the orientation hook when the route changes", () => {
|
|
146
|
+
// act(() => {
|
|
147
|
+
// wrapper = create(<Screen {...screenProps} />);
|
|
148
|
+
// });
|
|
149
|
+
|
|
150
|
+
// // @ts-ignore
|
|
151
|
+
// useCurrentScreenData.mockReturnValue({
|
|
152
|
+
// id: "player-testId",
|
|
153
|
+
// general: { screen_orientation: ORIENTATIONS.landscapeSensor },
|
|
154
|
+
// plugin_type: "player",
|
|
155
|
+
// });
|
|
156
|
+
|
|
157
|
+
// act(() => {
|
|
158
|
+
// wrapper.update(
|
|
159
|
+
// <Screen
|
|
160
|
+
// {...screenProps}
|
|
161
|
+
// pathname="/playable"
|
|
162
|
+
// screenData={{
|
|
163
|
+
// id: "player-testId",
|
|
164
|
+
// general: { screen_orientation: ORIENTATIONS.landscapeSensor },
|
|
165
|
+
// plugin_type: "player",
|
|
166
|
+
// }}
|
|
167
|
+
// />
|
|
168
|
+
// );
|
|
169
|
+
// });
|
|
170
|
+
|
|
171
|
+
// useCurrentScreenData.mockReturnValue({
|
|
172
|
+
// id: "player-testId",
|
|
173
|
+
// general: { screen_orientation: ORIENTATIONS.landscapeSensor },
|
|
174
|
+
// });
|
|
175
|
+
|
|
176
|
+
// act(() => {
|
|
177
|
+
// wrapper.update(<Screen {...screenProps} />);
|
|
178
|
+
// });
|
|
179
|
+
|
|
180
|
+
// expect(allowedOrientationsForScreen).toHaveBeenNthCalledWith(
|
|
181
|
+
// 1,
|
|
182
|
+
// ORIENTATIONS.landscapeSensor
|
|
183
|
+
// );
|
|
184
|
+
// });
|
|
187
185
|
});
|
|
@@ -7,7 +7,6 @@ import { useTheme } from "@applicaster/zapp-react-native-utils/theme";
|
|
|
7
7
|
import { useScreenOrientationHandler } from "./orientationHandler";
|
|
8
8
|
import { useScreenConfiguration } from "../River/useScreenConfiguration";
|
|
9
9
|
import { useCurrentScreenData } from "@applicaster/zapp-react-native-utils/reactHooks/screen";
|
|
10
|
-
import type { ZappNavigationProps } from "@applicaster/zapp-react-native-flow-types/index";
|
|
11
10
|
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
12
11
|
import { ScreenContextProvider } from "../../Contexts/ScreenContext";
|
|
13
12
|
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
|
|
9
9
|
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
10
10
|
import { findPluginByType } from "@applicaster/zapp-react-native-utils/pluginUtils";
|
|
11
|
-
import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks
|
|
11
|
+
import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
12
|
import { ZappHookModalContext } from "../../Contexts";
|
|
13
13
|
import { HookModalContextT } from "../../Contexts/ZappHookModalContext";
|
|
14
14
|
|
|
@@ -379,7 +379,9 @@ export class LiveImageManager implements PlayerLifecycleListener {
|
|
|
379
379
|
onLiveImageError = (item: LiveImage, error: Error) => {
|
|
380
380
|
item.setMode(LiveImageType.Image);
|
|
381
381
|
|
|
382
|
-
|
|
382
|
+
const currentItem = this.currentlyPlaying;
|
|
383
|
+
|
|
384
|
+
if (currentItem === item) {
|
|
383
385
|
this.currentlyPlaying = null;
|
|
384
386
|
// TODO: ...Maybe player some other item
|
|
385
387
|
}
|
|
@@ -389,8 +391,8 @@ export class LiveImageManager implements PlayerLifecycleListener {
|
|
|
389
391
|
event: {
|
|
390
392
|
item,
|
|
391
393
|
error,
|
|
392
|
-
playerId:
|
|
393
|
-
primaryPlayerId:
|
|
394
|
+
playerId: currentItem?.playerId,
|
|
395
|
+
primaryPlayerId: currentItem?.playerId,
|
|
394
396
|
},
|
|
395
397
|
});
|
|
396
398
|
};
|
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
Dimensions,
|
|
4
|
+
Platform,
|
|
5
|
+
StyleSheet,
|
|
6
|
+
View,
|
|
7
|
+
ViewStyle,
|
|
8
|
+
} from "react-native";
|
|
3
9
|
import { Edge, SafeAreaView } from "react-native-safe-area-context";
|
|
4
10
|
|
|
5
11
|
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
6
|
-
import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks
|
|
12
|
+
import { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
7
13
|
import { PlayerDetails } from "./PlayerDetails";
|
|
8
14
|
import { playerDimesionsHack } from "./utils";
|
|
9
15
|
import { PathnameContext } from "../../Contexts/PathnameContext";
|
|
10
|
-
import { useDimensions } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
11
16
|
import { ScreenContextProvider } from "../../Contexts/ScreenContext";
|
|
12
17
|
|
|
13
|
-
type
|
|
14
|
-
width: number;
|
|
15
|
-
height: number;
|
|
18
|
+
type DimensionsT = {
|
|
19
|
+
width: number | string;
|
|
20
|
+
height: number | string;
|
|
21
|
+
aspectRatio?: number;
|
|
16
22
|
};
|
|
17
23
|
|
|
18
24
|
type Configuration = {
|
|
@@ -23,25 +29,21 @@ type Configuration = {
|
|
|
23
29
|
|
|
24
30
|
type Props = {
|
|
25
31
|
entry: ZappEntry;
|
|
26
|
-
style: ViewStyle &
|
|
32
|
+
style: ViewStyle & DimensionsT;
|
|
27
33
|
containerStyle?: ViewStyle;
|
|
28
34
|
inline?: boolean;
|
|
29
35
|
docked?: boolean;
|
|
36
|
+
pip?: boolean;
|
|
30
37
|
isModal?: boolean;
|
|
31
38
|
fullscreen?: boolean;
|
|
32
39
|
isTabletPortrait?: boolean;
|
|
33
|
-
children: (playerDimensions:
|
|
40
|
+
children: (playerDimensions: DimensionsT) => React.ReactNode;
|
|
34
41
|
configuration: Configuration;
|
|
35
42
|
};
|
|
36
43
|
|
|
37
44
|
const defaultStyles = StyleSheet.create({
|
|
38
45
|
playerContainer: { position: "relative", alignSelf: "center", zIndex: 200 },
|
|
39
46
|
playerDetails: { flex: 1, paddingTop: 20 },
|
|
40
|
-
inlinePlayerContainerDimensions: {
|
|
41
|
-
aspectRatio: 16 / 9,
|
|
42
|
-
width: "100%",
|
|
43
|
-
height: undefined,
|
|
44
|
-
},
|
|
45
47
|
});
|
|
46
48
|
|
|
47
49
|
const orientationStyles = StyleSheet.create({
|
|
@@ -57,6 +59,15 @@ const directionStyles = (isTabletLandscape: boolean): ViewStyle => {
|
|
|
57
59
|
return orientationStyles.portrait;
|
|
58
60
|
};
|
|
59
61
|
|
|
62
|
+
const getScreenAspectRatio = () => {
|
|
63
|
+
const { width, height } = Dimensions.get("screen");
|
|
64
|
+
|
|
65
|
+
const longEdge = Math.max(width, height);
|
|
66
|
+
const shortEdge = Math.min(width, height);
|
|
67
|
+
|
|
68
|
+
return longEdge / shortEdge;
|
|
69
|
+
};
|
|
70
|
+
|
|
60
71
|
const safeAreaStyles = (
|
|
61
72
|
configuration: Configuration,
|
|
62
73
|
isTablet: boolean
|
|
@@ -71,34 +82,6 @@ const safeAreaStyles = (
|
|
|
71
82
|
};
|
|
72
83
|
};
|
|
73
84
|
|
|
74
|
-
const getTabletWidth = (
|
|
75
|
-
configuration: Configuration,
|
|
76
|
-
dimensions: Dimensions
|
|
77
|
-
) => {
|
|
78
|
-
const tablet_landscape_sidebar_width =
|
|
79
|
-
configuration?.tablet_landscape_sidebar_width;
|
|
80
|
-
|
|
81
|
-
const { width } = dimensions;
|
|
82
|
-
|
|
83
|
-
const sidebarWidth = Number(tablet_landscape_sidebar_width?.replace("%", ""));
|
|
84
|
-
|
|
85
|
-
if (tablet_landscape_sidebar_width?.includes("%")) {
|
|
86
|
-
return width * (1 - sidebarWidth / 100);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
if (Number.isNaN(sidebarWidth)) {
|
|
90
|
-
return width * 0.65;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
return width - sidebarWidth;
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
export const defaultAspectRatioHeight = (width: number): number =>
|
|
97
|
-
(width / 16) * 9;
|
|
98
|
-
|
|
99
|
-
export const defaultAspectRatioWidth = (height: number): number =>
|
|
100
|
-
(height / 9) * 16;
|
|
101
|
-
|
|
102
85
|
const getEdges = (
|
|
103
86
|
isTablet: boolean,
|
|
104
87
|
docked: boolean,
|
|
@@ -120,6 +103,28 @@ const getEdges = (
|
|
|
120
103
|
return ["top"];
|
|
121
104
|
};
|
|
122
105
|
|
|
106
|
+
const getTabletWidth = (
|
|
107
|
+
configuration: Configuration,
|
|
108
|
+
dimensions: DimensionsT
|
|
109
|
+
) => {
|
|
110
|
+
const tablet_landscape_sidebar_width =
|
|
111
|
+
configuration?.tablet_landscape_sidebar_width;
|
|
112
|
+
|
|
113
|
+
const { width } = dimensions;
|
|
114
|
+
|
|
115
|
+
const sidebarWidth = Number(tablet_landscape_sidebar_width?.replace("%", ""));
|
|
116
|
+
|
|
117
|
+
if (tablet_landscape_sidebar_width?.includes("%")) {
|
|
118
|
+
return Number(width) * (1 - sidebarWidth / 100);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (Number.isNaN(sidebarWidth)) {
|
|
122
|
+
return Number(width) * 0.65;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return Number(width) - sidebarWidth;
|
|
126
|
+
};
|
|
127
|
+
|
|
123
128
|
export const PlayerWrapper = (props: Props) => {
|
|
124
129
|
const {
|
|
125
130
|
entry,
|
|
@@ -131,6 +136,7 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
131
136
|
children,
|
|
132
137
|
isTabletPortrait,
|
|
133
138
|
configuration,
|
|
139
|
+
pip,
|
|
134
140
|
} = props;
|
|
135
141
|
|
|
136
142
|
const isTablet = useIsTablet();
|
|
@@ -141,40 +147,38 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
141
147
|
|
|
142
148
|
const tabletWidth = getTabletWidth(configuration, style);
|
|
143
149
|
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
const containerDimensions: Dimensions = React.useMemo(
|
|
150
|
+
const baseDimensions: DimensionsT = React.useMemo(
|
|
147
151
|
() => ({
|
|
148
152
|
width:
|
|
149
|
-
isInlineModal && !docked && isTabletLandscape
|
|
150
|
-
|
|
151
|
-
: style.width,
|
|
152
|
-
height:
|
|
153
|
-
isInlineModal && !docked
|
|
154
|
-
? defaultAspectRatioHeight(
|
|
155
|
-
isTabletLandscape ? tabletWidth : screenWidth
|
|
156
|
-
)
|
|
157
|
-
: style.height,
|
|
153
|
+
isInlineModal && !docked && isTabletLandscape ? tabletWidth : "100%",
|
|
154
|
+
height: isInlineModal && docked ? style.height : undefined,
|
|
158
155
|
}),
|
|
159
|
-
[isInlineModal,
|
|
156
|
+
[isInlineModal, tabletWidth, style.height, docked]
|
|
160
157
|
);
|
|
161
158
|
|
|
162
|
-
const playerDimensions:
|
|
159
|
+
const playerDimensions: DimensionsT = React.useMemo(
|
|
163
160
|
() => ({
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
161
|
+
...baseDimensions,
|
|
162
|
+
width: isInlineModal && docked ? undefined : baseDimensions.width,
|
|
163
|
+
aspectRatio: !isInlineModal && !pip ? getScreenAspectRatio() : 16 / 9,
|
|
164
|
+
}),
|
|
165
|
+
[baseDimensions, isInlineModal]
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const containerDimensions: DimensionsT = React.useMemo(
|
|
169
|
+
() => ({
|
|
170
|
+
...baseDimensions,
|
|
171
|
+
aspectRatio:
|
|
172
|
+
isInlineModal && docked ? undefined : playerDimensions.aspectRatio,
|
|
169
173
|
}),
|
|
170
|
-
[isInlineModal, docked,
|
|
174
|
+
[baseDimensions, isInlineModal, docked, playerDimensions.aspectRatio]
|
|
171
175
|
);
|
|
172
176
|
|
|
173
177
|
const WrapperView = React.useMemo(() => (isTV() ? View : SafeAreaView), []);
|
|
174
178
|
|
|
175
179
|
const childrenStyles = React.useMemo(
|
|
176
180
|
() => ({ ...playerDimensions, ...playerDimesionsHack }),
|
|
177
|
-
[
|
|
181
|
+
[containerDimensions, playerDimesionsHack]
|
|
178
182
|
);
|
|
179
183
|
|
|
180
184
|
return (
|
|
@@ -195,9 +199,6 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
195
199
|
defaultStyles.playerContainer,
|
|
196
200
|
containerDimensions,
|
|
197
201
|
containerStyle,
|
|
198
|
-
isInlineModal && !docked && !isTabletLandscape
|
|
199
|
-
? defaultStyles.inlinePlayerContainerDimensions
|
|
200
|
-
: {},
|
|
201
202
|
playerDimesionsHack,
|
|
202
203
|
]}
|
|
203
204
|
>
|
|
@@ -50,7 +50,7 @@ jest.mock("@applicaster/zapp-react-native-utils/reactHooks/navigation", () => ({
|
|
|
50
50
|
|
|
51
51
|
jest.mock("../utils", () => ({ playerDimesionsHack: {} }));
|
|
52
52
|
|
|
53
|
-
const { PlayerWrapper
|
|
53
|
+
const { PlayerWrapper } = require("../PlayerWrapper");
|
|
54
54
|
|
|
55
55
|
jest.useFakeTimers();
|
|
56
56
|
const children = jest.fn(() => {});
|
|
@@ -110,7 +110,8 @@ describe("PlayerWrapper", () => {
|
|
|
110
110
|
|
|
111
111
|
const expectDimensions = {
|
|
112
112
|
...dimensions,
|
|
113
|
-
width:
|
|
113
|
+
width: undefined,
|
|
114
|
+
aspectRatio: 16 / 9,
|
|
114
115
|
};
|
|
115
116
|
|
|
116
117
|
expect(element).toMatchSnapshot();
|
|
@@ -34,17 +34,13 @@ exports[`PlayerWrapper renders inline 1`] = `
|
|
|
34
34
|
"position": "relative",
|
|
35
35
|
"zIndex": 200,
|
|
36
36
|
},
|
|
37
|
-
Object {
|
|
38
|
-
"height": 421.875,
|
|
39
|
-
"width": 300,
|
|
40
|
-
},
|
|
41
|
-
Object {},
|
|
42
37
|
Object {
|
|
43
38
|
"aspectRatio": 1.7777777777777777,
|
|
44
39
|
"height": undefined,
|
|
45
40
|
"width": "100%",
|
|
46
41
|
},
|
|
47
42
|
Object {},
|
|
43
|
+
Object {},
|
|
48
44
|
]
|
|
49
45
|
}
|
|
50
46
|
testID="test-player-container"
|
|
@@ -107,12 +103,12 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
|
|
|
107
103
|
"zIndex": 200,
|
|
108
104
|
},
|
|
109
105
|
Object {
|
|
106
|
+
"aspectRatio": undefined,
|
|
110
107
|
"height": 50,
|
|
111
|
-
"width":
|
|
108
|
+
"width": "100%",
|
|
112
109
|
},
|
|
113
110
|
Object {},
|
|
114
111
|
Object {},
|
|
115
|
-
Object {},
|
|
116
112
|
]
|
|
117
113
|
}
|
|
118
114
|
testID="test-player-container"
|
|
@@ -163,12 +159,12 @@ exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
|
|
|
163
159
|
"zIndex": 200,
|
|
164
160
|
},
|
|
165
161
|
Object {
|
|
166
|
-
"
|
|
162
|
+
"aspectRatio": 1.7777777777777777,
|
|
163
|
+
"height": undefined,
|
|
167
164
|
"width": 195,
|
|
168
165
|
},
|
|
169
166
|
Object {},
|
|
170
167
|
Object {},
|
|
171
|
-
Object {},
|
|
172
168
|
]
|
|
173
169
|
}
|
|
174
170
|
testID="test-player-container"
|
|
@@ -231,12 +227,12 @@ exports[`PlayerWrapper renders properly 1`] = `
|
|
|
231
227
|
"zIndex": 200,
|
|
232
228
|
},
|
|
233
229
|
Object {
|
|
234
|
-
"
|
|
235
|
-
"
|
|
230
|
+
"aspectRatio": 1.7786666666666666,
|
|
231
|
+
"height": undefined,
|
|
232
|
+
"width": "100%",
|
|
236
233
|
},
|
|
237
234
|
Object {},
|
|
238
235
|
Object {},
|
|
239
|
-
Object {},
|
|
240
236
|
]
|
|
241
237
|
}
|
|
242
238
|
testID="test-player-container"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import * as React from "react";
|
|
2
2
|
import { Dimensions } from "react-native";
|
|
3
3
|
import { useIsTabletLandscape } from "@applicaster/zapp-react-native-utils/reactHooks/device/useMemoizedIsTablet";
|
|
4
4
|
import {
|
|
@@ -39,13 +39,22 @@ export const useModalSize = (): Size => {
|
|
|
39
39
|
MODAL_SIZE_FOR_PORTRAIT
|
|
40
40
|
);
|
|
41
41
|
|
|
42
|
-
const setNewModalSize = (
|
|
43
|
-
setModalSize(
|
|
42
|
+
const setNewModalSize = React.useCallback((newSize, log) => {
|
|
43
|
+
setModalSize((oldSize) => {
|
|
44
|
+
if (
|
|
45
|
+
oldSize.height === newSize.height &&
|
|
46
|
+
oldSize.width === newSize.width
|
|
47
|
+
) {
|
|
48
|
+
return oldSize;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return newSize;
|
|
52
|
+
});
|
|
44
53
|
|
|
45
54
|
logger.debug({
|
|
46
55
|
message: log,
|
|
47
56
|
});
|
|
48
|
-
};
|
|
57
|
+
}, []);
|
|
49
58
|
|
|
50
59
|
const isTabletLandscape = useIsTabletLandscape();
|
|
51
60
|
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
|
|
3
|
-
import type {
|
|
4
|
-
ZappComponent,
|
|
5
|
-
ZappRivers,
|
|
6
|
-
} from "@applicaster/zapp-react-native-flow-types";
|
|
7
3
|
import { usePickFromState } from "@applicaster/zapp-react-native-redux/hooks";
|
|
8
4
|
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
9
5
|
import { usePathname } from "@applicaster/zapp-react-native-utils/reactHooks/navigation";
|
package/Decorators/index.tsx
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/zapp-react-native-ui-components",
|
|
3
|
-
"version": "12.0.0-alpha.
|
|
3
|
+
"version": "12.0.0-alpha.5114122134",
|
|
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",
|
|
@@ -29,16 +29,15 @@
|
|
|
29
29
|
},
|
|
30
30
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@applicaster/zapp-react-native-flow-types": "1.5.0",
|
|
33
32
|
"@types/react": "17.0.2",
|
|
34
33
|
"@types/react-native": "0.69.6",
|
|
35
34
|
"redux-mock-store": "^1.5.3"
|
|
36
35
|
},
|
|
37
36
|
"dependencies": {
|
|
38
|
-
"@applicaster/applicaster-types": "12.0.0-alpha.
|
|
39
|
-
"@applicaster/zapp-react-native-bridge": "12.0.0-alpha.
|
|
40
|
-
"@applicaster/zapp-react-native-redux": "12.0.0-alpha.
|
|
41
|
-
"@applicaster/zapp-react-native-utils": "12.0.0-alpha.
|
|
37
|
+
"@applicaster/applicaster-types": "12.0.0-alpha.5114122134",
|
|
38
|
+
"@applicaster/zapp-react-native-bridge": "12.0.0-alpha.5114122134",
|
|
39
|
+
"@applicaster/zapp-react-native-redux": "12.0.0-alpha.5114122134",
|
|
40
|
+
"@applicaster/zapp-react-native-utils": "12.0.0-alpha.5114122134",
|
|
42
41
|
"promise": "^8.3.0",
|
|
43
42
|
"react-router-native": "^5.1.2",
|
|
44
43
|
"url": "^0.11.0",
|