@applicaster/quick-brick-player 14.0.0-rc.8 → 15.0.0-rc.1

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.
Files changed (27) hide show
  1. package/package.json +6 -11
  2. package/src/Player/AudioLayer/AudioPlayerWrapper.tsx +25 -81
  3. package/src/Player/AudioLayer/Layout/Controls/index.tsx +8 -18
  4. package/src/Player/AudioLayer/Layout/DockedControls/index.tsx +119 -119
  5. package/src/Player/AudioLayer/Layout/MobileLayout.tsx +5 -38
  6. package/src/Player/AudioLayer/Layout/PlayerImage/AnimatedImage.tsx +3 -8
  7. package/src/Player/AudioLayer/Layout/PlayerImage/FlexImage.tsx +5 -9
  8. package/src/Player/AudioLayer/Layout/PlayerImage/index.tsx +22 -72
  9. package/src/Player/AudioLayer/Layout/TabletLandscapeLayout.tsx +1 -58
  10. package/src/Player/AudioLayer/Layout/TabletPortraitLayout.tsx +0 -33
  11. package/src/Player/AudioLayer/Layout/TransportInfo/index.tsx +6 -18
  12. package/src/Player/AudioLayer/components/SleepTimerModalHeader/SleepTimerModalHeader.tsx +1 -1
  13. package/src/Player/PlayerModal/GestureAnimatedScrollView.ts +7 -0
  14. package/src/Player/PlayerModal/PlayerModal.tsx +109 -0
  15. package/src/Player/PlayerModal/VideoPlayerModal.tsx +251 -0
  16. package/src/Player/PlayerModal/consts/index.ts +34 -0
  17. package/src/Player/PlayerModal/hooks/index.ts +193 -0
  18. package/src/Player/PlayerModal/index.ts +3 -0
  19. package/src/Player/PlayerModal/index.web.ts +5 -0
  20. package/src/Player/PlayerModal/styles.ts +104 -0
  21. package/src/Player/PlayerView/GenericTVPlayerView.tsx +42 -0
  22. package/src/Player/PlayerView/TVPlayerView.tsx +26 -0
  23. package/src/Player/PlayerView/TvOSPlayerView.tsx +51 -0
  24. package/src/Player/PlayerView/types.ts +42 -0
  25. package/src/Player/index.tsx +181 -188
  26. package/src/QuickBrickPlayer.tsx +16 -10
  27. /package/src/Player/AudioLayer/Layout/{Debug → DebugComponent}/index.tsx +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@applicaster/quick-brick-player",
3
- "version": "14.0.0-rc.8",
3
+ "version": "15.0.0-rc.1",
4
4
  "description": "Quick Brick Player",
5
5
  "main": "./src/index.ts",
6
6
  "types": "index.d.ts",
@@ -35,13 +35,12 @@
35
35
  },
36
36
  "homepage": "https://github.com/applicaster/quickbrick#readme",
