@applicaster/quick-brick-player 14.0.0-alpha.3552323332 → 14.0.0-alpha.3652810444
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/package.json +6 -11
- package/src/Player/AudioLayer/Layout/Controls/index.tsx +8 -18
- package/src/Player/AudioLayer/Layout/DockedControls/index.tsx +18 -8
- package/src/Player/AudioLayer/Layout/MobileLayout.tsx +4 -22
- package/src/Player/AudioLayer/Layout/PlayerImage/AnimatedImage.tsx +48 -8
- package/src/Player/AudioLayer/Layout/PlayerImage/FlexImage.tsx +5 -9
- package/src/Player/AudioLayer/Layout/PlayerImage/index.tsx +1 -0
- package/src/Player/AudioLayer/Layout/TabletLandscapeLayout.tsx +1 -42
- package/src/Player/AudioLayer/Layout/TabletPortraitLayout.tsx +0 -33
- package/src/Player/AudioLayer/Layout/TransportInfo/index.tsx +3 -9
- package/src/Player/AudioLayer/components/SleepTimerModalHeader/SleepTimerModalHeader.tsx +1 -1
- package/src/Player/PlayerModal/GestureAnimatedScrollView.ts +7 -0
- package/src/Player/PlayerModal/PlayerModal.tsx +10 -11
- package/src/Player/PlayerModal/VideoPlayerModal.tsx +106 -97
- package/src/Player/PlayerModal/consts/index.ts +20 -6
- package/src/Player/PlayerModal/hooks/index.ts +112 -90
- package/src/Player/PlayerModal/index.web.ts +5 -0
- package/src/Player/PlayerModal/styles.ts +50 -42
- package/src/Player/PlayerView/GenericTVPlayerView.tsx +1 -2
- package/src/Player/index.tsx +3 -8
- /package/src/Player/AudioLayer/Layout/{Debug → DebugComponent}/index.tsx +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@applicaster/quick-brick-player",
|
|
3
|
-
"version": "14.0.0-alpha.
|
|
3
|
+
"version": "14.0.0-alpha.3652810444",
|
|
4
4
|
"description": "Quick Brick Player",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -35,13 +35,12 @@
|
|
|
35
35
|
},
|
|
36
36
|
"homepage": "https://github.com/applicaster/quickbrick#readme",
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@applicaster/quick-brick-mobile-transport-controls": "14.0.0-
|
|
39
|
-
"@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.
|
|
40
|
-
"@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.
|
|
41
|
-
"@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.
|
|
42
|
-
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.
|
|
38
|
+
"@applicaster/quick-brick-mobile-transport-controls": "14.0.0-rc.56",
|
|
39
|
+
"@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.58",
|
|
40
|
+
"@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.3652810444",
|
|
41
|
+
"@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.3652810444",
|
|
42
|
+
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.3652810444",
|
|
43
43
|
"query-string": "7.1.3",
|
|
44
|
-
"react-native-web-linear-gradient": "1.1.2",
|
|
45
44
|
"shaka-player": "4.3.5",
|
|
46
45
|
"typeface-montserrat": "^0.0.54",
|
|
47
46
|
"video.js": "7.14.3",
|
|
@@ -58,15 +57,11 @@
|
|
|
58
57
|
"@applicaster/zapp-react-native-tvos-ui-components": "*",
|
|
59
58
|
"@babel/runtime": "*",
|
|
60
59
|
"@react-native-community/netinfo": "*",
|
|
61
|
-
"immer": "*",
|
|
62
60
|
"react": "*",
|
|
63
61
|
"react-native": "*",
|
|
64
62
|
"react-native-fs": "*",
|
|
65
|
-
"react-native-gesture-handler": "*",
|
|
66
63
|
"react-native-linear-gradient": "*",
|
|
67
|
-
"react-native-safe-area-context": "*",
|
|
68
64
|
"react-native-svg": "*",
|
|
69
|
-
"react-native-web": "*",
|
|
70
65
|
"react-native-webview": "*",
|
|
71
66
|
"uglify-js": "*",
|
|
72
67
|
"validate-color": "*",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { StyleSheet } from "react-native";
|
|
2
|
+
import { StyleSheet, View } from "react-native";
|
|
3
3
|
|
|
4
4
|
import { dayjs } from "@applicaster/zapp-react-native-utils/dateUtils";
|
|
5
5
|
import {
|
|
@@ -12,11 +12,6 @@ import {
|
|
|
12
12
|
} from "@applicaster/quick-brick-mobile-transport-controls";
|
|
13
13
|
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
14
14
|
|
|
15
|
-
import {
|
|
16
|
-
AnimationComponent,
|
|
17
|
-
ComponentAnimationType,
|
|
18
|
-
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
19
|
-
|
|
20
15
|
import { AudioDescription } from "../../AudioDescription";
|
|
21
16
|
import { isValidDate } from "../../../Utils";
|
|
22
17
|
import { VerticalGutter } from "./VerticalGutter";
|
|
@@ -103,8 +98,6 @@ export const Controls = (props: Props) => {
|
|
|
103
98
|
onSkipLive,
|
|
104
99
|
onSpeedButtonPress,
|
|
105
100
|
maxWidth = 320,
|
|
106
|
-
|
|
107
|
-
docked,
|
|
108
101
|
} = props;
|
|
109
102
|
|
|
110
103
|
const configuration = useZStore("playerConfiguration");
|
|
@@ -229,15 +222,8 @@ export const Controls = (props: Props) => {
|
|
|
229
222
|
isLiveShowFullControls,
|
|
230
223
|
]);
|
|
231
224
|
|
|
232
|
-
if (docked) {
|
|
233
|
-
return null;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
225
|
return (
|
|
237
|
-
<
|
|
238
|
-
animationType={ComponentAnimationType.componentFade}
|
|
239
|
-
style={isTablet ? styles.nonFlex : styles.flex}
|
|
240
|
-
>
|
|
226
|
+
<View style={isTablet ? styles.nonFlex : styles.flex}>
|
|
241
227
|
<VerticalGutter />
|
|
242
228
|
|
|
243
229
|
<AudioDescription
|
|
@@ -257,7 +243,11 @@ export const Controls = (props: Props) => {
|
|
|
257
243
|
content={entry}
|
|
258
244
|
value={value}
|
|
259
245
|
visible
|
|
260
|
-
layoutState={
|
|
246
|
+
layoutState={{
|
|
247
|
+
...layoutState,
|
|
248
|
+
docked: false, // always use non-docked layout for audio (to show time labels
|
|
249
|
+
inline: true, // always use inline layout for audio (to show time labels)
|
|
250
|
+
}}
|
|
261
251
|
onPlayerSeek={onPlayerSeek}
|
|
262
252
|
playerState={playerState}
|
|
263
253
|
disableFullscreen
|
|
@@ -286,6 +276,6 @@ export const Controls = (props: Props) => {
|
|
|
286
276
|
}}
|
|
287
277
|
playerState={playerState}
|
|
288
278
|
/>
|
|
289
|
-
</
|
|
279
|
+
</View>
|
|
290
280
|
);
|
|
291
281
|
};
|
|
@@ -18,10 +18,15 @@ import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Compo
|
|
|
18
18
|
|
|
19
19
|
import { toNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
20
20
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
21
|
+
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
|
|
21
22
|
import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/getTabBarHeight";
|
|
22
23
|
import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
|
|
23
24
|
import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
|
|
24
25
|
import { useConfiguration } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/utils";
|
|
26
|
+
import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
|
|
27
|
+
import { PROGRESS_BAR_HEIGHT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/utils";
|
|
28
|
+
import { isMenuVisible } from "@applicaster/zapp-react-native-ui-components/Components/Screen/navigationHandler";
|
|
29
|
+
import { usePlugins } from "@applicaster/zapp-react-native-redux";
|
|
25
30
|
|
|
26
31
|
const bottomTabBarHeight = getTabBarHeight();
|
|
27
32
|
|
|
@@ -38,7 +43,6 @@ type Props = {
|
|
|
38
43
|
ImageComponent?: React.ReactNode;
|
|
39
44
|
isActiveGesture?: boolean;
|
|
40
45
|
minimisedHeight: number;
|
|
41
|
-
progressBarHeight: number;
|
|
42
46
|
aspectRatio?: number;
|
|
43
47
|
};
|
|
44
48
|
|
|
@@ -47,7 +51,7 @@ const styles = StyleSheet.create({
|
|
|
47
51
|
flex: 1,
|
|
48
52
|
flexDirection: "column",
|
|
49
53
|
alignItems: "stretch",
|
|
50
|
-
marginTop:
|
|
54
|
+
marginTop: PROGRESS_BAR_HEIGHT,
|
|
51
55
|
},
|
|
52
56
|
content: {
|
|
53
57
|
flex: 1,
|
|
@@ -160,7 +164,7 @@ export const DockedControls = (props: Props) => {
|
|
|
160
164
|
const {
|
|
161
165
|
entry,
|
|
162
166
|
layoutState,
|
|
163
|
-
onPlayerSeek,
|
|
167
|
+
onPlayerSeek = noop,
|
|
164
168
|
playNextData,
|
|
165
169
|
ImageComponent,
|
|
166
170
|
isActiveGesture = true,
|
|
@@ -171,6 +175,11 @@ export const DockedControls = (props: Props) => {
|
|
|
171
175
|
playerManager.close();
|
|
172
176
|
}, []);
|
|
173
177
|
|
|
178
|
+
const { currentRoute, screenData } = useNavigation();
|
|
179
|
+
|
|
180
|
+
const plugins = usePlugins();
|
|
181
|
+
const menuVisible = isMenuVisible(currentRoute, screenData, plugins);
|
|
182
|
+
|
|
174
183
|
const { minimised_height: minimisedHeight } = useConfiguration();
|
|
175
184
|
|
|
176
185
|
const configuration = useZStore("playerConfiguration")();
|
|
@@ -210,8 +219,6 @@ export const DockedControls = (props: Props) => {
|
|
|
210
219
|
|
|
211
220
|
const liveButton = Boolean(value("live_badge_enabled"));
|
|
212
221
|
|
|
213
|
-
const startComponentsAnimation = () => {};
|
|
214
|
-
|
|
215
222
|
const dockedBackgroundColor = value("docked_player_background_color");
|
|
216
223
|
|
|
217
224
|
const insets = useSafeAreaInsets();
|
|
@@ -221,7 +228,10 @@ export const DockedControls = (props: Props) => {
|
|
|
221
228
|
style={[
|
|
222
229
|
styles.container,
|
|
223
230
|
{
|
|
224
|
-
height:
|
|
231
|
+
height:
|
|
232
|
+
minimisedHeight +
|
|
233
|
+
(menuVisible ? bottomTabBarHeight : 0) +
|
|
234
|
+
insets.bottom,
|
|
225
235
|
},
|
|
226
236
|
]}
|
|
227
237
|
>
|
|
@@ -234,7 +244,7 @@ export const DockedControls = (props: Props) => {
|
|
|
234
244
|
layoutState={layoutState}
|
|
235
245
|
onPlayerSeek={onPlayerSeek}
|
|
236
246
|
playerState={playerState}
|
|
237
|
-
startComponentsAnimation={
|
|
247
|
+
startComponentsAnimation={noop}
|
|
238
248
|
docked
|
|
239
249
|
/>
|
|
240
250
|
) : null}
|
|
@@ -296,7 +306,7 @@ export const DockedControls = (props: Props) => {
|
|
|
296
306
|
</View>
|
|
297
307
|
<View
|
|
298
308
|
style={{
|
|
299
|
-
height: insets.bottom + bottomTabBarHeight,
|
|
309
|
+
height: insets.bottom + (menuVisible ? bottomTabBarHeight : 0),
|
|
300
310
|
backgroundColor: dockedBackgroundColor,
|
|
301
311
|
}}
|
|
302
312
|
/>
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
useSafeAreaFrame,
|
|
5
5
|
useSafeAreaInsets,
|
|
6
6
|
} from "react-native-safe-area-context";
|
|
7
|
-
import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
8
7
|
|
|
9
8
|
import { MOBILE, NAVBAR_HEIGHT } from "./const";
|
|
10
9
|
import { TransportInfo } from "./TransportInfo";
|
|
@@ -17,7 +16,7 @@ import {
|
|
|
17
16
|
BottomDebugSquare,
|
|
18
17
|
LeftDebugSquare,
|
|
19
18
|
RightDebugSquare,
|
|
20
|
-
} from "./
|
|
19
|
+
} from "./DebugComponent";
|
|
21
20
|
|
|
22
21
|
import { Props } from "./types";
|
|
23
22
|
|
|
@@ -79,8 +78,6 @@ export function MobileLayout({
|
|
|
79
78
|
onSpeedButtonPress,
|
|
80
79
|
playbackSpeedName,
|
|
81
80
|
configuration,
|
|
82
|
-
dimensions,
|
|
83
|
-
playNextData,
|
|
84
81
|
title,
|
|
85
82
|
summary,
|
|
86
83
|
}: Props) {
|
|
@@ -88,12 +85,10 @@ export function MobileLayout({
|
|
|
88
85
|
|
|
89
86
|
const { bottom: bottomInset, top: topInset } = useSafeAreaInsets();
|
|
90
87
|
const { height: screenHeight } = useSafeAreaFrame();
|
|
91
|
-
const { progressBarHeight } = useModalAnimationContext();
|
|
92
88
|
|
|
93
89
|
const { imageSize } = useMobileLayoutImageSize();
|
|
94
90
|
|
|
95
|
-
const {
|
|
96
|
-
useTransportInfoHeight();
|
|
91
|
+
const { onLayout: onTransportInfoLayout } = useTransportInfoHeight();
|
|
97
92
|
|
|
98
93
|
const controlsContainerHeight = React.useMemo(() => {
|
|
99
94
|
return (
|
|
@@ -107,10 +102,6 @@ export function MobileLayout({
|
|
|
107
102
|
);
|
|
108
103
|
}, [screenHeight, topInset, imageSize, bottomInset]);
|
|
109
104
|
|
|
110
|
-
const verticalOffsetForImage = React.useMemo(() => {
|
|
111
|
-
return transportInfoHeight + MOBILE.MARGIN_TOP - progressBarHeight;
|
|
112
|
-
}, [transportInfoHeight, progressBarHeight]);
|
|
113
|
-
|
|
114
105
|
return (
|
|
115
106
|
<View
|
|
116
107
|
style={[
|
|
@@ -162,18 +153,9 @@ export function MobileLayout({
|
|
|
162
153
|
>
|
|
163
154
|
<PlayerImage
|
|
164
155
|
entry={entry}
|
|
165
|
-
|
|
166
|
-
playerState={playerState}
|
|
167
|
-
value={value}
|
|
168
|
-
configuration={configuration}
|
|
169
|
-
onPlayerSeek={onPlayerSeek}
|
|
170
|
-
dimensions={dimensions}
|
|
171
|
-
playNextData={playNextData}
|
|
172
|
-
title={title}
|
|
173
|
-
summary={summary}
|
|
174
|
-
docked={docked}
|
|
156
|
+
docked={false}
|
|
175
157
|
imageWidth={imageSize}
|
|
176
|
-
|
|
158
|
+
configuration={configuration}
|
|
177
159
|
/>
|
|
178
160
|
</View>
|
|
179
161
|
{/* PlayerImage */}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import React, { PropsWithChildren } from "react";
|
|
2
2
|
import { Image, Animated, StyleSheet, ImageStyle } from "react-native";
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
useModalAnimationContext,
|
|
6
|
+
PlayerAnimationStateEnum,
|
|
7
|
+
DURATION_TO_MINIMIZE,
|
|
8
|
+
DURATION_TO_MAXIMIZE,
|
|
9
|
+
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
10
|
+
import { PlayerAnimationStateT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/ModalAnimationContext";
|
|
11
|
+
import { useBackgroundImage } from "@applicaster/zapp-react-native-utils/audioPlayerUtils";
|
|
12
|
+
|
|
13
|
+
import { useChangePlayerState } from "./hooks";
|
|
5
14
|
|
|
6
15
|
const styles = StyleSheet.create({
|
|
7
16
|
container: {
|
|
@@ -15,17 +24,48 @@ type Props = PropsWithChildren<{
|
|
|
15
24
|
entry: ZappEntry;
|
|
16
25
|
style?: ImageStyle | ImageStyle[];
|
|
17
26
|
imageWidth: number;
|
|
27
|
+
docked: boolean;
|
|
18
28
|
}>;
|
|
19
29
|
|
|
20
|
-
export const AnimatedImage = ({ entry, style, imageWidth }: Props) => {
|
|
30
|
+
export const AnimatedImage = ({ entry, style, imageWidth, docked }: Props) => {
|
|
21
31
|
const heightAnim = React.useRef(new Animated.Value(imageWidth)).current;
|
|
22
32
|
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
33
|
+
const backgroundImageSource = useBackgroundImage(entry);
|
|
34
|
+
|
|
35
|
+
const { minimisedHeight } = useModalAnimationContext();
|
|
36
|
+
|
|
37
|
+
const changePlayerState$ = useChangePlayerState({ docked });
|
|
38
|
+
|
|
39
|
+
React.useEffect(() => {
|
|
40
|
+
const subscription = changePlayerState$.subscribe({
|
|
41
|
+
next: (nextPlayerState: PlayerAnimationStateT) => {
|
|
42
|
+
if (nextPlayerState === PlayerAnimationStateEnum.minimize) {
|
|
43
|
+
Animated.timing(heightAnim, {
|
|
44
|
+
toValue: minimisedHeight,
|
|
45
|
+
duration: DURATION_TO_MINIMIZE,
|
|
46
|
+
useNativeDriver: false, // width/height can't use native driver
|
|
47
|
+
}).start();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (nextPlayerState === PlayerAnimationStateEnum.maximize) {
|
|
51
|
+
Animated.timing(heightAnim, {
|
|
52
|
+
toValue: imageWidth,
|
|
53
|
+
duration: DURATION_TO_MAXIMIZE,
|
|
54
|
+
useNativeDriver: false, // width/height can't use native driver
|
|
55
|
+
}).start();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (nextPlayerState === PlayerAnimationStateEnum.appear_as_docked) {
|
|
59
|
+
// minimize image immediatly
|
|
60
|
+
heightAnim.setValue(minimisedHeight);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
});
|
|
27
64
|
|
|
28
|
-
|
|
65
|
+
return () => {
|
|
66
|
+
subscription.unsubscribe();
|
|
67
|
+
};
|
|
68
|
+
}, [changePlayerState$, minimisedHeight, imageWidth]);
|
|
29
69
|
|
|
30
70
|
return (
|
|
31
71
|
<Animated.View
|
|
@@ -36,7 +76,7 @@ export const AnimatedImage = ({ entry, style, imageWidth }: Props) => {
|
|
|
36
76
|
},
|
|
37
77
|
]}
|
|
38
78
|
>
|
|
39
|
-
<Image resizeMode="cover" style={style} source={
|
|
79
|
+
<Image resizeMode="cover" style={style} source={backgroundImageSource} />
|
|
40
80
|
</Animated.View>
|
|
41
81
|
);
|
|
42
82
|
};
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { Image, ImageStyle } from "react-native";
|
|
3
|
-
|
|
4
|
-
import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
|
|
3
|
+
import { useBackgroundImage } from "@applicaster/zapp-react-native-utils/audioPlayerUtils";
|
|
5
4
|
|
|
6
5
|
type Props = {
|
|
7
6
|
entry: ZappEntry;
|
|
@@ -9,12 +8,9 @@ type Props = {
|
|
|
9
8
|
};
|
|
10
9
|
|
|
11
10
|
export const FlexImage = ({ entry, style }: Props) => {
|
|
12
|
-
const
|
|
13
|
-
() => ({ uri: imageSrcFromMediaItem(entry, undefined) }),
|
|
14
|
-
[entry]
|
|
15
|
-
);
|
|
11
|
+
const backgroundImageSource = useBackgroundImage(entry);
|
|
16
12
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
13
|
+
return (
|
|
14
|
+
<Image resizeMode="cover" style={style} source={backgroundImageSource} />
|
|
15
|
+
);
|
|
20
16
|
};
|
|
@@ -1,11 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { StyleSheet, View } from "react-native";
|
|
3
|
-
import {
|
|
4
|
-
useSafeAreaFrame,
|
|
5
|
-
useSafeAreaInsets,
|
|
6
|
-
} from "react-native-safe-area-context";
|
|
7
|
-
import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
8
|
-
import { isApplePlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
3
|
+
import { useSafeAreaFrame } from "react-native-safe-area-context";
|
|
9
4
|
|
|
10
5
|
import { TransportInfo } from "./TransportInfo";
|
|
11
6
|
import { PlayerImage } from "./PlayerImage";
|
|
@@ -17,8 +12,6 @@ import { Props } from "./types";
|
|
|
17
12
|
import { isSmallTabletHeight as getIsSmallTabletHeight } from "./utils";
|
|
18
13
|
import { NAVBAR_HEIGHT, TABLET_LANDSCAPE } from "./const";
|
|
19
14
|
|
|
20
|
-
const isIOS = isApplePlatform();
|
|
21
|
-
|
|
22
15
|
const MIN_WIDTH = TABLET_LANDSCAPE.MIN_WIDTH; // Minimum width for the audio player container
|
|
23
16
|
const MAX_SPACING = TABLET_LANDSCAPE.MARGIN_VERTICAL; // Maximum spacing for the audio player container
|
|
24
17
|
const MIN_SPACING = TABLET_LANDSCAPE.MARGIN_VERTICAL_S; // Minimum spacing for the audio player container
|
|
@@ -68,22 +61,6 @@ const styles = StyleSheet.create({
|
|
|
68
61
|
},
|
|
69
62
|
});
|
|
70
63
|
|
|
71
|
-
const isTabletWithHomeButton = (bottomInset: number): boolean =>
|
|
72
|
-
bottomInset === 0;
|
|
73
|
-
|
|
74
|
-
const withAdditionalOffset = ({ progressBarHeight, bottomInset }) => {
|
|
75
|
-
if (isIOS && isTabletWithHomeButton(bottomInset)) {
|
|
76
|
-
return progressBarHeight === 0 ? 8 : progressBarHeight + 2;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (isIOS && !isTabletWithHomeButton(bottomInset)) {
|
|
80
|
-
return progressBarHeight === 0 ? 4 : 1;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
// android
|
|
84
|
-
return progressBarHeight === 0 ? 4 : 0.5;
|
|
85
|
-
};
|
|
86
|
-
|
|
87
64
|
export function TabletLandscapeLayout({
|
|
88
65
|
entry,
|
|
89
66
|
layoutState,
|
|
@@ -96,21 +73,16 @@ export function TabletLandscapeLayout({
|
|
|
96
73
|
onSkipStart,
|
|
97
74
|
onSkipLive,
|
|
98
75
|
onSpeedButtonPress,
|
|
99
|
-
onCloseVideoModal,
|
|
100
76
|
playbackSpeedName,
|
|
101
77
|
configuration,
|
|
102
|
-
dimensions,
|
|
103
|
-
playNextData,
|
|
104
78
|
title,
|
|
105
79
|
summary,
|
|
106
80
|
}: Props) {
|
|
107
81
|
const [imageWidth, setImageWidth] = React.useState(0);
|
|
108
82
|
const { docked } = layoutState;
|
|
109
83
|
|
|
110
|
-
const { bottom: bottomInset } = useSafeAreaInsets();
|
|
111
84
|
const { height: screenHeight } = useSafeAreaFrame();
|
|
112
85
|
const isSmallScreen = getIsSmallTabletHeight(screenHeight);
|
|
113
|
-
const { progressBarHeight } = useModalAnimationContext();
|
|
114
86
|
|
|
115
87
|
const onLayoutImage = React.useCallback((e) => {
|
|
116
88
|
setImageWidth(e.nativeEvent.layout.width);
|
|
@@ -149,20 +121,7 @@ export function TabletLandscapeLayout({
|
|
|
149
121
|
<PlayerImage
|
|
150
122
|
docked={false}
|
|
151
123
|
entry={entry}
|
|
152
|
-
layoutState={layoutState}
|
|
153
|
-
playerState={playerState}
|
|
154
|
-
value={value}
|
|
155
124
|
configuration={configuration}
|
|
156
|
-
onPlayerSeek={onPlayerSeek}
|
|
157
|
-
onCloseVideoModal={onCloseVideoModal}
|
|
158
|
-
dimensions={dimensions}
|
|
159
|
-
playNextData={playNextData}
|
|
160
|
-
title={title}
|
|
161
|
-
summary={summary}
|
|
162
|
-
verticalOffset={withAdditionalOffset({
|
|
163
|
-
progressBarHeight,
|
|
164
|
-
bottomInset,
|
|
165
|
-
})}
|
|
166
125
|
onLayoutImage={onLayoutImage}
|
|
167
126
|
/>
|
|
168
127
|
) : null}
|
|
@@ -4,8 +4,6 @@ import {
|
|
|
4
4
|
useSafeAreaFrame,
|
|
5
5
|
useSafeAreaInsets,
|
|
6
6
|
} from "react-native-safe-area-context";
|
|
7
|
-
import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
8
|
-
import { toNumberWithDefaultZero } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
9
7
|
|
|
10
8
|
import { withDebug } from "./debug";
|
|
11
9
|
import { TABLET_PORTRAIT } from "./const";
|
|
@@ -15,7 +13,6 @@ import { PlayerImage } from "./PlayerImage";
|
|
|
15
13
|
import { Controls } from "./Controls";
|
|
16
14
|
|
|
17
15
|
import { useTabletLayoutImageSize } from "./hooks";
|
|
18
|
-
import { DockedControls } from "./DockedControls";
|
|
19
16
|
import { VerticalGutter } from "./VerticalGutter";
|
|
20
17
|
|
|
21
18
|
import { Props } from "./types";
|
|
@@ -82,11 +79,8 @@ export function TabletPortraitLayout({
|
|
|
82
79
|
onSkipStart,
|
|
83
80
|
onSkipLive,
|
|
84
81
|
onSpeedButtonPress,
|
|
85
|
-
onCloseVideoModal,
|
|
86
82
|
playbackSpeedName,
|
|
87
83
|
configuration,
|
|
88
|
-
dimensions,
|
|
89
|
-
playNextData,
|
|
90
84
|
title,
|
|
91
85
|
summary,
|
|
92
86
|
}: Props) {
|
|
@@ -94,7 +88,6 @@ export function TabletPortraitLayout({
|
|
|
94
88
|
|
|
95
89
|
const { bottom: bottomInset, top: topInset } = useSafeAreaInsets();
|
|
96
90
|
const { height: screenHeight } = useSafeAreaFrame();
|
|
97
|
-
const { progressBarHeight } = useModalAnimationContext();
|
|
98
91
|
|
|
99
92
|
const {
|
|
100
93
|
imageSize,
|
|
@@ -153,21 +146,9 @@ export function TabletPortraitLayout({
|
|
|
153
146
|
>
|
|
154
147
|
<PlayerImage
|
|
155
148
|
entry={entry}
|
|
156
|
-
layoutState={layoutState}
|
|
157
|
-
playerState={playerState}
|
|
158
|
-
value={value}
|
|
159
149
|
configuration={configuration}
|
|
160
|
-
onPlayerSeek={onPlayerSeek}
|
|
161
|
-
onCloseVideoModal={onCloseVideoModal}
|
|
162
|
-
dimensions={dimensions}
|
|
163
|
-
playNextData={playNextData}
|
|
164
|
-
title={title}
|
|
165
|
-
summary={summary}
|
|
166
150
|
docked={docked}
|
|
167
151
|
imageWidth={imageSize}
|
|
168
|
-
verticalOffset={
|
|
169
|
-
toNumberWithDefaultZero(topOffset) - progressBarHeight
|
|
170
|
-
}
|
|
171
152
|
/>
|
|
172
153
|
</View>
|
|
173
154
|
|
|
@@ -196,20 +177,6 @@ export function TabletPortraitLayout({
|
|
|
196
177
|
</View>
|
|
197
178
|
</View>
|
|
198
179
|
</View>
|
|
199
|
-
{/* PlayerImage */}
|
|
200
|
-
|
|
201
|
-
<DockedControls
|
|
202
|
-
entry={entry}
|
|
203
|
-
layoutState={layoutState}
|
|
204
|
-
playerState={playerState}
|
|
205
|
-
value={value}
|
|
206
|
-
dimensions={dimensions}
|
|
207
|
-
onCloseVideoModal={onCloseVideoModal}
|
|
208
|
-
onPlayerSeek={onPlayerSeek}
|
|
209
|
-
playNextData={playNextData}
|
|
210
|
-
title={title}
|
|
211
|
-
summary={summary}
|
|
212
|
-
/>
|
|
213
180
|
</View>
|
|
214
181
|
);
|
|
215
182
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import { compose, map, propOr, split, take, trim } from "ramda";
|
|
3
2
|
import { LayoutChangeEvent, StyleSheet, View } from "react-native";
|
|
4
3
|
|
|
5
4
|
import { TransportInfo as MobileTransportInfo } from "@applicaster/quick-brick-mobile-transport-controls";
|
|
@@ -13,6 +12,7 @@ import { NAVBAR_HEIGHT, TABLET_LANDSCAPE } from "../const";
|
|
|
13
12
|
import { withDebug } from "../debug";
|
|
14
13
|
import { useSafeAreaFrame } from "react-native-safe-area-context";
|
|
15
14
|
import { isSmallTabletHeight } from "../utils";
|
|
15
|
+
import { getPlayerActionButtons } from "@applicaster/zapp-react-native-utils/playerUtils";
|
|
16
16
|
|
|
17
17
|
const styles = StyleSheet.create({
|
|
18
18
|
container: {
|
|
@@ -82,14 +82,8 @@ export const TransportInfo = ({
|
|
|
82
82
|
);
|
|
83
83
|
|
|
84
84
|
const actionButtons = React.useMemo(
|
|
85
|
-
() =>
|
|
86
|
-
|
|
87
|
-
take(2),
|
|
88
|
-
map(trim),
|
|
89
|
-
split(","),
|
|
90
|
-
propOr("", "player_action_buttons")
|
|
91
|
-
)(configuration),
|
|
92
|
-
[configuration.player_action_buttons]
|
|
85
|
+
() => getPlayerActionButtons(configuration),
|
|
86
|
+
[configuration]
|
|
93
87
|
);
|
|
94
88
|
|
|
95
89
|
return (
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { ModalHeader } from "@applicaster/zapp-react-native-ui-components/Components/ModalComponent/Header";
|
|
3
|
-
import { isNil } from "
|
|
3
|
+
import { isNil } from "@applicaster/zapp-react-native-utils/utils";
|
|
4
4
|
|
|
5
5
|
const formatTime = (milliseconds: number) => {
|
|
6
6
|
const totalSeconds = Math.floor(milliseconds / 1000);
|
|
@@ -51,14 +51,15 @@ export function AnimatedModal({
|
|
|
51
51
|
<PanGestureHandler {...gestureHandlerProps}>
|
|
52
52
|
<Animated.View
|
|
53
53
|
pointerEvents={"auto"}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
style={[
|
|
55
|
+
styles.modalWrapper,
|
|
56
|
+
{
|
|
57
|
+
borderTopLeftRadius: borderTopRadiusAnimated,
|
|
58
|
+
borderTopRightRadius: borderTopRadiusAnimated,
|
|
59
|
+
transform: [{ translateY }],
|
|
60
|
+
height: SCREEN_HEIGHT,
|
|
61
|
+
},
|
|
62
|
+
]}
|
|
62
63
|
>
|
|
63
64
|
<Animated.View
|
|
64
65
|
style={[
|
|
@@ -95,9 +96,7 @@ export function AnimatedModal({
|
|
|
95
96
|
>
|
|
96
97
|
<Pressable
|
|
97
98
|
testID="collapsedBarWrapper"
|
|
98
|
-
onPress={
|
|
99
|
-
expand();
|
|
100
|
-
}}
|
|
99
|
+
onPress={expand}
|
|
101
100
|
style={styles.collapsedBarWrapper}
|
|
102
101
|
>
|
|
103
102
|
{collapsedContent}
|