@applicaster/quick-brick-player 12.0.0-alpha.7725319213 → 12.0.0-alpha.7855034103

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.
@@ -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 = {
@@ -24,27 +23,30 @@ type LayoutProps = {
24
23
  isBuffering: boolean;
25
24
  };
26
25
  value: GetValue;
26
+ sleepTimerDate: number;
27
+ playbackSpeedName: string;
28
+ playbackSleepName: string;
27
29
  configuration: { [key: string]: any };
28
30
  onPlaybackButtonPress: () => void;
29
31
  onRewindButtonPress: () => void;
30
32
  onForwardButtonPress: () => void;
33
+ onSpeedButtonPress: () => void;
34
+ onSleepButtonPress: () => void;
31
35
  onCloseVideoModal: () => void;
36
+ cancelSleepTimer: () => void;
32
37
  onPlayerSeek: (targetTime: number) => void;
33
38
  onSkipStart: () => void;
34
39
  onSkipLive: () => void;
35
40
  maximiseVideoModal: () => void;
36
41
  dimensions: Dimensions;
42
+ defaultDimensions: Dimensions;
37
43
  playNextData: PlayNextData;
44
+ title: string | number;
45
+ summary: string | number;
38
46
  };
39
47
 
40
48
  export default function Layout(
41
49
  props: LayoutProps
42
50
  ): React.ReactElement<LayoutProps> {
43
- const { layoutState } = props;
44
-
45
- if (layoutState.docked) {
46
- return <DockedLayout {...props} />;
47
- }
48
-
49
51
  return <DefaultLayout {...props} />;
50
52
  }
@@ -1,17 +1,19 @@
1
- // Disabling for now as lint can't recognise typescript definition here
2
1
  /* eslint-disable react/prop-types */
3
2
  import * as React from "react";
4
- import { StyleSheet, View } from "react-native";
3
+ import { Animated, StyleSheet, View } from "react-native";
5
4
  import LinearGradient from "../LinearGradient";
6
5
  import { getDominantColor, getPalettes } from "../../../utils/utils";
6
+ import { useEffect } from "react";
7
7
 
8
8
  type MagicBGProps = {
9
9
  children: React.ReactNode;
10
10
  image: string;
11
+ fallbackUrl?: string;
11
12
  defaultColor: string;
13
+ colors: string[];
12
14
  };
13
15
 