37
37
  "dependencies": {
38
- "@applicaster/quick-brick-mobile-transport-controls": "13.0.0-rc.124",
39
- "@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.7",
40
- "@applicaster/zapp-react-native-tvos-app": "14.0.0-rc.8",
41
- "@applicaster/zapp-react-native-ui-components": "14.0.0-rc.8",
42
- "@applicaster/zapp-react-native-utils": "14.0.0-rc.8",
38
+ "@applicaster/quick-brick-mobile-transport-controls": "14.0.0-rc.56",
39
+ "@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.60",
40
+ "@applicaster/zapp-react-native-tvos-app": "15.0.0-rc.1",
41
+ "@applicaster/zapp-react-native-ui-components": "15.0.0-rc.1",
42
+ "@applicaster/zapp-react-native-utils": "15.0.0-rc.1",
43
43
  "query-string": "7.1.3",
44
- "react-native-web-linear-gradient": "1.1.2",
45
44
  "shaka-player": "4.3.5",
46
45
  "typeface-montserrat": "^0.0.54",
47
46
  "video.js": "7.14.3",
@@ -58,15 +57,11 @@
58
57
  "@applicaster/zapp-react-native-tvos-ui-components": "*",
59
58
  "@babel/runtime": "*",
60
59
  "@react-native-community/netinfo": "*",
61
- "immer": "*",
62
60
  "react": "*",
63
61
  "react-native": "*",
64
62
  "react-native-fs": "*",
65
- "react-native-gesture-handler": "*",
66
63
  "react-native-linear-gradient": "*",
67
- "react-native-safe-area-context": "*",
68
64
  "react-native-svg": "*",
69
- "react-native-web": "*",
70
65
  "react-native-webview": "*",
71
66
  "uglify-js": "*",
72
67
  "validate-color": "*",
@@ -1,11 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { useEffect, useState } from "react";
3
- import {
4
- Dimensions as ScreenDimensions,
5
- StyleSheet,
6
- View,
7
- ViewStyle,
8
- } from "react-native";
3
+ import { StyleSheet, View, ViewStyle } from "react-native";
9
4
 
10
5
  import { Edge, SafeAreaView } from "react-native-safe-area-context";
11
6
  import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
@@ -13,14 +8,9 @@ import { usePlayer } from "@applicaster/zapp-react-native-utils/appUtils/playerM
13
8
  import * as R from "ramda";
14
9
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
15
10
  import Layout from "./Layout";
16
- import {
17
- useIsTablet,
18
- useNavigation,
19
- } from "@applicaster/zapp-react-native-utils/reactHooks";
11
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
20
12
  import { createLogger } from "@applicaster/zapp-react-native-utils/logger";
21
13
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
22
- import { PlayerDetails } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/PlayerDetails";
23
- import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
24
14
  import { formatSpeed } from "./utils";
25
15
  import {
26
16
  getBottomSheetModalDefaultItemIcon,
@@ -30,12 +20,7 @@ import {
30
20
  getBottomSheetModalSelectedItemIcon,
31
21
  } from "../Utils";
32
22
  import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
33
- 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,5 +1,5 @@
1
1
  import * as React from "react";
2
- import { StyleSheet } from "react-native";
2
+ import { StyleSheet, View } from "react-native";
3
3
 
4
4
  import { dayjs } from "@applicaster/zapp-react-native-utils/dateUtils";
5
5
  import {
@@ -12,11 +12,6 @@ import {
12
12
  } from "@applicaster/quick-brick-mobile-transport-controls";
13
13
  import { playerManager } from "@applicaster/zapp-react-native-utils/appUtils";
14
14
 
15
- import {
16
- AnimationComponent,
17
- ComponentAnimationType,
18
- } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
19
-
20
15
  import { AudioDescription } from "../../AudioDescription";
21
16
  import { isValidDate } from "../../../Utils";
22
17
  import { VerticalGutter } from "./VerticalGutter";
@@ -103,8 +98,6 @@ export const Controls = (props: Props) => {
103
98
  onSkipLive,
104
99
  onSpeedButtonPress,
105
100
  maxWidth = 320,
106
-
107
- docked,
108
101
  } = props;
109
102
 
110
103
  const configuration = useZStore("playerConfiguration");
@@ -229,15 +222,8 @@ export const Controls = (props: Props) => {
229
222
  isLiveShowFullControls,
230
223
  ]);
231
224
 
232
- if (docked) {
233
- return null;
234
- }
235
-
236
225
  return (
237
- <AnimationComponent
238
- animationType={ComponentAnimationType.componentFade}
239
- style={isTablet ? styles.nonFlex : styles.flex}
240
- >
226
+ <View style={isTablet ? styles.nonFlex : styles.flex}>
241
227
  <VerticalGutter />
242
228
 
243
229
  <AudioDescription
@@ -257,7 +243,11 @@ export const Controls = (props: Props) => {
257
243
  content={entry}
258
244
  value={value}
259
245
  visible
260
- layoutState={layoutState}
246
+ layoutState={{
247
+ ...layoutState,
248
+ docked: false, // always use non-docked layout for audio (to show time labels
249
+ inline: true, // always use inline layout for audio (to show time labels)
250
+ }}
261
251
  onPlayerSeek={onPlayerSeek}
262
252
  playerState={playerState}
263
253
  disableFullscreen
@@ -286,6 +276,6 @@ export const Controls = (props: Props) => {
286
276
  }}
287
277
  playerState={playerState}
288
278
  />
289
- </AnimationComponent>
279
+ </View>
290
280
  );
291
281
  };
@@ -1,12 +1,11 @@
1
1
  import * as React from "react";
2
- import {
3
- StyleSheet,
4
- TouchableWithoutFeedback,
5
- View,
6
- ViewStyle,
7
- } from "react-native";
2
+ import { StyleSheet, View, ViewStyle } from "react-native";
8
3
  import * as R from "ramda";
9
- import { 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,17 @@ import {
17
16
 
18
17
  import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
19
18
 
20
- import {
21
- AnimationComponent,
22
- ComponentAnimationType,
23
- PlayerAnimationStateEnum,
24
- useModalAnimationContext,
25
- } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
26
19
  import { toNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
27
20
  import { useSafeAreaInsets } from "react-native-safe-area-context";
21
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
28
22
  import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/getTabBarHeight";
23
+ import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
24
+ import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
25
+ import { useConfiguration } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/utils";
26
+ import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
27
+ import { PROGRESS_BAR_HEIGHT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/utils";
28
+ import { isMenuVisible } from "@applicaster/zapp-react-native-ui-components/Components/Screen/navigationHandler";
29
+ import { usePlugins } from "@applicaster/zapp-react-native-redux";
29
30
 
30
31
  const bottomTabBarHeight = getTabBarHeight();
31
32
 
@@ -34,13 +35,15 @@ type Props = {
34
35
  layoutState: QuickBrickPlayer.LayoutState;
35
36
  playerState: QuickBrickPlayer.PlayerState;
36
37
  value: GetValue;
37
- dimensions: QuickBrickPlayer.AudioPlayerProps["dimensions"];
38
38
  onCloseVideoModal: () => void;
39
39
  onPlayerSeek: (targetTime: number) => void;
40
40
  playNextData: PlayNextData;
41
41
  title: string | number;
42
42
  summary: string | number;
43
43
  ImageComponent?: React.ReactNode;
44
+ isActiveGesture?: boolean;
45
+ minimisedHeight: number;
46
+ aspectRatio?: number;
44
47
  };
45
48
 
46
49
  const styles = StyleSheet.create({
@@ -48,6 +51,7 @@ const styles = StyleSheet.create({
48
51
  flex: 1,
49
52
  flexDirection: "column",
50
53
  alignItems: "stretch",
54
+ marginTop: PROGRESS_BAR_HEIGHT,
51
55
  },
52
56
  content: {
53
57
  flex: 1,
@@ -99,26 +103,6 @@ const playerDimensionsStyle = (
99
103
  width: addPadding ? toNumberWithDefault(100, minimisedHeight) : 0,
100
104
  });
101
105
 
102
- const animatedContainerStyle = (
103
- docked: boolean,
104
- progressBarHeight: number
105
- ): ViewStyle => ({
106
- top: progressBarHeight,
107
- position: "absolute",
108
- width: "100%",
109
- zIndex: docked ? 1 : -1,
110
- });
111
-
112
- const backgroundImageStyle = (
113
- dimensions: QuickBrickPlayer.AudioPlayerProps["dimensions"],
114
- minimisedHeight: number,
115
- isActiveGesture: boolean
116
- ): ViewStyle => ({
117
- height: isActiveGesture ? minimisedHeight : dimensions.height,
118
- aspectRatio: 1,
119
- position: "absolute",
120
- });
121
-
122
106
  const controlButtons = (
123
107
  live: boolean,
124
108
  paused: boolean,
@@ -180,82 +164,97 @@ export const DockedControls = (props: Props) => {
180
164
  const {
181
165
  entry,
182
166
  layoutState,
183
- playerState,
184
- value,
185
- dimensions,
186
- onCloseVideoModal,
187
- onPlayerSeek,
167
+ onPlayerSeek = noop,
188
168
  playNextData,
189
- title,
190
- summary,
191
169
  ImageComponent,
170
+ isActiveGesture = true,
171
+ aspectRatio,
192
172
  } = props;
193
173
 
194
- const isTablet = useIsTablet();
174
+ const onCloseVideoModal = React.useCallback(() => {
175
+ playerManager.close();
176
+ }, []);
195
177
 
196
- const liveButton = Boolean(value("live_badge_enabled"));
178
+ const { currentRoute, screenData } = useNavigation();
197
179
 
198
- const {
199
- isActiveGesture,
200
- setPlayerAnimationState,
201
- startComponentsAnimation,
202
- minimisedHeight,
203
- progressBarHeight,
204
- } = useModalAnimationContext();
180
+ const plugins = usePlugins();
181
+ const menuVisible = isMenuVisible(currentRoute, screenData, plugins);
182
+
183
+ const { minimised_height: minimisedHeight } = useConfiguration();
205
184
 
206
- const maximazeVideoModal = React.useCallback(
207
- () => setPlayerAnimationState(PlayerAnimationStateEnum.maximize),
185
+ const configuration = useZStore("playerConfiguration")();
186
+ const playerState = usePlayerState("shared-player-wrapper-docked");
187
+
188
+ const getValue = React.useCallback(
189
+ (key: string, stylesObj: {}) => R.propOr(null, key, stylesObj),
208
190
  []
209
191
  );
210
192
 
193
+ const value = React.useCallback(
194
+ (key: string) => {
195
+ const retVal = getValue(key, configuration);
196
+
197
+ const minimumAllowedSeekableDurationInSeconds = getValue(
198
+ "minimumAllowedSeekableDurationInSeconds",
199
+ configuration
200
+ );
201
+
202
+ if (key === "liveSeekingEnabled") {
203
+ return playerState.seekableDuration <
204
+ minimumAllowedSeekableDurationInSeconds || playerManager.isCasting()
205
+ ? false
206
+ : retVal;
207
+ }
208
+
209
+ return retVal;
210
+ },
211
+ [...Object.values(configuration), playerState.seekableDuration, getValue]
212
+ );
213
+
214
+ const { title, summary } = useTitleSummaryOverlay(
215
+ entry,
216
+ playerState?.isLive,
217
+ configuration?.audio_live_player_update_interval
218
+ );
219
+
220
+ const isTablet = useIsTablet();
221
+
222
+ const liveButton = Boolean(value("live_badge_enabled"));
223
+
211
224
  const dockedBackgroundColor = value("docked_player_background_color");
212
225
 
213
226
  const insets = useSafeAreaInsets();
214
227
 
215
- if (!layoutState.docked && !startComponentsAnimation) return null;
216
-
217
228
  return (
218
- <AnimationComponent
219
- animationType={ComponentAnimationType.componentAppears}
220
- style={[
221
- styles.container,
222
- animatedContainerStyle(
223
- isActiveGesture || layoutState.docked,
224
- progressBarHeight
225
- ),
226
- {
227
- height: minimisedHeight + bottomTabBarHeight + insets.bottom,
228
- },
229
- ]}
230
- >
231
- {!playerState.isLive &&
232
- (layoutState.docked || startComponentsAnimation) ? (
233
- <ProgressBar
234
- name={"audio-docked-layout"}
235
- content={entry}
236
- value={value}
237
- visible
238
- layoutState={layoutState}
239
- onPlayerSeek={onPlayerSeek}
240
- playerState={playerState}
241
- startComponentsAnimation={startComponentsAnimation}
242
- docked
243
- />
244
- ) : null}
229
+ <>
230
+ <View
231
+ style={[
232
+ styles.container,
233
+ {
234
+ height: minimisedHeight,
235
+ maxHeight: minimisedHeight,
236
+ },
237
+ ]}
238
+ >
239
+ {!playerState.isLive ? (
240
+ <ProgressBar
241
+ name={"shared-docked-layout"}
242
+ content={entry}
243
+ value={value}
244
+ visible
245
+ layoutState={layoutState}
246
+ onPlayerSeek={onPlayerSeek}
247
+ playerState={playerState}
248
+ startComponentsAnimation={noop}
249
+ docked
250
+ />
251
+ ) : null}
245
252
 
246
- <View style={styles.content}>
247
- <View
248
- style={backgroundImageStyle(
249
- dimensions,
250
- minimisedHeight,
251
- isActiveGesture
252
- )}
253
- />
254
- <TouchableWithoutFeedback onPress={maximazeVideoModal}>
253
+ <View style={styles.content}>
255
254
  <View style={styles.touchableArea}>
256
255
  {isActiveGesture || layoutState.docked ? (
257
256
  <View
258
- style={{ width: toNumberWithDefault(100, minimisedHeight) }}
257
+ style={{ aspectRatio: aspectRatio, height: minimisedHeight }}
259
258
  >
260
259
  {ImageComponent || null}
261
260
  </View>
@@ -268,6 +267,7 @@ export const DockedControls = (props: Props) => {
268
267
  />
269
268
  )}
270
269
  <View
270
+ testID="content-info"
271
271
  style={[
272
272
  styles.contentInfo,
273
273
  { backgroundColor: dockedBackgroundColor },
@@ -280,40 +280,40 @@ export const DockedControls = (props: Props) => {
280
280
  />
281
281
  </View>
282
282
  </View>
283
- </TouchableWithoutFeedback>
284
- <View
285
- style={[
286
- isTablet
287
- ? styles.controlsContainerForTablet
288
- : styles.controlsContainerForMobile,
289
- { backgroundColor: dockedBackgroundColor },
290
- ]}
291
- >
292
- <Controls
293
- value={value}
294
- visible
295
- buttons={R.partial(controlButtons, [
296
- playerState.isLive && liveButton,
297
- ])}
298
- style={styles.playPauseButton}
299
- playNextData={playNextData}
300
- playerState={playerState}
301
- />
302
- <Button
303
- icon={"close_mini"}
304
- size={"medium"}
305
- value={value}
306
- onPress={onCloseVideoModal}
307
- style={styles.buttons}
308
- />
283
+ <View
284
+ style={[
285
+ isTablet
286
+ ? styles.controlsContainerForTablet
287
+ : styles.controlsContainerForMobile,
288
+ { backgroundColor: dockedBackgroundColor },
289
+ ]}
290
+ >
291
+ <Controls
292
+ value={value}
293
+ visible
294
+ buttons={R.partial(controlButtons, [
295
+ playerState.isLive && liveButton,
296
+ ])}
297
+ style={styles.playPauseButton}
298
+ playNextData={playNextData}
299
+ playerState={playerState}
300
+ />
301
+ <Button
302
+ icon={"close_mini"}
303
+ size={"medium"}
304
+ value={value}
305
+ onPress={onCloseVideoModal}
306
+ style={styles.buttons}
307
+ />
308
+ </View>
309
309
  </View>
310
310
  </View>
311
311
  <View
312
312
  style={{
313
- height: insets.bottom + bottomTabBarHeight,
313
+ height: insets.bottom + (menuVisible ? bottomTabBarHeight : 0),
314
314
  backgroundColor: dockedBackgroundColor,
315
315
  }}
316
316
  />
317
- </AnimationComponent>
317
+ </>
318
318
  );
319
319
  };