@applicaster/quick-brick-player 14.0.0-alpha.2847632144 → 14.0.0-alpha.3552323332
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 -6
- package/src/Player/AudioLayer/AudioPlayerWrapper.tsx +25 -81
- package/src/Player/AudioLayer/Layout/DockedControls/index.tsx +85 -99
- package/src/Player/AudioLayer/Layout/MobileLayout.tsx +1 -16
- package/src/Player/AudioLayer/Layout/PlayerImage/AnimatedImage.tsx +1 -46
- package/src/Player/AudioLayer/Layout/PlayerImage/index.tsx +21 -72
- package/src/Player/AudioLayer/Layout/TabletLandscapeLayout.tsx +0 -16
- package/src/Player/AudioLayer/Layout/TransportInfo/index.tsx +3 -9
- package/src/Player/PlayerModal/PlayerModal.tsx +110 -0
- package/src/Player/PlayerModal/VideoPlayerModal.tsx +245 -0
- package/src/Player/PlayerModal/consts/index.ts +20 -0
- package/src/Player/PlayerModal/hooks/index.ts +168 -0
- package/src/Player/PlayerModal/index.ts +3 -0
- package/src/Player/PlayerModal/styles.ts +95 -0
- package/src/Player/PlayerView/GenericTVPlayerView.tsx +43 -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 +192 -185
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.3552323332",
|
|
4
4
|
"description": "Quick Brick Player",
|
|
5
5
|
"main": "./src/index.ts",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -35,11 +35,11 @@
|
|
|
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-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-alpha.3552323332",
|
|
39
|
+
"@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.7",
|
|
40
|
+
"@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.3552323332",
|
|
41
|
+
"@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.3552323332",
|
|
42
|
+
"@applicaster/zapp-react-native-utils": "14.0.0-alpha.3552323332",
|
|
43
43
|
"query-string": "7.1.3",
|
|
44
44
|
"react-native-web-linear-gradient": "1.1.2",
|
|
45
45
|
"shaka-player": "4.3.5",
|
|
@@ -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,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,12 @@ 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";
|
|
28
21
|
import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/getTabBarHeight";
|
|
22
|
+
import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
|
|
23
|
+
import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
|
|
24
|
+
import { useConfiguration } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/utils";
|
|
29
25
|
|
|
30
26
|
const bottomTabBarHeight = getTabBarHeight();
|
|
31
27
|
|
|
@@ -34,13 +30,16 @@ type Props = {
|
|
|
34
30
|
layoutState: QuickBrickPlayer.LayoutState;
|
|
35
31
|
playerState: QuickBrickPlayer.PlayerState;
|
|
36
32
|
value: GetValue;
|
|
37
|
-
dimensions: QuickBrickPlayer.AudioPlayerProps["dimensions"];
|
|
38
33
|
onCloseVideoModal: () => void;
|
|
39
34
|
onPlayerSeek: (targetTime: number) => void;
|
|
40
35
|
playNextData: PlayNextData;
|
|
41
36
|
title: string | number;
|
|
42
37
|
summary: string | number;
|
|
43
38
|
ImageComponent?: React.ReactNode;
|
|
39
|
+
isActiveGesture?: boolean;
|
|
40
|
+
minimisedHeight: number;
|
|
41
|
+
progressBarHeight: number;
|
|
42
|
+
aspectRatio?: number;
|
|
44
43
|
};
|
|
45
44
|
|
|
46
45
|
const styles = StyleSheet.create({
|
|
@@ -48,6 +47,7 @@ const styles = StyleSheet.create({
|
|
|
48
47
|
flex: 1,
|
|
49
48
|
flexDirection: "column",
|
|
50
49
|
alignItems: "stretch",
|
|
50
|
+
marginTop: 3, // from plugins/mobile-transport-controls/src/ProgressBar/layouts/DockedLayout.tsx
|
|
51
51
|
},
|
|
52
52
|
content: {
|
|
53
53
|
flex: 1,
|
|
@@ -99,26 +99,6 @@ const playerDimensionsStyle = (
|
|
|
99
99
|
width: addPadding ? toNumberWithDefault(100, minimisedHeight) : 0,
|
|
100
100
|
});
|
|
101
101
|
|
|
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
102
|
const controlButtons = (
|
|
123
103
|
live: boolean,
|
|
124
104
|
paused: boolean,
|
|
@@ -180,58 +160,74 @@ export const DockedControls = (props: Props) => {
|
|
|
180
160
|
const {
|
|
181
161
|
entry,
|
|
182
162
|
layoutState,
|
|
183
|
-
playerState,
|
|
184
|
-
value,
|
|
185
|
-
dimensions,
|
|
186
|
-
onCloseVideoModal,
|
|
187
163
|
onPlayerSeek,
|
|
188
164
|
playNextData,
|
|
189
|
-
title,
|
|
190
|
-
summary,
|
|
191
165
|
ImageComponent,
|
|
166
|
+
isActiveGesture = true,
|
|
167
|
+
aspectRatio,
|
|
192
168
|
} = props;
|
|
193
169
|
|
|
194
|
-
const
|
|
170
|
+
const onCloseVideoModal = React.useCallback(() => {
|
|
171
|
+
playerManager.close();
|
|
172
|
+
}, []);
|
|
195
173
|
|
|
196
|
-
const
|
|
174
|
+
const { minimised_height: minimisedHeight } = useConfiguration();
|
|
197
175
|
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
176
|
+
const configuration = useZStore("playerConfiguration")();
|
|
177
|
+
const playerState = usePlayerState("shared-player-wrapper-docked");
|
|
178
|
+
|
|
179
|
+
const getValue = (key: string, stylesObj: {}) =>
|
|
180
|
+
R.propOr(null, key, stylesObj);
|
|
181
|
+
|
|
182
|
+
const value = React.useCallback(
|
|
183
|
+
(key: string) => {
|
|
184
|
+
const retVal = getValue(key, configuration);
|
|
185
|
+
|
|
186
|
+
const minimumAllowedSeekableDurationInSeconds = getValue(
|
|
187
|
+
"minimumAllowedSeekableDurationInSeconds",
|
|
188
|
+
configuration
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
if (key === "liveSeekingEnabled") {
|
|
192
|
+
return playerState.seekableDuration <
|
|
193
|
+
minimumAllowedSeekableDurationInSeconds || playerManager.isCasting()
|
|
194
|
+
? false
|
|
195
|
+
: retVal;
|
|
196
|
+
}
|
|
205
197
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
[]
|
|
198
|
+
return retVal;
|
|
199
|
+
},
|
|
200
|
+
[...Object.values(configuration), playerState]
|
|
209
201
|
);
|
|
210
202
|
|
|
203
|
+
const { title, summary } = useTitleSummaryOverlay(
|
|
204
|
+
entry,
|
|
205
|
+
playerState?.isLive,
|
|
206
|
+
configuration?.audio_live_player_update_interval
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
const isTablet = useIsTablet();
|
|
210
|
+
|
|
211
|
+
const liveButton = Boolean(value("live_badge_enabled"));
|
|
212
|
+
|
|
213
|
+
const startComponentsAnimation = () => {};
|
|
214
|
+
|
|
211
215
|
const dockedBackgroundColor = value("docked_player_background_color");
|
|
212
216
|
|
|
213
217
|
const insets = useSafeAreaInsets();
|
|
214
218
|
|
|
215
|
-
if (!layoutState.docked && !startComponentsAnimation) return null;
|
|
216
|
-
|
|
217
219
|
return (
|
|
218
|
-
<
|
|
219
|
-
animationType={ComponentAnimationType.componentAppears}
|
|
220
|
+
<View
|
|
220
221
|
style={[
|
|
221
222
|
styles.container,
|
|
222
|
-
animatedContainerStyle(
|
|
223
|
-
isActiveGesture || layoutState.docked,
|
|
224
|
-
progressBarHeight
|
|
225
|
-
),
|
|
226
223
|
{
|
|
227
224
|
height: minimisedHeight + bottomTabBarHeight + insets.bottom,
|
|
228
225
|
},
|
|
229
226
|
]}
|
|
230
227
|
>
|
|
231
|
-
{!playerState.isLive
|
|
232
|
-
(layoutState.docked || startComponentsAnimation) ? (
|
|
228
|
+
{!playerState.isLive ? (
|
|
233
229
|
<ProgressBar
|
|
234
|
-
name={"
|
|
230
|
+
name={"shared-docked-layout"}
|
|
235
231
|
content={entry}
|
|
236
232
|
value={value}
|
|
237
233
|
visible
|
|
@@ -244,43 +240,33 @@ export const DockedControls = (props: Props) => {
|
|
|
244
240
|
) : null}
|
|
245
241
|
|
|
246
242
|
<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
|
-
/>
|
|
243
|
+
<View style={styles.touchableArea}>
|
|
244
|
+
{isActiveGesture || layoutState.docked ? (
|
|
245
|
+
<View style={{ aspectRatio: aspectRatio, height: minimisedHeight }}>
|
|
246
|
+
{ImageComponent || null}
|
|
281
247
|
</View>
|
|
248
|
+
) : (
|
|
249
|
+
<View
|
|
250
|
+
style={playerDimensionsStyle(
|
|
251
|
+
minimisedHeight,
|
|
252
|
+
isActiveGesture || layoutState.docked
|
|
253
|
+
)}
|
|
254
|
+
/>
|
|
255
|
+
)}
|
|
256
|
+
<View
|
|
257
|
+
testID="content-info"
|
|
258
|
+
style={[
|
|
259
|
+
styles.contentInfo,
|
|
260
|
+
{ backgroundColor: dockedBackgroundColor },
|
|
261
|
+
]}
|
|
262
|
+
>
|
|
263
|
+
<ContentInfo
|
|
264
|
+
content={{ ...entry, title, summary }}
|
|
265
|
+
value={value}
|
|
266
|
+
docked
|
|
267
|
+
/>
|
|
282
268
|
</View>
|
|
283
|
-
</
|
|
269
|
+
</View>
|
|
284
270
|
<View
|
|
285
271
|
style={[
|
|
286
272
|
isTablet
|
|
@@ -314,6 +300,6 @@ export const DockedControls = (props: Props) => {
|
|
|
314
300
|
backgroundColor: dockedBackgroundColor,
|
|
315
301
|
}}
|
|
316
302
|
/>
|
|
317
|
-
</
|
|
303
|
+
</View>
|
|
318
304
|
);
|
|
319
305
|
};
|
|
@@ -12,7 +12,6 @@ import { PlayerImage } from "./PlayerImage";
|
|
|
12
12
|
import { Controls } from "./Controls";
|
|
13
13
|
|
|
14
14
|
import { useMobileLayoutImageSize, useTransportInfoHeight } from "./hooks";
|
|
15
|
-
import { DockedControls } from "./DockedControls";
|
|
16
15
|
import { DEBUG, withDebug } from "./debug";
|
|
17
16
|
import {
|
|
18
17
|
BottomDebugSquare,
|
|
@@ -56,6 +55,7 @@ const mobileStyles = ({
|
|
|
56
55
|
imageSize,
|
|
57
56
|
}): ViewStyle => ({
|
|
58
57
|
height: screenHeight - topInset - bottomInset,
|
|
58
|
+
width: "100%",
|
|
59
59
|
|
|
60
60
|
opacity: imageSize ? 1 : 0, // hide content until imageSize is calculated
|
|
61
61
|
|
|
@@ -77,7 +77,6 @@ export function MobileLayout({
|
|
|
77
77
|
onSkipStart,
|
|
78
78
|
onSkipLive,
|
|
79
79
|
onSpeedButtonPress,
|
|
80
|
-
onCloseVideoModal,
|
|
81
80
|
playbackSpeedName,
|
|
82
81
|
configuration,
|
|
83
82
|
dimensions,
|
|
@@ -168,7 +167,6 @@ export function MobileLayout({
|
|
|
168
167
|
value={value}
|
|
169
168
|
configuration={configuration}
|
|
170
169
|
onPlayerSeek={onPlayerSeek}
|
|
171
|
-
onCloseVideoModal={onCloseVideoModal}
|
|
172
170
|
dimensions={dimensions}
|
|
173
171
|
playNextData={playNextData}
|
|
174
172
|
title={title}
|
|
@@ -204,19 +202,6 @@ export function MobileLayout({
|
|
|
204
202
|
/>
|
|
205
203
|
</View>
|
|
206
204
|
</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
205
|
</View>
|
|
221
206
|
);
|
|
222
207
|
}
|
|
@@ -2,15 +2,6 @@ import React, { PropsWithChildren } from "react";
|
|
|
2
2
|
import { Image, Animated, StyleSheet, ImageStyle } from "react-native";
|
|
3
3
|
|
|
4
4
|
import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
|
|
5
|
-
import {
|
|
6
|
-
useModalAnimationContext,
|
|
7
|
-
PlayerAnimationStateEnum,
|
|
8
|
-
DURATION_TO_MINIMIZE,
|
|
9
|
-
DURATION_TO_MAXIMIZE,
|
|
10
|
-
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
11
|
-
import { PlayerAnimationStateT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/ModalAnimationContext";
|
|
12
|
-
|
|
13
|
-
import { useChangePlayerState } from "./hooks";
|
|
14
5
|
|
|
15
6
|
const styles = StyleSheet.create({
|
|
16
7
|
container: {
|
|
@@ -24,10 +15,9 @@ type Props = PropsWithChildren<{
|
|
|
24
15
|
entry: ZappEntry;
|
|
25
16
|
style?: ImageStyle | ImageStyle[];
|
|
26
17
|
imageWidth: number;
|
|
27
|
-
docked: boolean;
|
|
28
18
|
}>;
|
|
29
19
|
|
|
30
|
-
export const AnimatedImage = ({ entry, style, imageWidth
|
|
20
|
+
export const AnimatedImage = ({ entry, style, imageWidth }: Props) => {
|
|
31
21
|
const heightAnim = React.useRef(new Animated.Value(imageWidth)).current;
|
|
32
22
|
|
|
33
23
|
const source = React.useMemo(
|
|
@@ -35,41 +25,6 @@ export const AnimatedImage = ({ entry, style, imageWidth, docked }: Props) => {
|
|
|
35
25
|
[entry]
|
|
36
26
|
);
|
|
37
27
|
|
|
38
|
-
const { minimisedHeight } = useModalAnimationContext();
|
|
39
|
-
|
|
40
|
-
const changePlayerState$ = useChangePlayerState({ docked });
|
|
41
|
-
|
|
42
|
-
React.useEffect(() => {
|
|
43
|
-
const subscription = changePlayerState$.subscribe({
|
|
44
|
-
next: (nextPlayerState: PlayerAnimationStateT) => {
|
|
45
|
-
if (nextPlayerState === PlayerAnimationStateEnum.minimize) {
|
|
46
|
-
Animated.timing(heightAnim, {
|
|
47
|
-
toValue: minimisedHeight,
|
|
48
|
-
duration: DURATION_TO_MINIMIZE,
|
|
49
|
-
useNativeDriver: false, // width/height can't use native driver
|
|
50
|
-
}).start();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (nextPlayerState === PlayerAnimationStateEnum.maximize) {
|
|
54
|
-
Animated.timing(heightAnim, {
|
|
55
|
-
toValue: imageWidth,
|
|
56
|
-
duration: DURATION_TO_MAXIMIZE,
|
|
57
|
-
useNativeDriver: false, // width/height can't use native driver
|
|
58
|
-
}).start();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (nextPlayerState === PlayerAnimationStateEnum.appear_as_docked) {
|
|
62
|
-
// minimize image immediatly
|
|
63
|
-
heightAnim.setValue(minimisedHeight);
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
return () => {
|
|
69
|
-
subscription.unsubscribe();
|
|
70
|
-
};
|
|
71
|
-
}, [changePlayerState$, minimisedHeight, imageWidth]);
|
|
72
|
-
|
|
73
28
|
if (!source) return null;
|
|
74
29
|
|
|
75
30
|
return (
|