@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/quick-brick-player",
3
- "version": "14.0.0-alpha.2847632144",
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": "13.0.0-rc.124",
39
- "@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.3",
40
- "@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.2847632144",
41
- "@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.2847632144",
42
- "@applicaster/zapp-react-native-utils": "14.0.0-alpha.2847632144",
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
- import {
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
- <AnimationComponent
289
- animationType={ComponentAnimationType.moveUpComponent}
290
- additionalData={{ saveArea: true }}
291
- style={Styles.playerContainer}
292
- >
293
- <AnimatedScrollModal>
294
- <View style={Styles.playerContainer} onLayout={onLayout}>
295
- <Layout
296
- entry={entry}
297
- playerState={playerState}
298
- layoutState={layoutState}
299
- value={value}
300
- onPlaybackButtonPress={onPlaybackButtonPress}
301
- onRewindButtonPress={onRewindButtonPress}
302
- onForwardButtonPress={onForwardButtonPress}
303
- onPlayerSeek={onPlayerSeek}
304
- onSkipStart={onSkipStart}
305
- onSpeedButtonPress={onSpeedButtonPress}
306
- playbackSpeedName={formatSpeed(playbackSpeed.value)}
307
- onSkipLive={onSkipLive}
308
- onCloseVideoModal={onCloseVideoModal}
309
- maximiseVideoModal={maximiseVideoModal}
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 { useIsTablet } from "@applicaster/zapp-react-native-utils/reactHooks";
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 isTablet = useIsTablet();
170
+ const onCloseVideoModal = React.useCallback(() => {
171
+ playerManager.close();
172
+ }, []);
195
173
 
196
- const liveButton = Boolean(value("live_badge_enabled"));
174
+ const { minimised_height: minimisedHeight } = useConfiguration();
197
175
 
198
- const {
199
- isActiveGesture,
200
- setPlayerAnimationState,
201
- startComponentsAnimation,
202
- minimisedHeight,
203
- progressBarHeight,
204
- } = useModalAnimationContext();
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
- const maximazeVideoModal = React.useCallback(
207
- () => setPlayerAnimationState(PlayerAnimationStateEnum.maximize),
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
- <AnimationComponent
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={"audio-docked-layout"}
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
- style={backgroundImageStyle(
249
- dimensions,
250
- minimisedHeight,
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
- </TouchableWithoutFeedback>
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
- </AnimationComponent>
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, docked }: Props) => {
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 (