@applicaster/quick-brick-player 12.0.0-alpha.3343511343 → 12.0.0-alpha.3358313600

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": "12.0.0-alpha.3343511343",
3
+ "version": "12.0.0-alpha.3358313600",
4
4
  "description": "Quick Brick Player",
5
5
  "main": "./src/index.ts",
6
6
  "types": "index.d.ts",
@@ -36,11 +36,11 @@
36
36
  },
37
37
  "homepage": "https://github.com/applicaster/quickbrick#readme",
38
38
  "dependencies": {
39
- "@applicaster/quick-brick-mobile-transport-controls": "12.0.0-rc.32",
39
+ "@applicaster/quick-brick-mobile-transport-controls": "12.0.0-alpha.3358313600",
40
40
  "@applicaster/quick-brick-tv-transport-controls": "11.0.0-rc.133",
41
- "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.3343511343",
42
- "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.3343511343",
43
- "@applicaster/zapp-react-native-utils": "12.0.0-alpha.3343511343",
41
+ "@applicaster/zapp-react-native-tvos-app": "12.0.0-alpha.3358313600",
42
+ "@applicaster/zapp-react-native-ui-components": "12.0.0-alpha.3358313600",
43
+ "@applicaster/zapp-react-native-utils": "12.0.0-alpha.3358313600",
44
44
  "keymirror": "^0.1.1",
45
45
  "query-string": "7.1.3",
46
46
  "react-native-web-linear-gradient": "1.1.2",
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { ViewStyle, View, ScrollView } from "react-native";
2
+ import { ViewStyle, View } from "react-native";
3
3
 
4
4
  import { SafeAreaView, Edge } from "react-native-safe-area-context";
5
5
  import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
@@ -26,6 +26,12 @@ import {
26
26
  import { localStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/LocalStorage";
27
27
  import { addQueryParam, getLiveUrl } from "../Utils";
28
28
  import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
29
+ import {
30
+ AnimationComponent,
31
+ ComponentAnimationType,
32
+ AnimatedScrollModal,
33
+ } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
34
+ import { PADDING_HORIZONTAL } from "./Layout/defaultLayoutsConts";
29
35
 
30
36
  const { log_debug } = createLogger({
31
37
  subsystem: "UIComponent",
@@ -68,29 +74,20 @@ export const defaultAspectRatioWidth = (height: number): number =>
68
74
  (height / 9) * 16;
69
75
 
70
76
  const Styles = {
71
- mainContainer: (docked: boolean, style: ViewStyle) => {
77
+ mainContainer: (style: ViewStyle) => {
72
78
  const combinedStyle: ViewStyle = {
73
79
  flex: 1,
74
80
  };
75
81
 
76
- if (!docked) {
77
- style.paddingTop = 0;
78
- style.paddingHorizontal = 15;
79
- }
80
-
81
- return { ...combinedStyle, ...style };
82
- },
83
- playerContainer: (docked: boolean, style: ViewStyle) => {
84
- const combinedStyle: ViewStyle = {
85
- flex: 1,
82
+ return {
83
+ ...combinedStyle,
84
+ ...style,
86
85
  };
87
-
88
- if (docked) {
89
- combinedStyle.height = style.height;
90
- }
91
-
92
- return combinedStyle;
93
86
  },
87
+ playerContainer: {
88
+ flex: 1,
89
+ },
90
+ paddingHorizontal: { paddingTop: 0, paddingHorizontal: PADDING_HORIZONTAL },
94
91
 
95
92
  controlsMobile: {
96
93
  height: 50,
@@ -168,6 +165,9 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
168
165
 
169
166
  const [sleepTimerDate, setSleepTimerDate] = useState(0);
170
167
 
168
+ const [defaultDimensions, setDefaultDimensions] =
169
+ React.useState<Dimensions>(undefined);
170
+
171
171
  const [dimensions, setDimensions] = React.useState<Dimensions>({
172
172
  width: 0,
173
173
  height: 0,
@@ -181,9 +181,11 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
181
181
  const { width, height } = event.nativeEvent.layout;
182
182
 
183
183
  setDimensions({
184
- width: docked ? defaultAspectRatioWidth(height) : width,
184
+ width,
185
185
  height,
186
186
  });
187
+
188
+ if (!defaultDimensions) setDefaultDimensions({ width, height });
187
189
  };
188
190
 
189
191
  const cancelSleepTimer = async () => {
@@ -375,58 +377,64 @@ export const AudioPlayerWrapper: React.FC<Props> = (props: Props) => {
375
377
  player?.seekTo(0);
376
378
  }, [player]);
377
379
 
378
- const edges = React.useMemo<Edge[]>(
379
- () => (docked ? [] : ["right", "left", "top"]),
380
- [docked]
381
- );
380
+ const edges = React.useMemo<Edge[]>(() => ["right", "left", "top"], [docked]);
382
381
 
383
- const ContainerView = docked ? View : SafeAreaView;
382
+ const ContainerView = SafeAreaView;
384
383
 
385
384
  const MainContent = React.useMemo(() => {
386
385
  return (
387
- <ContainerView style={Styles.mainContainer(docked, style)} edges={edges}>
388
- <ScrollView
389
- style={Styles.playerContainer(docked, style)}
390
- onLayout={onLayout}
386
+ <ContainerView style={Styles.mainContainer(style)} edges={edges}>
387
+ <AnimationComponent
388
+ animationType={ComponentAnimationType.moveUpComponent}
389
+ additionalData={{ saveArea: true }}
391
390
  >
392
- <Layout
393
- entry={entry}
394
- playerState={playerState}
395
- layoutState={layoutState}
396
- value={value}
397
- onPlaybackButtonPress={onPlaybackButtonPress}
398
- onRewindButtonPress={onRewindButtonPress}
399
- onForwardButtonPress={onForwardButtonPress}
400
- onPlayerSeek={onPlayerSeek}
401
- onSkipStart={onSkipStart}
402
- onSpeedButtonPress={onSpeedButtonPress}
403
- onSleepButtonPress={onSleepButtonPress}
404
- playbackSpeedName={formatSpeed(playbackSpeed.value)}
405
- playbackSleepName={
406
- sleepTimer.value === 0 ? "sleep_timer" : "sleep_timer_active"
407
- }
408
- sleepTimerDate={sleepTimerDate}
409
- cancelSleepTimer={cancelSleepTimer}
410
- onSkipLive={onSkipLive}
411
- onCloseVideoModal={onCloseVideoModal}
412
- maximiseVideoModal={maximiseVideoModal}
413
- configuration={configuration}
414
- dimensions={dimensions}
415
- playNextData={playNextData}
416
- title={title}
417
- summary={summary}
418
- />
419
- {children}
420
- {!docked && (
421
- <PlayerDetails
422
- configuration={configuration}
423
- style={Styles.playerDetails}
424
- entry={entry}
425
- isTabletLandscape={isTabletLandscape}
426
- isAudioPlayer={true}
427
- />
428
- )}
429
- </ScrollView>
391
+ <AnimatedScrollModal>
392
+ <View style={Styles.playerContainer} onLayout={onLayout}>
393
+ <Layout
394
+ entry={entry}
395
+ playerState={playerState}
396
+ layoutState={layoutState}
397
+ value={value}
398
+ onPlaybackButtonPress={onPlaybackButtonPress}
399
+ onRewindButtonPress={onRewindButtonPress}
400
+ onForwardButtonPress={onForwardButtonPress}
401
+ onPlayerSeek={onPlayerSeek}
402
+ onSkipStart={onSkipStart}
403
+ onSpeedButtonPress={onSpeedButtonPress}
404
+ onSleepButtonPress={onSleepButtonPress}
405
+ playbackSpeedName={formatSpeed(playbackSpeed.value)}
406
+ playbackSleepName={
407
+ sleepTimer.value === 0 ? "sleep_timer" : "sleep_timer_active"
408
+ }
409
+ sleepTimerDate={sleepTimerDate}
410
+ cancelSleepTimer={cancelSleepTimer}
411
+ onSkipLive={onSkipLive}
412
+ onCloseVideoModal={onCloseVideoModal}
413
+ maximiseVideoModal={maximiseVideoModal}
414
+ configuration={configuration}
415
+ dimensions={dimensions}
416
+ playNextData={playNextData}
417
+ title={title}
418
+ summary={summary}
419
+ defaultDimensions={defaultDimensions}
420
+ />
421
+ <View style={Styles.paddingHorizontal}>
422
+ {children}
423
+ <AnimationComponent
424
+ animationType={ComponentAnimationType.componentFade}
425
+ >
426
+ <PlayerDetails
427
+ configuration={configuration}
428
+ style={Styles.playerDetails}
429
+ entry={entry}
430
+ isTabletLandscape={isTabletLandscape}
431
+ isAudioPlayer={true}
432
+ />
433
+ </AnimationComponent>
434
+ </View>
435
+ </View>
436
+ </AnimatedScrollModal>
437
+ </AnimationComponent>
430
438
  </ContainerView>
431
439
  );
432
440
  }, [
@@ -18,13 +18,21 @@ import {
18
18
  rewindButton,
19
19
  skipToStartButton,
20
20
  skipToLiveButton,
21
+ PADDING_HORIZONTAL,
21
22
  speedButton,
22
23
  sleepButton,
23
24
  } from "./defaultLayoutsConts";
24
25
  import { AudioDescription } from "../AudioDescription";
25
26
  import { PlayerImageBackground } from "@applicaster/zapp-react-native-ui-components/Components/PlayerImageBackground";
26
27
  import { useLanguageData } from "@applicaster/zapp-react-native-utils/reactHooks/player";
28
+ import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
27
29
  import { useEffect, useMemo, useState } from "react";
30
+ import {
31
+ useModalAnimationContext,
32
+ AnimationComponent,
33
+ ComponentAnimationType,
34
+ } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
35
+ import DockedLayout from "./DockedLayout";
28
36
 
29
37
  type Dimensions = {
30
38
  width: number;
@@ -60,9 +68,13 @@ type LayoutProps = {
60
68
  onPlayerSeek: (targetTime: number) => void;
61
69
  onSkipLive: () => void;
62
70
  onSkipStart: () => void;
71
+ onCloseVideoModal: () => void;
72
+ maximiseVideoModal: () => void;
63
73
  dimensions: Dimensions;
74
+ playNextData: PlayNextData;
64
75
  title: string | number;
65
76
  summary: string | number;
77
+ defaultDimensions: Dimensions;
66
78
  };
67
79
 
68
80
  const Styles = {
@@ -72,10 +84,13 @@ const Styles = {
72
84
  alignItems: "center",
73
85
  justifyContent: isPortraitMode ? "center" : "flex-start",
74
86
  }),
75
- tabletLayout: {
76
- width: 463,
87
+ playerImageWrapper: {
88
+ width: "100%",
77
89
  maxHeight: 750,
78
90
  marginTop: 80,
91
+ },
92
+ tabletLayout: {
93
+ width: 463,
79
94
  marginBottom: 80,
80
95
  },
81
96
  controls: (isTablet: boolean, isLiveShowFullControls: boolean) => ({
@@ -84,24 +99,31 @@ const Styles = {
84
99
  justifyContent: isLiveShowFullControls ? "space-between" : "space-evenly",
85
100
  }),
86
101
  backgroundImageContainer: (dimensions: Dimensions, isTablet: boolean) => {
102
+ const mobileValue = dimensions.width
103
+ ? dimensions.width - PADDING_HORIZONTAL * 2
104
+ : 330;
105
+
87
106
  return {
88
- width: isTablet ? 463 : dimensions.width || 330,
89
- height: isTablet ? 463 : dimensions.width || 330,
107
+ width: isTablet ? 463 : mobileValue,
108
+ height: isTablet ? 463 : mobileValue,
90
109
  };
91
110
  },
92
- backgroundImageContainerImageStyle: (isTablet) => ({
93
- borderRadius: isTablet ? 24 : 10,
111
+ backgroundImageContainerImageStyle: (
112
+ isTablet,
113
+ docked,
114
+ startComponentsAnimation,
115
+ isActiveGesture
116
+ ) => ({
117
+ borderRadius:
118
+ (startComponentsAnimation && isActiveGesture) || docked
119
+ ? 0
120
+ : isTablet
121
+ ? 24
122
+ : 10,
94
123
  }),
95
- playerContainer: (docked: boolean, style) => {
96
- const combinedStyle = {
97
- flex: 1,
98
- };
99
-
100
- if (docked) {
101
- combinedStyle["height"] = style.height;
102
- }
103
124
 
104
- return combinedStyle;
125
+ paddingHorizontal: {
126
+ paddingHorizontal: PADDING_HORIZONTAL,
105
127
  },
106
128
 
107
129
  controlsMobile: {
@@ -115,6 +137,12 @@ const Styles = {
115
137
  separator: {
116
138
  height: 20,
117
139
  },
140
+ flexDirectionRow: {
141
+ flexDirection: "row",
142
+ },
143
+ alignItemsCenter: {
144
+ alignItems: "center",
145
+ },
118
146
  };
119
147
 
120
148
  export default function DefaultLayout(props: LayoutProps) {
@@ -139,12 +167,14 @@ export default function DefaultLayout(props: LayoutProps) {
139
167
  sleepTimerDate,
140
168
  title,
141
169
  summary,
170
+ defaultDimensions,
142
171
  } = props;
143
172
 
144
173
  const isTablet = useIsTablet();
145
174
  const { width, height } = dimensions;
146
175
  const isPortraitMode = width < height;
147
176
  const isLiveContent = playerState.isLive;
177
+ const docked = layoutState.docked;
148
178
 
149
179
  const languageData = useLanguageData("audio-player");
150
180
 
@@ -268,7 +298,7 @@ export default function DefaultLayout(props: LayoutProps) {
268
298
  });
269
299
  }, 1000);
270
300
 
271
- // Clearing the interval when the component unmounts or dependencies change
301
+ // Clearing the interval when the component unmounts or dependencies changea
272
302
  return () => clearInterval(intervalId);
273
303
  } else {
274
304
  // Ensure the timeLeft state is set correctly if showCounter is false
@@ -283,71 +313,120 @@ export default function DefaultLayout(props: LayoutProps) {
283
313
  const needsToShowProgressBar =
284
314
  (isLiveContent && liveSeekingEnabled) || !isLiveContent;
285
315
 
316
+ const defaultImageDimensions = React.useMemo(
317
+ () =>
318
+ defaultDimensions &&
319
+ Styles.backgroundImageContainer(defaultDimensions, isTablet),
320
+ [defaultDimensions]
321
+ );
322
+
323
+ const { isActiveGesture, startComponentsAnimation } =
324
+ useModalAnimationContext();
325
+
286
326
  return (
287
327
  <View
288
328
  style={
289
329
  isTablet ? Styles.tabletContainer(isPortraitMode) : Styles.container
290
330
  }
291
331
  >
292
- <TransportInfo
293
- content={entry}
294
- value={value}
295
- visible={true}
296
- languageData={languageData}
297
- layoutState={layoutState}
298
- actionButtons={actionButtons}
299
- />
300
- <View
301
- style={
302
- isTablet ? Styles.tabletContainer(isPortraitMode) : Styles.container
303
- }
332
+ <AnimationComponent animationType={ComponentAnimationType.componentFade}>
333
+ <TransportInfo
334
+ content={entry}
335
+ value={value}
336
+ visible={true}
337
+ languageData={languageData}
338
+ layoutState={layoutState}
339
+ actionButtons={actionButtons}
340
+ />
341
+ </AnimationComponent>
342
+ <AnimationComponent
343
+ animationType={ComponentAnimationType.moveUpComponent}
344
+ style={isTablet ? Styles.playerImageWrapper : null}
304
345
  >
305
- <View style={isTablet ? Styles.tabletLayout : null}>
346
+ <AnimationComponent
347
+ animationType={ComponentAnimationType.moveComponentHorizontal}
348
+ additionalData={{
349
+ disableAnimatedComponent: !isTablet,
350
+ moveValue: (dimensions.width - 463) / 2,
351
+ extraAnimation: !isTablet
352
+ ? {
353
+ [ComponentAnimationType.audioPlayerPaddingHorizontal]: {
354
+ style: Styles.paddingHorizontal,
355
+ },
356
+ }
357
+ : null,
358
+ }}
359
+ style={isTablet ? Styles.alignItemsCenter : null}
360
+ >
306
361
  <PlayerImageBackground
307
362
  entry={entry}
308
363
  style={Styles.backgroundImageContainer(dimensions, isTablet)}
309
- imageStyle={Styles.backgroundImageContainerImageStyle(isTablet)}
310
- />
311
- <AudioDescription
312
- title={title}
313
- summary={summary}
314
- value={value}
315
- layoutState={layoutState}
364
+ imageStyle={Styles.backgroundImageContainerImageStyle(
365
+ isTablet,
366
+ docked,
367
+ startComponentsAnimation,
368
+ isActiveGesture
369
+ )}
370
+ defaultImageDimensions={defaultImageDimensions}
316
371
  />
317
- <Separator />
318
- {needsToShowProgressBar && (
319
- <View>
320
- <ProgressBar
321
- content={entry}
322
- value={value}
323
- visible={true}
324
- layoutState={layoutState}
325
- onPlayerSeek={onPlayerSeek}
326
- playerState={playerState}
327
- disableFullscreen={true}
328
- sliderStyle={2}
329
- />
330
-
331
- {showCounter && timeLeft >= 0 && (
332
- <CountDown
333
- timeLeft={timeLeft}
372
+ </AnimationComponent>
373
+
374
+ <DockedLayout {...props} />
375
+ </AnimationComponent>
376
+ <View
377
+ style={[
378
+ Styles.paddingHorizontal,
379
+ isTablet ? Styles.tabletLayout : null,
380
+ ]}
381
+ >
382
+ {!docked && (
383
+ <AnimationComponent
384
+ animationType={ComponentAnimationType.componentFade}
385
+ >
386
+ <AudioDescription
387
+ title={title}
388
+ summary={summary}
389
+ value={value}
390
+ layoutState={layoutState}
391
+ />
392
+ <Separator />
393
+ {needsToShowProgressBar && (
394
+ <View>
395
+ <ProgressBar
396
+ content={entry}
334
397
  value={value}
335
- title={sleepTitle}
398
+ visible={true}
399
+ layoutState={layoutState}
400
+ onPlayerSeek={onPlayerSeek}
401
+ playerState={playerState}
402
+ disableFullscreen={true}
403
+ sliderStyle={2}
336
404
  />
337
- )}
338
405
 
339
- <Separator />
340
- </View>
341
- )}
342
- <Controls
343
- value={value}
344
- visible={true}
345
- keepAlive={null}
346
- buttons={controlButtons}
347
- style={Styles.controls(isTablet, isLiveContent && showFullControls)}
348
- playerState={playerState}
349
- />
350
- </View>
406
+ {showCounter && timeLeft >= 0 && (
407
+ <CountDown
408
+ timeLeft={timeLeft}
409
+ value={value}
410
+ title={sleepTitle}
411
+ />
412
+ )}
413
+
414
+ <Separator />
415
+ </View>
416
+ )}
417
+ <Controls
418
+ value={value}
419
+ visible={true}
420
+ keepAlive={null}
421
+ buttons={controlButtons}
422
+ style={Styles.controls(
423
+ isTablet,
424
+ isLiveContent && showFullControls
425
+ )}
426
+ playerState={playerState}
427
+ />
428
+ </AnimationComponent>
429
+ )}
351
430
  </View>
352
431
  </View>
353
432
  );
@@ -15,8 +15,13 @@ import {
15
15
  Button,
16
16
  } from "@applicaster/quick-brick-mobile-transport-controls";
17
17
 
18
- import { PlayerImageBackground } from "@applicaster/zapp-react-native-ui-components/Components/PlayerImageBackground";
19
18
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
19
+ import {
20
+ useModalAnimationContext,
21
+ AnimationComponent,
22
+ ComponentAnimationType,
23
+ PlayerAnimationStateEnum,
24
+ } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
20
25
 
21
26
  type Dimensions = {
22
27
  width: number;
@@ -104,14 +109,26 @@ const backgroundColorStyle = (value: GetValue): ViewStyle => ({
104
109
  backgroundColor: value("docked_player_background_color"),
105
110
  });
106
111
 
107
- const playerDimensionsStyle = ({
108
- height,
109
- }: PlayerDimensionsProp): ViewStyle => ({
110
- paddingLeft: height || 100,
112
+ const playerDimensionsStyle = (
113
+ minimisedHeight: number,
114
+ addPadding: boolean
115
+ ): ViewStyle => ({
116
+ paddingLeft: addPadding ? minimisedHeight || 100 : 0,
111
117
  });
112
118
 
113
- const backgroundImageStyle = (dimensions: Dimensions): ViewStyle => ({
114
- height: dimensions.height,
119
+ const animatedContainerStyle = (docked: boolean): ViewStyle => ({
120
+ top: docked ? 2 : null,
121
+ position: "absolute",
122
+ width: "100%",
123
+ zIndex: docked ? 1 : -1,
124
+ });
125
+
126
+ const backgroundImageStyle = (
127
+ dimensions: Dimensions,
128
+ minimisedHeight: number,
129
+ isActiveGesture: boolean
130
+ ): ViewStyle => ({
131
+ height: isActiveGesture ? minimisedHeight : dimensions.height,
115
132
  aspectRatio: 1,
116
133
  position: "absolute",
117
134
  });
@@ -193,7 +210,6 @@ export default function DockedLayout(props: LayoutProps) {
193
210
  dimensions,
194
211
  entry,
195
212
  onCloseVideoModal,
196
- maximiseVideoModal,
197
213
  onPlayerSeek,
198
214
  playerState,
199
215
  configuration,
@@ -207,9 +223,29 @@ export default function DockedLayout(props: LayoutProps) {
207
223
  const visible = true;
208
224
  const liveButton = Boolean(value("live_badge_enabled"));
209
225
 
226
+ const {
227
+ isActiveGesture,
228
+ setPlayerAnimationState,
229
+ startComponentsAnimation,
230
+ minimisedHeight,
231
+ } = useModalAnimationContext();
232
+
233
+ const maximazeVideoModal = React.useCallback(
234
+ () => setPlayerAnimationState(PlayerAnimationStateEnum.maximaze),
235
+ []
236
+ );
237
+
238
+ if (!layoutState.docked && !startComponentsAnimation) return null;
239
+
210
240
  return (
211
- <View style={styles.container}>
212
- {!playerState.isLive && (
241
+ <AnimationComponent
242
+ animationType={ComponentAnimationType.componentAppears}
243
+ style={[
244
+ styles.container,
245
+ animatedContainerStyle(isActiveGesture || layoutState.docked),
246
+ ]}
247
+ >
248
+ {!playerState.isLive && layoutState.docked && (
213
249
  <ProgressBar
214
250
  content={entry}
215
251
  value={value}
@@ -217,18 +253,27 @@ export default function DockedLayout(props: LayoutProps) {
217
253
  layoutState={layoutState}
218
254
  onPlayerSeek={onPlayerSeek}
219
255
  playerState={playerState}
256
+ docked
220
257
  />
221
258
  )}
222
259
 
223
260
  <View style={styles.content}>
224
- <PlayerImageBackground
225
- configuration={configuration}
226
- entry={entry}
227
- style={backgroundImageStyle(dimensions)}
261
+ <View
262
+ style={backgroundImageStyle(
263
+ dimensions,
264
+ minimisedHeight,
265
+ isActiveGesture
266
+ )}
228
267
  />
229
- <TouchableWithoutFeedback onPress={maximiseVideoModal}>
268
+ <TouchableWithoutFeedback onPress={maximazeVideoModal}>
230
269
  <View
231
- style={[styles.touchableArea, playerDimensionsStyle(dimensions)]}
270
+ style={[
271
+ styles.touchableArea,
272
+ playerDimensionsStyle(
273
+ minimisedHeight,
274
+ isActiveGesture || layoutState.docked
275
+ ),
276
+ ]}
232
277
  >
233
278
  <View
234
279
  style={[
@@ -272,6 +317,6 @@ export default function DockedLayout(props: LayoutProps) {
272
317
  />
273
318
  </View>
274
319
  </View>
275
- </View>
320
+ </AnimationComponent>
276
321
  );
277
322
  }
@@ -19,6 +19,8 @@ const playbackButtonMargins = (
19
19
  ): number =>
20
20
  isLiveShowFullControls ? (isTablet ? 65 : 10) : isTablet ? 95 : 40;
21
21
 
22
+ export const PADDING_HORIZONTAL = 15;
23
+
22
24
  export const playbackButton = ({
23
25
  playerState,
24
26
  liveButton,
@@ -1,6 +1,5 @@
1
1
  import React from "react";
2
2
  import DefaultLayout from "./DefaultLayout";
3
- import DockedLayout from "./DockedLayout";
4
3
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
5
4
 
6
5
  type Dimensions = {
@@ -40,6 +39,7 @@ type LayoutProps = {
40
39
  onSkipLive: () => void;
41
40
  maximiseVideoModal: () => void;
42
41
  dimensions: Dimensions;
42
+ defaultDimensions: Dimensions;
43
43
  playNextData: PlayNextData;
44
44
  title: string | number;
45
45
  summary: string | number;
@@ -48,11 +48,5 @@ type LayoutProps = {
48
48
  export default function Layout(
49
49
  props: LayoutProps
50
50
  ): React.ReactElement<LayoutProps> {
51
- const { layoutState } = props;
52
-
53
- if (layoutState.docked) {
54
- return <DockedLayout {...props} />;
55
- }
56
-
57
51
  return <DefaultLayout {...props} />;
58
52
  }
@@ -111,7 +111,7 @@ export const MagicBG: React.FC<MagicBGProps> = ({
111
111
  };
112
112
 
113
113
  fetchColors();
114
- }, [image, fallbackUrl, colors, defaultColor]);
114
+ }, []);
115
115
 
116
116
  return (
117
117
  <View style={[styles.container, { backgroundColor: dominantColor }]}>
@@ -36,6 +36,12 @@ import { AudioPlayerWrapper } from "./AudioLayer/AudioPlayerWrapper";
36
36
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
37
37
  import { getAllAccessibilityProps } from "@applicaster/zapp-react-native-utils/configurationUtils";
38
38
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
39
+ import { getTargetScreenDataFromEntry } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
40
+ import { isAppleTV } from "@applicaster/zapp-react-native-ui-components/Helpers/Platform";
41
+ import {
42
+ AnimationComponent,
43
+ ComponentAnimationType,
44
+ } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
39
45
 
40
46
  const RNPlayerManager = {
41
47
  QuickBrickPlayerPlugin: isApplePlatform()
@@ -55,6 +61,7 @@ const styles = StyleSheet.create({
55
61
  position: "absolute",
56
62
  zIndex: 1,
57
63
  },
64
+ playerSize: { width: "100%", height: "100%" },
58
65
  });
59
66
 
60
67
  const logger = createLogger({
@@ -555,6 +562,26 @@ export default class VideoPlayer extends React.Component<
555
562
  this.props.listener?.onPlayerDetached?.(nativeEvent);
556
563
  };
557
564
 
565
+ onVideoFullscreenPlayerDidDismiss = () => {
566
+ this.props.listener?.onVideoFullscreenPlayerDidDismiss?.();
567
+ };
568
+
569
+ onVideoFullscreenPlayerDidPresent = () => {
570
+ this.props.listener?.onVideoFullscreenPlayerDidPresent?.();
571
+ };
572
+
573
+ onVideoFullscreenPlayerWillDismiss = () => {
574
+ this.props.listener?.onVideoFullscreenPlayerWillDismiss?.();
575
+ };
576
+
577
+ onVideoFullscreenPlayerWillPresent = () => {
578
+ this.props.listener?.onVideoFullscreenPlayerWillPresent?.();
579
+ };
580
+
581
+ onPlayerClose = () => {
582
+ this.props.listener?.onPlayerClose?.();
583
+ };
584
+
558
585
  onPiPEnter = () => {
559
586
  this.setState({ piped: true });
560
587
  this.props.openPiP();
@@ -759,7 +786,6 @@ export default class VideoPlayer extends React.Component<
759
786
  render() {
760
787
  const {
761
788
  castAction,
762
- controls,
763
789
  docked,
764
790
  entry,
765
791
  fullscreen,
@@ -817,17 +843,31 @@ export default class VideoPlayer extends React.Component<
817
843
  const liveCatchUpEnabled =
818
844
  this.props.pluginConfiguration?.liveCatchUpEnabled;
819
845
 
820
- const hideNativeControls = isTV()
821
- ? { controls: !this.getPlayNextData() }
822
- : {};
846
+ // TODO: Get screen data more reliable way useCurrentScreenData
847
+ const screenData = getTargetScreenDataFromEntry(this.props.playableItem);
848
+
849
+ const isInlineTV = screenData?.ui_components?.length > 0 && isTV();
823
850
 
824
- const platformSpecificProps = isApplePlatform()
851
+ let platformSpecificProps: any = isApplePlatform()
825
852
  ? {
826
- ...hideNativeControls,
827
853
  resizeMode: nativeResizeMode,
828
854
  }
829
855
  : {};
830
856
 
857
+ const supportsNativeControls =
858
+ !!this.props.controller?.supportsNativeControls?.();
859
+
860
+ const controls = isAppleTV()
861
+ ? supportsNativeControls && !isInlineTV && !this.getPlayNextData()
862
+ : supportsNativeControls && !this.getPlayNextData();
863
+
864
+ const shouldUseNativeControls = controls && !docked;
865
+
866
+ platformSpecificProps = {
867
+ ...platformSpecificProps,
868
+ controls: shouldUseNativeControls,
869
+ };
870
+
831
871
  const pictureInPictureEnabled =
832
872
  this.props.pluginConfiguration?.pictureInPictureEnabled;
833
873
 
@@ -835,7 +875,6 @@ export default class VideoPlayer extends React.Component<
835
875
  entry, // Must be passed first in list
836
876
  ...platformSpecificProps,
837
877
  audioTrackId,
838
- controls,
839
878
  docked,
840
879
  enableAutoAudioTrackSelection,
841
880
  fullscreen, // TODO: Check fullscreen params not crash
@@ -890,22 +929,17 @@ export default class VideoPlayer extends React.Component<
890
929
  onVideoEnd: this.onVideoEnd, // complete
891
930
  onVideoError: this.onVideoError, // error
892
931
  onVideoProgress: this.onVideoProgress,
893
- onVideoFullscreenPlayerDidDismiss: this.unHandledEvent(
894
- "onVideoFullscreenPlayerDidPresent"
895
- ),
896
- onVideoFullscreenPlayerDidPresent: this.unHandledEvent(
897
- "onVideoFullscreenPlayerDidPresent"
898
- ),
899
- onVideoFullscreenPlayerWillDismiss: this.unHandledEvent(
900
- "onVideoFullscreenPlayerWillDismiss"
901
- ),
902
- onVideoFullscreenPlayerWillPresent: this.unHandledEvent(
903
- "onVideoFullscreenPlayerWillPresent"
904
- ),
932
+ onVideoFullscreenPlayerDidDismiss: this.onVideoFullscreenPlayerDidDismiss,
933
+ onVideoFullscreenPlayerDidPresent: this.onVideoFullscreenPlayerDidPresent,
934
+ onVideoFullscreenPlayerWillDismiss:
935
+ this.onVideoFullscreenPlayerWillDismiss,
936
+ onVideoFullscreenPlayerWillPresent:
937
+ this.onVideoFullscreenPlayerWillPresent,
905
938
  onVideoLoad: this.onVideoLoad,
906
939
  onVideoLoadStart: this.unHandledEvent("onVideoLoadStart"),
907
940
  onVideoBuffer: this.onVideoBuffer,
908
941
  onPlaybackStalled: this.onPlaybackStalled,
942
+ onPlayerClose: this.onPlayerClose,
909
943
  onPlayerAttached: this.onPlayerAttached,
910
944
  onPlayerDetached: this.onPlayerDetached,
911
945
  };
@@ -979,7 +1013,7 @@ export default class VideoPlayer extends React.Component<
979
1013
  !needToShowPlayNextOverlay &&
980
1014
  this.props.mode !== "PIP";
981
1015
 
982
- if (controls === true) {
1016
+ if (shouldUseNativeControls) {
983
1017
  return null;
984
1018
  }
985
1019
 
@@ -1040,20 +1074,7 @@ export default class VideoPlayer extends React.Component<
1040
1074
  />
1041
1075
  )}
1042
1076
  <AudioPlayerWrapper {...sharedWrapperViewProps}>
1043
- <View>
1044
- {
1045
- <PlayNextOverlay
1046
- item={entry}
1047
- playerIsDocked={docked}
1048
- pluginConfiguration={this.getPluginConfiguration()}
1049
- playerId={this.props.playerId}
1050
- playNextData={this.getPlayNextData()}
1051
- setNextVideoPreloadThresholdPercentage={
1052
- this.props.setNextVideoPreloadThresholdPercentage
1053
- }
1054
- />
1055
- }
1056
- </View>
1077
+ <></>
1057
1078
  </AudioPlayerWrapper>
1058
1079
  </View>
1059
1080
  ) : (
@@ -1069,11 +1090,24 @@ export default class VideoPlayer extends React.Component<
1069
1090
  <View style={styles.container}>
1070
1091
  <View style={[playerContainerStyles, playerDimensions]}>
1071
1092
  {isAudioItem && (
1072
- <AudioPlayer
1073
- style={playerDimensions}
1074
- audio_item={entry}
1075
- plugin_configuration={this.getPluginConfiguration()}
1076
- />
1093
+ <AnimationComponent
1094
+ animationType={ComponentAnimationType.player}
1095
+ additionalData={{
1096
+ ...playerDimensions,
1097
+ inlineAudioPlayer: true,
1098
+ }}
1099
+ style={getStyle(playerDimensions)}
1100
+ >
1101
+ <AudioPlayer
1102
+ style={
1103
+ isTV()
1104
+ ? getStyle(playerDimensions)
1105
+ : styles.playerSize
1106
+ }
1107
+ audio_item={entry}
1108
+ plugin_configuration={this.getPluginConfiguration()}
1109
+ />
1110
+ </AnimationComponent>
1077
1111
  )}
1078
1112
 
1079
1113
  {shouldRenderBackground && (
@@ -1086,17 +1120,27 @@ export default class VideoPlayer extends React.Component<
1086
1120
  )}
1087
1121
 
1088
1122
  {!castAction?.state?.connected && (
1089
- <this.props.PlayerComponent
1090
- ref={this._assignRoot}
1091
- {...nativeEvents}
1092
- {...nativeProps}
1093
- listener={this.props.listener}
1123
+ <AnimationComponent
1124
+ animationType={ComponentAnimationType.player}
1125
+ additionalData={playerDimensions}
1094
1126
  style={getStyle(playerDimensions)}
1095
- pluginConfiguration={this.getPluginConfiguration()}
1096
- controller={this.props.controller}
1097
1127
  >
1098
- {this.childrenWithPlayNext()}
1099
- </this.props.PlayerComponent>
1128
+ <this.props.PlayerComponent
1129
+ ref={this._assignRoot}
1130
+ {...nativeEvents}
1131
+ {...nativeProps}
1132
+ listener={this.props.listener}
1133
+ style={
1134
+ isTV()
1135
+ ? getStyle(playerDimensions)
1136
+ : styles.playerSize
1137
+ }
1138
+ pluginConfiguration={this.getPluginConfiguration()}
1139
+ controller={this.props.controller}
1140
+ >
1141
+ {this.childrenWithPlayNext()}
1142
+ </this.props.PlayerComponent>
1143
+ </AnimationComponent>
1100
1144
  )}
1101
1145
  </View>
1102
1146