14
- const colors = {
16
+ const defaultColors = {
15
17
  overlay: "rgba(0, 0, 0, 0.35)",
16
18
  defaultGradientStart: "rgba(0, 0, 0, 0.25)",
17
19
  defaultGradientEnd: "rgba(0, 0, 0, 0)",
@@ -23,7 +25,7 @@ const styles = StyleSheet.create({
23
25
  },
24
26
  fullScreenOverlay: {
25
27
  ...StyleSheet.absoluteFillObject,
26
- backgroundColor: colors.overlay,
28
+ backgroundColor: defaultColors.overlay,
27
29
  },
28
30
  gradientOverlay: {
29
31
  position: "absolute",
@@ -34,53 +36,120 @@ const styles = StyleSheet.create({
34
36
  },
35
37
  });
36
38
 
39
+ const fetchPaletteAndDominantColor = async (imageUrl: string) => {
40
+ const palette = await getPalettes(imageUrl);
41
+
42
+ const colors = palette.map(
43
+ (color: { r: number; g: number; b: number }) =>
44
+ `rgb(${color.r}, ${color.g}, ${color.b})`
45
+ );
46
+
47
+ const dominant = await getDominantColor(imageUrl);
48
+ const dominantColor = `rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`;
49
+
50
+ return { gradientColors: colors.slice(0, 2), dominantColor };
51
+ };
52
+
37
53
  export const MagicBG: React.FC<MagicBGProps> = ({
38
54
  children,
39
55
  image,
56
+ fallbackUrl = "",
57
+ colors = [],
40
58
  defaultColor,
41
59
  }) => {
42
60
  const [dominantColor, setDominantColor] =
43
61
  React.useState<string>(defaultColor);
44
62
 
45
63
  const [gradientColors, setGradientColors] = React.useState<string[]>([
46
- colors.defaultGradientStart,
47
- colors.defaultGradientEnd,
64
+ defaultColors.defaultGradientStart,
65
+ defaultColors.defaultGradientEnd,
48
66
  ]);
49
67
 
50
- React.useEffect(() => {
51
- const fetchColors = async () => {
52
- if (image) {
53
- try {
54
- const palette = await getPalettes(image);
68
+ const [backgroundColorAnim] = React.useState(new Animated.Value(0)); // from 0 to 1
69
+ const [gradientOpacityAnim] = React.useState(new Animated.Value(0)); // from 0 to 1
55
70
 
56
- const colors = palette.map(
57
- (color: { r: number; g: number; b: number }) =>
58
- `rgb(${color.r}, ${color.g}, ${color.b})`
59
- );
71
+ useEffect(() => {
72
+ const animateColors = () => {
73
+ Animated.timing(backgroundColorAnim, {
74
+ toValue: 1,
75
+ duration: 500,
76
+ useNativeDriver: false,
77
+ }).start();
60
78
 
61
- setGradientColors(colors.slice(0, 2));
79
+ Animated.timing(gradientOpacityAnim, {
80
+ toValue: 1,
81
+ duration: 500,
82
+ useNativeDriver: false,
83
+ }).start();
84
+ };
62
85
 
63
- const dominant = await getDominantColor(image);
64
- setDominantColor(`rgb(${dominant.r}, ${dominant.g}, ${dominant.b})`);
86
+ const fetchColors = async () => {
87
+ if (colors && colors.length > 0) {
88
+ setGradientColors(colors.slice(0, 2));
89
+ setDominantColor(colors[0]);
90
+ animateColors();
91
+ } else if (image) {
92
+ try {
93
+ const { gradientColors, dominantColor } =
94
+ await fetchPaletteAndDominantColor(image);
95
+
96
+ setGradientColors(gradientColors);
97
+ setDominantColor(dominantColor);
98
+ animateColors();
65
99
  } catch (error) {
66
- setGradientColors([
67
- colors.defaultGradientStart,
68
- colors.defaultGradientEnd,
69
- ]);
100
+ try {
101
+ const { gradientColors, dominantColor } =
102
+ await fetchPaletteAndDominantColor(fallbackUrl);
103
+
104
+ setGradientColors(gradientColors);
105
+ setDominantColor(dominantColor);
106
+ animateColors();
107
+ } catch {
108
+ setGradientColors([
109
+ defaultColors.defaultGradientStart,
110
+ defaultColors.defaultGradientEnd,
111
+ ]);
70
112
 
71
- setDominantColor(defaultColor);
113
+ setDominantColor(defaultColor);
114
+ }
72
115
  }
116
+ } else {
117
+ setGradientColors([
118
+ defaultColors.defaultGradientStart,
119
+ defaultColors.defaultGradientEnd,
120
+ ]);
121
+
122
+ setDominantColor(defaultColor);
73
123
  }
74
124
  };
75
125
 
76
126
  fetchColors();
77
- }, [image, defaultColor]);
127
+ }, []);
128
+
129
+ const interpolatedBackgroundColor = backgroundColorAnim.interpolate({
130
+ inputRange: [0, 1],
131
+ outputRange: ["black", dominantColor],
132
+ });
78
133
 
79
134
  return (
80
- <View style={[styles.container, { backgroundColor: dominantColor }]}>
135
+ <Animated.View
136
+ style={[
137
+ styles.container,
138
+ { backgroundColor: interpolatedBackgroundColor },
139
+ ]}
140
+ >
81
141
  <View style={styles.fullScreenOverlay} />
82
- <LinearGradient colors={gradientColors} style={styles.gradientOverlay} />
142
+
143
+ <Animated.View
144
+ style={[styles.gradientOverlay, { opacity: gradientOpacityAnim }]}
145
+ >
146
+ <LinearGradient
147
+ colors={gradientColors}
148
+ style={StyleSheet.absoluteFill}
149
+ />
150
+ </Animated.View>
151
+
83
152
  {children}
84
- </View>
153
+ </Animated.View>
85
154
  );
86
155
  };
@@ -0,0 +1,33 @@
1
+ import { localStorage } from "@applicaster/zapp-react-native-bridge/ZappStorage/LocalStorage";
2
+ import { parseJsonIfNeeded } from "@applicaster/zapp-react-native-utils/functionUtils";
3
+
4
+ export const NAMESPACE = "audio-player";
5
+
6
+ export async function loadItemsFromStorage(key: string) {
7
+ const storedItems = await localStorage.getItem(key, NAMESPACE);
8
+
9
+ return parseJsonIfNeeded(storedItems) || null;
10
+ }
11
+
12
+ export const hasDatePassed = (timestamp: number) => {
13
+ // Get the current date and time
14
+ const currentDate = new Date();
15
+
16
+ // Compare the current date's timestamp with the given timestamp
17
+ return currentDate.getTime() > timestamp;
18
+ };
19
+
20
+ export const formatSpeed = (value: number) => {
21
+ let formattedValue = value.toString();
22
+
23
+ // If the value ends with ".0", remove it
24
+ if (formattedValue.endsWith(".0")) {
25
+ formattedValue = formattedValue.slice(0, -2);
26
+ }
27
+
28
+ // Replace "." with "_"
29
+ formattedValue = formattedValue.replace(".", "_");
30
+
31
+ // Return the formatted string with "speed_" prefix
32
+ return `speed_${formattedValue}`;
33
+ };
@@ -1,21 +1,31 @@
1
- export const toTypeString = (obj) => {
2
- switch (typeof obj) {
3
- case "object":
4
- return obj instanceof Date ? obj.toISOString() : JSON.stringify(obj); // object, null
5
- case "undefined":
6
- return "";
7
- default:
8
- // boolean, number, string
9
- return obj.toString();
10
- }
1
+ import queryString from "query-string";
2
+ import { dayjs } from "@applicaster/zapp-react-native-utils/dateUtils";
3
+
4
+ export const getLiveUrl = (url: string) => {
5
+ // Use the replace method with a regular expression to replace all instances of subClass with livePage
6
+ return url.replace(new RegExp("subClass", "g"), "livePage");
11
7
  };
12
8
 
13
- export const stringsOnlyObject = (obj) => {
14
- const strObj = {};
9
+ export const addQueryParam = (
10
+ baseUrl: string,
11
+ paramName: string,
12
+ paramValue: string | number
13
+ ) => {
14
+ const [urlWithoutQuery, query] = baseUrl.split("?");
15
+
16
+ const parsedQuery = queryString.parse(query);
17
+
18
+ parsedQuery[paramName] = paramValue.toString();
15
19
 
16
- Object.keys(obj).forEach((x) => {
17
- strObj[x] = toTypeString(obj[x]);
18
- });
20
+ const updatedQueryString = queryString.stringify(parsedQuery);
21
+
22
+ return `${urlWithoutQuery}?${updatedQueryString}`;
23
+ };
19
24
 
20
- return strObj;
25
+ export const isValidDate = (dateString: string | undefined): boolean => {
26
+ return (
27
+ typeof dateString === "string" &&
28
+ dateString.trim() !== "" &&
29
+ dayjs.utc(dateString).isValid()
30
+ );
21
31
  };
@@ -1,3 +1 @@
1
- export * from "./AssetsHelper";
2
-
3
1
  export * from "./Utils";
@@ -36,10 +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 {
40
- getTargetScreenDataFromEntry
41
- } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
39
+ import { getTargetScreenDataFromEntry } from "@applicaster/zapp-react-native-utils/reactHooks/screen/useTargetScreenData";
42
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";
43
45
 
44
46
  const RNPlayerManager = {
45
47
  QuickBrickPlayerPlugin: isApplePlatform()
@@ -59,6 +61,7 @@ const styles = StyleSheet.create({
59
61
  position: "absolute",
60
62
  zIndex: 1,
61
63
  },
64
+ playerSize: { width: "100%", height: "100%" },
62
65
  });
63
66
 
64
67
  const logger = createLogger({
@@ -91,7 +94,7 @@ export default class VideoPlayer extends React.Component<
91
94
  // TODO: Can be deleted, on controller logic
92
95
  paused: false,
93
96
  piped: false,
94
- rate: 1,
97
+ rate: 1.0,
95
98
  // TODO: Hack for analytics, must br removed
96
99
  resume: null,
97
100
 
@@ -117,8 +120,6 @@ export default class VideoPlayer extends React.Component<
117
120
  }
118
121
 
119
122
  componentWillUnmount() {
120
- this.stopBackgroundPlayback();
121
-
122
123
  this.playbackStarted = false;
123
124
  this.handleAnalyticEvent(GENERAL_EVENT.session_end);
124
125
  this.onPlayerClosed();
@@ -128,6 +129,11 @@ export default class VideoPlayer extends React.Component<
128
129
  }
129
130
  }
130
131
 
132
+ // For close button
133
+ public closeNativePlayer = () => {
134
+ this.stopBackgroundPlayback();
135
+ };
136
+
131
137
  componentDidMount() {
132
138
  this.playbackStarted = false;
133
139
  this.onPlayerPresented();
@@ -372,6 +378,10 @@ export default class VideoPlayer extends React.Component<
372
378
  }
373
379
  };
374
380
 
381
+ setPlaybackRate = (rate = 1.0) => {
382
+ this.setState({ rate });
383
+ };
384
+
375
385
  getCurrentTime = () => {
376
386
  return this.state.currentTime;
377
387
  };
@@ -555,6 +565,26 @@ export default class VideoPlayer extends React.Component<
555
565
  this.props.listener?.onPlayerDetached?.(nativeEvent);
556
566
  };
557
567
 
568
+ onVideoFullscreenPlayerDidDismiss = () => {
569
+ this.props.listener?.onVideoFullscreenPlayerDidDismiss?.();
570
+ };
571
+
572
+ onVideoFullscreenPlayerDidPresent = () => {
573
+ this.props.listener?.onVideoFullscreenPlayerDidPresent?.();
574
+ };
575
+
576
+ onVideoFullscreenPlayerWillDismiss = () => {
577
+ this.props.listener?.onVideoFullscreenPlayerWillDismiss?.();
578
+ };
579
+
580
+ onVideoFullscreenPlayerWillPresent = () => {
581
+ this.props.listener?.onVideoFullscreenPlayerWillPresent?.();
582
+ };
583
+
584
+ onPlayerClose = () => {
585
+ this.props.listener?.onPlayerClose?.();
586
+ };
587
+
558
588
  onPiPEnter = () => {
559
589
  this.setState({ piped: true });
560
590
  this.props.openPiP();
@@ -758,7 +788,6 @@ export default class VideoPlayer extends React.Component<
758
788
 
759
789
  render() {
760
790
  const {
761
- castAction,
762
791
  docked,
763
792
  entry,
764
793
  fullscreen,
@@ -768,9 +797,15 @@ export default class VideoPlayer extends React.Component<
768
797
  isTabletPortrait,
769
798
  muted,
770
799
  style,
800
+ castAction,
801
+ controller,
802
+ startComponentsAnimation,
771
803
  } = this.props;
772
804
 
773
- const { audioTrackId, keyEvent, paused, seek, textTrackId } = this.state;
805
+ const supportNativeCast = controller.supportNativeCast();
806
+
807
+ const { audioTrackId, keyEvent, paused, seek, textTrackId, rate } =
808
+ this.state;
774
809
 
775
810
  const isAudioItem =
776
811
  entry?.content?.type?.includes?.("audio") ||
@@ -822,26 +857,28 @@ export default class VideoPlayer extends React.Component<
822
857
 
823
858
  let platformSpecificProps: any = isApplePlatform()
824
859
  ? {
825
- resizeMode: nativeResizeMode,
826
- } : {};
860
+ resizeMode: nativeResizeMode,
861
+ }
862
+ : {};
827
863
 
828
- const supportsNativeControls = !!this.props.controller?.supportsNativeControls?.();
864
+ const supportsNativeControls =
865
+ !!this.props.controller?.supportsNativeControls?.();
829
866
 
830
867
  const controls = isAppleTV()
831
- ? supportsNativeControls && isInlineTV && !this.getPlayNextData()
868
+ ? supportsNativeControls && !isInlineTV && !this.getPlayNextData()
832
869
  : supportsNativeControls && !this.getPlayNextData();
833
870
 
871
+ const shouldUseNativeControls =
872
+ controls &&
873
+ !startComponentsAnimation &&
874
+ !docked &&
875
+ !castAction?.state?.connected;
876
+
834
877
  platformSpecificProps = {
835
878
  ...platformSpecificProps,
836
- controls
879
+ controls: shouldUseNativeControls,
837
880
  };
838
881
 
839
- console.log("Anton Player render2 ", {
840
- platformSpecificProps,
841
- isNotInlineTv: !isInlineTV,
842
- hasNoPlayNextData: !this.getPlayNextData()
843
- });
844
-
845
882
  const pictureInPictureEnabled =
846
883
  this.props.pluginConfiguration?.pictureInPictureEnabled;
847
884
 
@@ -857,6 +894,7 @@ export default class VideoPlayer extends React.Component<
857
894
  nowPlayingEnabled,
858
895
  paused,
859
896
  seek,
897
+ rate,
860
898
  textTrackId,
861
899
  liveSeekingEnabled,
862
900
  liveCatchUpEnabled,
@@ -902,22 +940,17 @@ export default class VideoPlayer extends React.Component<
902
940
  onVideoEnd: this.onVideoEnd, // complete
903
941
  onVideoError: this.onVideoError, // error
904
942
  onVideoProgress: this.onVideoProgress,
905
- onVideoFullscreenPlayerDidDismiss: this.unHandledEvent(
906
- "onVideoFullscreenPlayerDidPresent"
907
- ),
908
- onVideoFullscreenPlayerDidPresent: this.unHandledEvent(
909
- "onVideoFullscreenPlayerDidPresent"
910
- ),
911
- onVideoFullscreenPlayerWillDismiss: this.unHandledEvent(
912
- "onVideoFullscreenPlayerWillDismiss"
913
- ),
914
- onVideoFullscreenPlayerWillPresent: this.unHandledEvent(
915
- "onVideoFullscreenPlayerWillPresent"
916
- ),
943
+ onVideoFullscreenPlayerDidDismiss: this.onVideoFullscreenPlayerDidDismiss,
944
+ onVideoFullscreenPlayerDidPresent: this.onVideoFullscreenPlayerDidPresent,
945
+ onVideoFullscreenPlayerWillDismiss:
946
+ this.onVideoFullscreenPlayerWillDismiss,
947
+ onVideoFullscreenPlayerWillPresent:
948
+ this.onVideoFullscreenPlayerWillPresent,
917
949
  onVideoLoad: this.onVideoLoad,
918
950
  onVideoLoadStart: this.unHandledEvent("onVideoLoadStart"),
919
951
  onVideoBuffer: this.onVideoBuffer,
920
952
  onPlaybackStalled: this.onPlaybackStalled,
953
+ onPlayerClose: this.onPlayerClose,
921
954
  onPlayerAttached: this.onPlayerAttached,
922
955
  onPlayerDetached: this.onPlayerDetached,
923
956
  };
@@ -976,8 +1009,6 @@ export default class VideoPlayer extends React.Component<
976
1009
  ? styles.playerContainerTransparent
977
1010
  : styles.playerContainerBlack;
978
1011
 
979
- console.log("Anton Player render", {screenData, props: this.props, nativeProps});
980
-
981
1012
  const isInline = () => {
982
1013
  if (isTV()) {
983
1014
  return inline;
@@ -993,7 +1024,7 @@ export default class VideoPlayer extends React.Component<
993
1024
  !needToShowPlayNextOverlay &&
994
1025
  this.props.mode !== "PIP";
995
1026
 
996
- if (controls === true) {
1027
+ if (shouldUseNativeControls) {
997
1028
  return null;
998
1029
  }
999
1030
 
@@ -1012,6 +1043,7 @@ export default class VideoPlayer extends React.Component<
1012
1043
  extraInfoText={castAction?.state?.friendlyStatus}
1013
1044
  controlsAlwaysVisible={castAction?.state?.connected}
1014
1045
  playNextData={this.getPlayNextData()}
1046
+ nativeControls={!!controls}
1015
1047
  />
1016
1048
  ) : null;
1017
1049
  };
@@ -1046,29 +1078,14 @@ export default class VideoPlayer extends React.Component<
1046
1078
  const renderMobilePlayer = () => {
1047
1079
  return isFullScreenAudioPlayer && isAudioItem ? (
1048
1080
  <View style={containerStyle}>
1049
- {!castAction?.state?.connected && (
1081
+ {(!castAction?.state?.connected || supportNativeCast) && (
1050
1082
  <this.props.PlayerComponent
1051
1083
  ref={this._assignRoot}
1052
1084
  {...nativeEvents}
1053
1085
  {...nativeProps}
1054
1086
  />
1055
1087
  )}
1056
- <AudioPlayerWrapper {...sharedWrapperViewProps}>
1057
- <View>
1058
- {
1059
- <PlayNextOverlay
1060
- item={entry}
1061
- playerIsDocked={docked}
1062
- pluginConfiguration={this.getPluginConfiguration()}
1063
- playerId={this.props.playerId}
1064
- playNextData={this.getPlayNextData()}
1065
- setNextVideoPreloadThresholdPercentage={
1066
- this.props.setNextVideoPreloadThresholdPercentage
1067
- }
1068
- />
1069
- }
1070
- </View>
1071
- </AudioPlayerWrapper>
1088
+ <AudioPlayerWrapper {...sharedWrapperViewProps} />
1072
1089
  </View>
1073
1090
  ) : (
1074
1091
  <PlayerWrapper {...sharedWrapperViewProps}>
@@ -1083,11 +1100,24 @@ export default class VideoPlayer extends React.Component<
1083
1100
  <View style={styles.container}>
1084
1101
  <View style={[playerContainerStyles, playerDimensions]}>
1085
1102
  {isAudioItem && (
1086
- <AudioPlayer
1087
- style={playerDimensions}
1088
- audio_item={entry}
1089
- plugin_configuration={this.getPluginConfiguration()}
1090
- />
1103
+ <AnimationComponent
1104
+ animationType={ComponentAnimationType.player}
1105
+ additionalData={{
1106
+ ...playerDimensions,
1107
+ inlineAudioPlayer: true,
1108
+ }}
1109
+ style={getStyle(playerDimensions)}
1110
+ >
1111
+ <AudioPlayer
1112
+ style={
1113
+ isTV()
1114
+ ? getStyle(playerDimensions)
1115
+ : styles.playerSize
1116
+ }
1117
+ audio_item={entry}
1118
+ plugin_configuration={this.getPluginConfiguration()}
1119
+ />
1120
+ </AnimationComponent>
1091
1121
  )}
1092
1122
 
1093
1123
  {shouldRenderBackground && (
@@ -1099,18 +1129,28 @@ export default class VideoPlayer extends React.Component<
1099
1129
  />
1100
1130
  )}
1101
1131
 
1102
- {!castAction?.state?.connected && (
1103
- <this.props.PlayerComponent
1104
- ref={this._assignRoot}
1105
- {...nativeEvents}
1106
- {...nativeProps}
1107
- listener={this.props.listener}
1132
+ {(!castAction?.state?.connected || supportNativeCast) && (
1133
+ <AnimationComponent
1134
+ animationType={ComponentAnimationType.player}
1135
+ additionalData={playerDimensions}
1108
1136
  style={getStyle(playerDimensions)}
1109
- pluginConfiguration={this.getPluginConfiguration()}
1110
- controller={this.props.controller}
1111
1137
  >
1112
- {this.childrenWithPlayNext()}
1113
- </this.props.PlayerComponent>
1138
+ <this.props.PlayerComponent
1139
+ ref={this._assignRoot}
1140
+ {...nativeEvents}
1141
+ {...nativeProps}
1142
+ listener={this.props.listener}
1143
+ style={
1144
+ isTV()
1145
+ ? getStyle(playerDimensions)
1146
+ : styles.playerSize
1147
+ }
1148
+ pluginConfiguration={this.getPluginConfiguration()}
1149
+ controller={this.props.controller}
1150
+ >
1151
+ {this.childrenWithPlayNext()}
1152
+ </this.props.PlayerComponent>
1153
+ </AnimationComponent>
1114
1154
  )}
1115
1155
  </View>
1116
1156