@applicaster/quick-brick-player 14.0.0-rc.6 → 14.0.0-rc.60
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/AudioPlayerWrapper.tsx +25 -81
- package/src/Player/AudioLayer/Layout/Controls/index.tsx +8 -18
- package/src/Player/AudioLayer/Layout/DockedControls/index.tsx +99 -103
- package/src/Player/AudioLayer/Layout/MobileLayout.tsx +5 -38
- package/src/Player/AudioLayer/Layout/PlayerImage/AnimatedImage.tsx +3 -8
- package/src/Player/AudioLayer/Layout/PlayerImage/FlexImage.tsx +5 -9
- package/src/Player/AudioLayer/Layout/PlayerImage/index.tsx +22 -72
- package/src/Player/AudioLayer/Layout/TabletLandscapeLayout.tsx +1 -58
- package/src/Player/AudioLayer/Layout/TabletPortraitLayout.tsx +0 -33
- package/src/Player/AudioLayer/Layout/TransportInfo/index.tsx +6 -18
- package/src/Player/AudioLayer/components/SleepTimerModalHeader/SleepTimerModalHeader.tsx +1 -1
- package/src/Player/PlayerModal/GestureAnimatedScrollView.ts +7 -0
- package/src/Player/PlayerModal/PlayerModal.tsx +109 -0
- package/src/Player/PlayerModal/VideoPlayerModal.tsx +254 -0
- package/src/Player/PlayerModal/consts/index.ts +34 -0
- package/src/Player/PlayerModal/hooks/index.ts +190 -0
- package/src/Player/PlayerModal/index.ts +3 -0
- package/src/Player/PlayerModal/index.web.ts +5 -0
- package/src/Player/PlayerModal/styles.ts +103 -0
- package/src/Player/PlayerView/GenericTVPlayerView.tsx +42 -0
- package/src/Player/PlayerView/TVPlayerView.tsx +26 -0
- package/src/Player/PlayerView/TvOSPlayerView.tsx +51 -0
- package/src/Player/PlayerView/types.ts +42 -0
- package/src/Player/index.tsx +187 -185
- package/src/QuickBrickPlayer.tsx +3 -0
- /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-rc.
|
|
3
|
+
"version": "14.0.0-rc.60",
|
|
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": "
|
|
39
|
-
"@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.
|
|
40
|
-
"@applicaster/zapp-react-native-tvos-app": "14.0.0-rc.
|
|
41
|
-
"@applicaster/zapp-react-native-ui-components": "14.0.0-rc.
|
|
42
|
-
"@applicaster/zapp-react-native-utils": "14.0.0-rc.
|
|
38
|
+
"@applicaster/quick-brick-mobile-transport-controls": "14.0.0-rc.56",
|
|
39
|
+
"@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.60",
|
|
40
|
+
"@applicaster/zapp-react-native-tvos-app": "14.0.0-rc.60",
|
|
41
|
+
"@applicaster/zapp-react-native-ui-components": "14.0.0-rc.60",
|
|
42
|
+
"@applicaster/zapp-react-native-utils": "14.0.0-rc.60",
|
|
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,11 +1,6 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { useEffect, useState } from "react";
|
|
3
|
-
import {
|
|
4
|
-
Dimensions as ScreenDimensions,
|
|
5
|
-
StyleSheet,
|
|
6
|
-
View,
|
|
7
|
-
ViewStyle,
|
|
8
|
-
} from "react-native";
|
|
3
|
+
import { StyleSheet, View, ViewStyle } from "react-native";
|
|
9
4
|
|
|
10
5
|
import { Edge, SafeAreaView } from "react-native-safe-area-context";
|
|
11
6
|
import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
|
|
@@ -13,14 +8,9 @@ import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerM
|
|
|
13
8
|
import * as R from "ramda";
|
|
14
9
|
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
15
10
|
import Layout from "./Layout";
|
|
16
|
-
import {
|
|
17
|
-
useIsTablet,
|
|
18
|
-
useNavigation,
|
|
19
|
-
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
11
|
+
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
20
12
|
import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
|
|
21
13
|
import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
|
|
22
|
-
import { PlayerDetails } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/PlayerDetails";
|
|
23
|
-
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
24
14
|
import { formatSpeed } from "./utils";
|
|
25
15
|
import {
|
|
26
16
|
getBottomSheetModalDefaultItemIcon,
|
|
@@ -30,12 +20,7 @@ import {
|
|
|
30
20
|
getBottomSheetModalSelectedItemIcon,
|
|
31
21
|
} from "../Utils";
|
|
32
22
|
import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
|
|
33
|
-
|
|
34
|
-
AnimatedScrollModal,
|
|
35
|
-
AnimationComponent,
|
|
36
|
-
ComponentAnimationType,
|
|
37
|
-
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
38
|
-
import { PADDING_HORIZONTAL } from "./Layout/const";
|
|
23
|
+
|
|
39
24
|
import { toNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
40
25
|
|
|
41
26
|
import { DEFAULT_SPEED, PlaybackSpeed, SpeedController } from "./SpeedManager";
|
|
@@ -81,18 +66,10 @@ type Props = {
|
|
|
81
66
|
isTabletPortrait?: boolean;
|
|
82
67
|
};
|
|
83
68
|
|
|
84
|
-
const { width: SCREEN_WIDTH } = ScreenDimensions.get("screen");
|
|
85
|
-
|
|
86
69
|
const Styles = StyleSheet.create({
|
|
87
70
|
playerContainer: {
|
|
88
71
|
flex: 1,
|
|
89
72
|
},
|
|
90
|
-
paddingHorizontal: { paddingTop: 0, paddingHorizontal: PADDING_HORIZONTAL },
|
|
91
|
-
playerDetails: {
|
|
92
|
-
marginTop: 60,
|
|
93
|
-
alignSelf: "center",
|
|
94
|
-
width: SCREEN_WIDTH - PADDING_HORIZONTAL * 2,
|
|
95
|
-
},
|
|
96
73
|
});
|
|
97
74
|
|
|
98
75
|
const edges: Edge[] = ["right", "left", "top"];
|
|
@@ -107,16 +84,10 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
|
|
|
107
84
|
configuration,
|
|
108
85
|
style,
|
|
109
86
|
entry,
|
|
110
|
-
children,
|
|
111
87
|
layoutState,
|
|
112
88
|
playNextData = null,
|
|
113
|
-
isTabletPortrait,
|
|
114
89
|
} = props;
|
|
115
90
|
|
|
116
|
-
const isTablet = useIsTablet();
|
|
117
|
-
|
|
118
|
-
const isTabletLandscape = !isTV() && isTablet && !isTabletPortrait;
|
|
119
|
-
|
|
120
91
|
const { title, summary } = useTitleSummaryOverlay(
|
|
121
92
|
entry,
|
|
122
93
|
playerState?.isLive,
|
|
@@ -264,10 +235,6 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
|
|
|
264
235
|
});
|
|
265
236
|
}, [playbackSpeed, onSpeedSelect, configuration["playback_speed_title"]]);
|
|
266
237
|
|
|
267
|
-
const onCloseVideoModal = React.useCallback(() => {
|
|
268
|
-
playerManager.close();
|
|
269
|
-
}, [playerManager]);
|
|
270
|
-
|
|
271
238
|
const onPlayerSeek = React.useCallback(
|
|
272
239
|
(targetTime: number) => {
|
|
273
240
|
player?.seekTo(targetTime);
|
|
@@ -285,51 +252,28 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
|
|
|
285
252
|
|
|
286
253
|
return (
|
|
287
254
|
<SafeAreaView style={[style, Styles.playerContainer]} edges={edges}>
|
|
288
|
-
<
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
configuration={configuration}
|
|
311
|
-
dimensions={dimensions}
|
|
312
|
-
playNextData={playNextData}
|
|
313
|
-
title={title}
|
|
314
|
-
summary={summary}
|
|
315
|
-
/>
|
|
316
|
-
<View style={Styles.paddingHorizontal}>
|
|
317
|
-
{children}
|
|
318
|
-
<AnimationComponent
|
|
319
|
-
animationType={ComponentAnimationType.componentFade}
|
|
320
|
-
>
|
|
321
|
-
<PlayerDetails
|
|
322
|
-
isAudioPlayer
|
|
323
|
-
configuration={configuration}
|
|
324
|
-
style={Styles.playerDetails}
|
|
325
|
-
entry={entry}
|
|
326
|
-
isTabletLandscape={isTabletLandscape}
|
|
327
|
-
/>
|
|
328
|
-
</AnimationComponent>
|
|
329
|
-
</View>
|
|
330
|
-
</View>
|
|
331
|
-
</AnimatedScrollModal>
|
|
332
|
-
</AnimationComponent>
|
|
255
|
+
<View style={Styles.playerContainer} onLayout={onLayout}>
|
|
256
|
+
<Layout
|
|
257
|
+
entry={entry}
|
|
258
|
+
playerState={playerState}
|
|
259
|
+
layoutState={layoutState}
|
|
260
|
+
value={value}
|
|
261
|
+
onPlaybackButtonPress={onPlaybackButtonPress}
|
|
262
|
+
onRewindButtonPress={onRewindButtonPress}
|
|
263
|
+
onForwardButtonPress={onForwardButtonPress}
|
|
264
|
+
onPlayerSeek={onPlayerSeek}
|
|
265
|
+
onSkipStart={onSkipStart}
|
|
266
|
+
onSpeedButtonPress={onSpeedButtonPress}
|
|
267
|
+
playbackSpeedName={formatSpeed(playbackSpeed.value)}
|
|
268
|
+
onSkipLive={onSkipLive}
|
|
269
|
+
maximiseVideoModal={maximiseVideoModal}
|
|
270
|
+
configuration={configuration}
|
|
271
|
+
dimensions={dimensions}
|
|
272
|
+
playNextData={playNextData}
|
|
273
|
+
title={title}
|
|
274
|
+
summary={summary}
|
|
275
|
+
/>
|
|
276
|
+
</View>
|
|
333
277
|
</SafeAreaView>
|
|
334
278
|
);
|
|
335
279
|
};
|
|
@@ -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
|
};
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import {
|
|
3
|
-
StyleSheet,
|
|
4
|
-
TouchableWithoutFeedback,
|
|
5
|
-
View,
|
|
6
|
-
ViewStyle,
|
|
7
|
-
} from "react-native";
|
|
2
|
+
import { StyleSheet, View, ViewStyle } from "react-native";
|
|
8
3
|
import * as R from "ramda";
|
|
9
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
useIsTablet,
|
|
6
|
+
useZStore,
|
|
7
|
+
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
8
|
+
import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
|
|
10
9
|
|
|
11
10
|
import {
|
|
12
11
|
Button,
|
|
@@ -17,15 +16,17 @@ import {
|
|
|
17
16
|
|
|
18
17
|
import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
|
|
19
18
|
|
|
20
|
-
import {
|
|
21
|
-
AnimationComponent,
|
|
22
|
-
ComponentAnimationType,
|
|
23
|
-
PlayerAnimationStateEnum,
|
|
24
|
-
useModalAnimationContext,
|
|
25
|
-
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
26
19
|
import { toNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
|
|
27
20
|
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
21
|
+
import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
|
|
28
22
|
import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/getTabBarHeight";
|
|
23
|
+
import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
|
|
24
|
+
import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
|
|
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";
|
|
29
30
|
|
|
30
31
|
const bottomTabBarHeight = getTabBarHeight();
|
|
31
32
|
|
|
@@ -34,13 +35,15 @@ type Props = {
|
|
|
34
35
|
layoutState: QuickBrickPlayer.LayoutState;
|
|
35
36
|
playerState: QuickBrickPlayer.PlayerState;
|
|
36
37
|
value: GetValue;
|
|
37
|
-
dimensions: QuickBrickPlayer.AudioPlayerProps["dimensions"];
|
|
38
38
|
onCloseVideoModal: () => void;
|
|
39
39
|
onPlayerSeek: (targetTime: number) => void;
|
|
40
40
|
playNextData: PlayNextData;
|
|
41
41
|
title: string | number;
|
|
42
42
|
summary: string | number;
|
|
43
43
|
ImageComponent?: React.ReactNode;
|
|
44
|
+
isActiveGesture?: boolean;
|
|
45
|
+
minimisedHeight: number;
|
|
46
|
+
aspectRatio?: number;
|
|
44
47
|
};
|
|
45
48
|
|
|
46
49
|
const styles = StyleSheet.create({
|
|
@@ -48,6 +51,7 @@ const styles = StyleSheet.create({
|
|
|
48
51
|
flex: 1,
|
|
49
52
|
flexDirection: "column",
|
|
50
53
|
alignItems: "stretch",
|
|
54
|
+
marginTop: PROGRESS_BAR_HEIGHT,
|
|
51
55
|
},
|
|
52
56
|
content: {
|
|
53
57
|
flex: 1,
|
|
@@ -99,26 +103,6 @@ const playerDimensionsStyle = (
|
|
|
99
103
|
width: addPadding ? toNumberWithDefault(100, minimisedHeight) : 0,
|
|
100
104
|
});
|
|
101
105
|
|
|
102
|
-
const animatedContainerStyle = (
|
|
103
|
-
docked: boolean,
|
|
104
|
-
progressBarHeight: number
|
|
105
|
-
): ViewStyle => ({
|
|
106
|
-
top: progressBarHeight,
|
|
107
|
-
position: "absolute",
|
|
108
|
-
width: "100%",
|
|
109
|
-
zIndex: docked ? 1 : -1,
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const backgroundImageStyle = (
|
|
113
|
-
dimensions: QuickBrickPlayer.AudioPlayerProps["dimensions"],
|
|
114
|
-
minimisedHeight: number,
|
|
115
|
-
isActiveGesture: boolean
|
|
116
|
-
): ViewStyle => ({
|
|
117
|
-
height: isActiveGesture ? minimisedHeight : dimensions.height,
|
|
118
|
-
aspectRatio: 1,
|
|
119
|
-
position: "absolute",
|
|
120
|
-
});
|
|
121
|
-
|
|
122
106
|
const controlButtons = (
|
|
123
107
|
live: boolean,
|
|
124
108
|
paused: boolean,
|
|
@@ -180,107 +164,119 @@ export const DockedControls = (props: Props) => {
|
|
|
180
164
|
const {
|
|
181
165
|
entry,
|
|
182
166
|
layoutState,
|
|
183
|
-
|
|
184
|
-
value,
|
|
185
|
-
dimensions,
|
|
186
|
-
onCloseVideoModal,
|
|
187
|
-
onPlayerSeek,
|
|
167
|
+
onPlayerSeek = noop,
|
|
188
168
|
playNextData,
|
|
189
|
-
title,
|
|
190
|
-
summary,
|
|
191
169
|
ImageComponent,
|
|
170
|
+
isActiveGesture = true,
|
|
171
|
+
aspectRatio,
|
|
192
172
|
} = props;
|
|
193
173
|
|
|
194
|
-
const
|
|
174
|
+
const onCloseVideoModal = React.useCallback(() => {
|
|
175
|
+
playerManager.close();
|
|
176
|
+
}, []);
|
|
195
177
|
|
|
196
|
-
const
|
|
178
|
+
const { currentRoute, screenData } = useNavigation();
|
|
197
179
|
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
180
|
+
const plugins = usePlugins();
|
|
181
|
+
const menuVisible = isMenuVisible(currentRoute, screenData, plugins);
|
|
182
|
+
|
|
183
|
+
const { minimised_height: minimisedHeight } = useConfiguration();
|
|
184
|
+
|
|
185
|
+
const configuration = useZStore("playerConfiguration")();
|
|
186
|
+
const playerState = usePlayerState("shared-player-wrapper-docked");
|
|
187
|
+
|
|
188
|
+
const getValue = (key: string, stylesObj: {}) =>
|
|
189
|
+
R.propOr(null, key, stylesObj);
|
|
190
|
+
|
|
191
|
+
const value = React.useCallback(
|
|
192
|
+
(key: string) => {
|
|
193
|
+
const retVal = getValue(key, configuration);
|
|
194
|
+
|
|
195
|
+
const minimumAllowedSeekableDurationInSeconds = getValue(
|
|
196
|
+
"minimumAllowedSeekableDurationInSeconds",
|
|
197
|
+
configuration
|
|
198
|
+
);
|
|
205
199
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
200
|
+
if (key === "liveSeekingEnabled") {
|
|
201
|
+
return playerState.seekableDuration <
|
|
202
|
+
minimumAllowedSeekableDurationInSeconds || playerManager.isCasting()
|
|
203
|
+
? false
|
|
204
|
+
: retVal;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return retVal;
|
|
208
|
+
},
|
|
209
|
+
[...Object.values(configuration), playerState]
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
const { title, summary } = useTitleSummaryOverlay(
|
|
213
|
+
entry,
|
|
214
|
+
playerState?.isLive,
|
|
215
|
+
configuration?.audio_live_player_update_interval
|
|
209
216
|
);
|
|
210
217
|
|
|
218
|
+
const isTablet = useIsTablet();
|
|
219
|
+
|
|
220
|
+
const liveButton = Boolean(value("live_badge_enabled"));
|
|
221
|
+
|
|
211
222
|
const dockedBackgroundColor = value("docked_player_background_color");
|
|
212
223
|
|
|
213
224
|
const insets = useSafeAreaInsets();
|
|
214
225
|
|
|
215
|
-
if (!layoutState.docked && !startComponentsAnimation) return null;
|
|
216
|
-
|
|
217
226
|
return (
|
|
218
|
-
<
|
|
219
|
-
animationType={ComponentAnimationType.componentAppears}
|
|
227
|
+
<View
|
|
220
228
|
style={[
|
|
221
229
|
styles.container,
|
|
222
|
-
animatedContainerStyle(
|
|
223
|
-
isActiveGesture || layoutState.docked,
|
|
224
|
-
progressBarHeight
|
|
225
|
-
),
|
|
226
230
|
{
|
|
227
|
-
height:
|
|
231
|
+
height:
|
|
232
|
+
minimisedHeight +
|
|
233
|
+
(menuVisible ? bottomTabBarHeight : 0) +
|
|
234
|
+
insets.bottom,
|
|
228
235
|
},
|
|
229
236
|
]}
|
|
230
237
|
>
|
|
231
|
-
{!playerState.isLive
|
|
232
|
-
(layoutState.docked || startComponentsAnimation) ? (
|
|
238
|
+
{!playerState.isLive ? (
|
|
233
239
|
<ProgressBar
|
|
234
|
-
name={"
|
|
240
|
+
name={"shared-docked-layout"}
|
|
235
241
|
content={entry}
|
|
236
242
|
value={value}
|
|
237
243
|
visible
|
|
238
244
|
layoutState={layoutState}
|
|
239
245
|
onPlayerSeek={onPlayerSeek}
|
|
240
246
|
playerState={playerState}
|
|
241
|
-
startComponentsAnimation={
|
|
247
|
+
startComponentsAnimation={noop}
|
|
242
248
|
docked
|
|
243
249
|
/>
|
|
244
250
|
) : null}
|
|
245
251
|
|
|
246
252
|
<View style={styles.content}>
|
|
247
|
-
<View
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
isActiveGesture
|
|
252
|
-
)}
|
|
253
|
-
/>
|
|
254
|
-
<TouchableWithoutFeedback onPress={maximazeVideoModal}>
|
|
255
|
-
<View style={styles.touchableArea}>
|
|
256
|
-
{isActiveGesture || layoutState.docked ? (
|
|
257
|
-
<View
|
|
258
|
-
style={{ width: toNumberWithDefault(100, minimisedHeight) }}
|
|
259
|
-
>
|
|
260
|
-
{ImageComponent || null}
|
|
261
|
-
</View>
|
|
262
|
-
) : (
|
|
263
|
-
<View
|
|
264
|
-
style={playerDimensionsStyle(
|
|
265
|
-
minimisedHeight,
|
|
266
|
-
isActiveGesture || layoutState.docked
|
|
267
|
-
)}
|
|
268
|
-
/>
|
|
269
|
-
)}
|
|
270
|
-
<View
|
|
271
|
-
style={[
|
|
272
|
-
styles.contentInfo,
|
|
273
|
-
{ backgroundColor: dockedBackgroundColor },
|
|
274
|
-
]}
|
|
275
|
-
>
|
|
276
|
-
<ContentInfo
|
|
277
|
-
content={{ ...entry, title, summary }}
|
|
278
|
-
value={value}
|
|
279
|
-
docked
|
|
280
|
-
/>
|
|
253
|
+
<View style={styles.touchableArea}>
|
|
254
|
+
{isActiveGesture || layoutState.docked ? (
|
|
255
|
+
<View style={{ aspectRatio: aspectRatio, height: minimisedHeight }}>
|
|
256
|
+
{ImageComponent || null}
|
|
281
257
|
</View>
|
|
258
|
+
) : (
|
|
259
|
+
<View
|
|
260
|
+
style={playerDimensionsStyle(
|
|
261
|
+
minimisedHeight,
|
|
262
|
+
isActiveGesture || layoutState.docked
|
|
263
|
+
)}
|
|
264
|
+
/>
|
|
265
|
+
)}
|
|
266
|
+
<View
|
|
267
|
+
testID="content-info"
|
|
268
|
+
style={[
|
|
269
|
+
styles.contentInfo,
|
|
270
|
+
{ backgroundColor: dockedBackgroundColor },
|
|
271
|
+
]}
|
|
272
|
+
>
|
|
273
|
+
<ContentInfo
|
|
274
|
+
content={{ ...entry, title, summary }}
|
|
275
|
+
value={value}
|
|
276
|
+
docked
|
|
277
|
+
/>
|
|
282
278
|
</View>
|
|
283
|
-
</
|
|
279
|
+
</View>
|
|
284
280
|
<View
|
|
285
281
|
style={[
|
|
286
282
|
isTablet
|
|
@@ -310,10 +306,10 @@ export const DockedControls = (props: Props) => {
|
|
|
310
306
|
</View>
|
|
311
307
|
<View
|
|
312
308
|
style={{
|
|
313
|
-
height: insets.bottom + bottomTabBarHeight,
|
|
309
|
+
height: insets.bottom + (menuVisible ? bottomTabBarHeight : 0),
|
|
314
310
|
backgroundColor: dockedBackgroundColor,
|
|
315
311
|
}}
|
|
316
312
|
/>
|
|
317
|
-
</
|
|
313
|
+
</View>
|
|
318
314
|
);
|
|
319
315
|
};
|
|
@@ -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";
|
|
@@ -12,13 +11,12 @@ import { PlayerImage } from "./PlayerImage";
|
|
|
12
11
|
import { Controls } from "./Controls";
|
|
13
12
|
|
|
14
13
|
import { useMobileLayoutImageSize, useTransportInfoHeight } from "./hooks";
|
|
15
|
-
import { DockedControls } from "./DockedControls";
|
|
16
14
|
import { DEBUG, withDebug } from "./debug";
|
|
17
15
|
import {
|
|
18
16
|
BottomDebugSquare,
|
|
19
17
|
LeftDebugSquare,
|
|
20
18
|
RightDebugSquare,
|
|
21
|
-
} from "./
|
|
19
|
+
} from "./DebugComponent";
|
|
22
20
|
|
|
23
21
|
import { Props } from "./types";
|
|
24
22
|
|
|
@@ -56,6 +54,7 @@ const mobileStyles = ({
|
|
|
56
54
|
imageSize,
|
|
57
55
|
}): ViewStyle => ({
|
|
58
56
|
height: screenHeight - topInset - bottomInset,
|
|
57
|
+
width: "100%",
|
|
59
58
|
|
|
60
59
|
opacity: imageSize ? 1 : 0, // hide content until imageSize is calculated
|
|
61
60
|
|
|
@@ -77,11 +76,8 @@ export function MobileLayout({
|
|
|
77
76
|
onSkipStart,
|
|
78
77
|
onSkipLive,
|
|
79
78
|
onSpeedButtonPress,
|
|
80
|
-
onCloseVideoModal,
|
|
81
79
|
playbackSpeedName,
|
|
82
80
|
configuration,
|
|
83
|
-
dimensions,
|
|
84
|
-
playNextData,
|
|
85
81
|
title,
|
|
86
82
|
summary,
|
|
87
83
|
}: Props) {
|
|
@@ -89,12 +85,10 @@ export function MobileLayout({
|
|
|
89
85
|
|
|
90
86
|
const { bottom: bottomInset, top: topInset } = useSafeAreaInsets();
|
|
91
87
|
const { height: screenHeight } = useSafeAreaFrame();
|
|
92
|
-
const { progressBarHeight } = useModalAnimationContext();
|
|
93
88
|
|
|
94
89
|
const { imageSize } = useMobileLayoutImageSize();
|
|
95
90
|
|
|
96
|
-
const {
|
|
97
|
-
useTransportInfoHeight();
|
|
91
|
+
const { onLayout: onTransportInfoLayout } = useTransportInfoHeight();
|
|
98
92
|
|
|
99
93
|
const controlsContainerHeight = React.useMemo(() => {
|
|
100
94
|
return (
|
|
@@ -108,10 +102,6 @@ export function MobileLayout({
|
|
|
108
102
|
);
|
|
109
103
|
}, [screenHeight, topInset, imageSize, bottomInset]);
|
|
110
104
|
|
|
111
|
-
const verticalOffsetForImage = React.useMemo(() => {
|
|
112
|
-
return transportInfoHeight + MOBILE.MARGIN_TOP - progressBarHeight;
|
|
113
|
-
}, [transportInfoHeight, progressBarHeight]);
|
|
114
|
-
|
|
115
105
|
return (
|
|
116
106
|
<View
|
|
117
107
|
style={[
|
|
@@ -163,19 +153,9 @@ export function MobileLayout({
|
|
|
163
153
|
>
|
|
164
154
|
<PlayerImage
|
|
165
155
|
entry={entry}
|
|
166
|
-
|
|
167
|
-
playerState={playerState}
|
|
168
|
-
value={value}
|
|
169
|
-
configuration={configuration}
|
|
170
|
-
onPlayerSeek={onPlayerSeek}
|
|
171
|
-
onCloseVideoModal={onCloseVideoModal}
|
|
172
|
-
dimensions={dimensions}
|
|
173
|
-
playNextData={playNextData}
|
|
174
|
-
title={title}
|
|
175
|
-
summary={summary}
|
|
176
|
-
docked={docked}
|
|
156
|
+
docked={false}
|
|
177
157
|
imageWidth={imageSize}
|
|
178
|
-
|
|
158
|
+
configuration={configuration}
|
|
179
159
|
/>
|
|
180
160
|
</View>
|
|
181
161
|
{/* PlayerImage */}
|
|
@@ -204,19 +184,6 @@ export function MobileLayout({
|
|
|
204
184
|
/>
|
|
205
185
|
</View>
|
|
206
186
|
</View>
|
|
207
|
-
|
|
208
|
-
<DockedControls
|
|
209
|
-
entry={entry}
|
|
210
|
-
layoutState={layoutState}
|
|
211
|
-
playerState={playerState}
|
|
212
|
-
value={value}
|
|
213
|
-
dimensions={dimensions}
|
|
214
|
-
onCloseVideoModal={onCloseVideoModal}
|
|
215
|
-
onPlayerSeek={onPlayerSeek}
|
|
216
|
-
playNextData={playNextData}
|
|
217
|
-
title={title}
|
|
218
|
-
summary={summary}
|
|
219
|
-
/>
|
|
220
187
|
</View>
|
|
221
188
|
);
|
|
222
189
|
}
|