@applicaster/quick-brick-player 14.0.0-alpha.2175196485 → 14.0.0-alpha.2292190333

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.2175196485",
3
+ "version": "14.0.0-alpha.2292190333",
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": "14.0.0-alpha.2175196485",
39
- "@applicaster/quick-brick-tv-transport-controls": "14.0.0-alpha.2175196485",
40
- "@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.2175196485",
41
- "@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.2175196485",
42
- "@applicaster/zapp-react-native-utils": "14.0.0-alpha.2175196485",
38
+ "@applicaster/quick-brick-mobile-transport-controls": "14.0.0-rc.48",
39
+ "@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.48",
40
+ "@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.2292190333",
41
+ "@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.2292190333",
42
+ "@applicaster/zapp-react-native-utils": "14.0.0-alpha.2292190333",
43
43
  "query-string": "7.1.3",
44
44
  "shaka-player": "4.3.5",
45
45
  "typeface-montserrat": "^0.0.54",
@@ -57,7 +57,6 @@
57
57
  "@applicaster/zapp-react-native-tvos-ui-components": "*",
58
58
  "@babel/runtime": "*",
59
59
  "@react-native-community/netinfo": "*",
60
- "immer": "*",
61
60
  "react": "*",
62
61
  "react-native": "*",
63
62
  "react-native-fs": "*",
@@ -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
  };
@@ -18,12 +18,14 @@ import { PlayNextData } from "@applicaster/zapp-react-native-ui-components/Compo
18
18
 
19
19
  import { toNumberWithDefault } from "@applicaster/zapp-react-native-utils/numberUtils";
20
20
  import { useSafeAreaInsets } from "react-native-safe-area-context";
21
+ import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
21
22
  import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/getTabBarHeight";
22
23
  import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
23
24
  import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
24
25
  import { useConfiguration } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/utils";
25
26
  import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
26
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";
27
29
 
28
30
  const bottomTabBarHeight = getTabBarHeight();
29
31
 
@@ -172,6 +174,10 @@ export const DockedControls = (props: Props) => {
172
174
  playerManager.close();
173
175
  }, []);
174
176
 
177
+ const { currentRoute, screenData } = useNavigation();
178
+
179
+ const menuVisible = isMenuVisible(currentRoute, screenData);
180
+
175
181
  const { minimised_height: minimisedHeight } = useConfiguration();
176
182
 
177
183
  const configuration = useZStore("playerConfiguration")();
@@ -220,7 +226,10 @@ export const DockedControls = (props: Props) => {
220
226
  style={[
221
227
  styles.container,
222
228
  {
223
- height: minimisedHeight + bottomTabBarHeight + insets.bottom,
229
+ height:
230
+ minimisedHeight +
231
+ (menuVisible ? bottomTabBarHeight : 0) +
232
+ insets.bottom,
224
233
  },
225
234
  ]}
226
235
  >
@@ -295,7 +304,7 @@ export const DockedControls = (props: Props) => {
295
304
  </View>
296
305
  <View
297
306
  style={{
298
- height: insets.bottom + bottomTabBarHeight,
307
+ height: insets.bottom + (menuVisible ? bottomTabBarHeight : 0),
299
308
  backgroundColor: dockedBackgroundColor,
300
309
  }}
301
310
  />
@@ -32,14 +32,15 @@ const directionStyles = (isLandscape: boolean): ViewStyle => {
32
32
  type AnimatedModalProps = {
33
33
  enabled?: boolean;
34
34
  pip?: boolean;
35
+ fullscreen?: boolean;
35
36
  content?: (
36
- opacity: Animated.Value | Animated.AnimatedInterpolation
37
+ opacity: Animated.Value | Animated.AnimatedInterpolation<number>
37
38
  ) => ReactElement;
38
39
  collapsedContent?: (
39
- opacity: Animated.Value | Animated.AnimatedInterpolation
40
+ opacity: Animated.Value | Animated.AnimatedInterpolation<number>
40
41
  ) => ReactElement;
41
42
  extraContent?: (
42
- opacity: Animated.Value | Animated.AnimatedInterpolation
43
+ opacity: Animated.Value | Animated.AnimatedInterpolation<number>
43
44
  ) => ReactElement;
44
45
  aspectRatio?: number;
45
46
  isTabletPortrait?: boolean;
@@ -61,6 +62,7 @@ export function VideoPlayerModal({
61
62
  isTabletPortrait,
62
63
  style,
63
64
  pip = false,
65
+ fullscreen = false,
64
66
  }: AnimatedModalProps) {
65
67
  const isTablet = useIsTablet();
66
68
 
@@ -91,65 +93,78 @@ export function VideoPlayerModal({
91
93
 
92
94
  const insets = useSafeAreaInsets();
93
95
 
96
+ const isFullScreenOrPIP = fullscreen || pip;
97
+
94
98
  // Interpolated opacities for smooth cross-fade
95
- const collapsedOpacity = translateY.interpolate({
96
- inputRange: [MODAL_COLLAPSE_START, height - collapsedHeight],
97
- outputRange: [0, 1],
98
- extrapolate: "clamp",
99
- });
100
-
101
- const expandedOpacity = translateY.interpolate({
102
- inputRange: [0, height - collapsedHeight],
103
- outputRange: [1, 0],
104
- extrapolate: "clamp",
105
- });
106
-
107
- const xPosition = translateY.interpolate({
108
- inputRange: [height * VIDEO_TRANSITION_THRESHOLD, height - collapsedHeight],
109
- outputRange: [0, -(width - width * SCALE_FACTOR) / 2],
110
- extrapolate: "clamp",
111
- });
99
+ const collapsedOpacity = !isFullScreenOrPIP
100
+ ? translateY.interpolate({
101
+ inputRange: [MODAL_COLLAPSE_START, height - collapsedHeight],
102
+ outputRange: [0, 1],
103
+ extrapolate: "clamp",
104
+ })
105
+ : new Animated.Value(0);
106
+
107
+ const expandedOpacity = !isFullScreenOrPIP
108
+ ? translateY.interpolate({
109
+ inputRange: [0, height - collapsedHeight],
110
+ outputRange: [1, 0],
111
+ extrapolate: "clamp",
112
+ })
113
+ : new Animated.Value(1);
114
+
115
+ const xPosition = !isFullScreenOrPIP
116
+ ? translateY.interpolate({
117
+ inputRange: [
118
+ height * VIDEO_TRANSITION_THRESHOLD,
119
+ height - collapsedHeight,
120
+ ],
121
+ outputRange: [0, -(width - width * SCALE_FACTOR) / 2],
122
+ extrapolate: "clamp",
123
+ })
124
+ : new Animated.Value(0);
112
125
 
113
126
  const vidHeight = width / aspectRatio;
114
127
 
115
- const yPosition = translateY.interpolate({
116
- inputRange: [height * VIDEO_TRANSITION_THRESHOLD, height - collapsedHeight],
117
- outputRange: [
118
- 0,
119
- isTablet && isTabletLandscape
120
- ? -(
121
- (-PROGRESS_BAR_HEIGHT + SCREEN_HEIGHT - vidHeight * SCALE_FACTOR) /
122
- 2
123
- )
124
- : -(
125
- PROGRESS_BAR_HEIGHT +
126
- insets.top / 2 +
127
- (SCREEN_WIDTH / aspectRatio -
128
- (SCREEN_WIDTH / aspectRatio) * SCALE_FACTOR) /
129
- 2
130
- ),
131
- ],
132
- extrapolate: "clamp",
133
- });
134
-
135
- const scalePosition = translateY.interpolate({
136
- inputRange: [
137
- SCREEN_HEIGHT * VIDEO_TRANSITION_THRESHOLD,
138
- SCREEN_HEIGHT - collapsedHeight,
139
- ],
140
- outputRange: [1, SCALE_FACTOR],
141
- extrapolate: "clamp",
142
- });
143
-
144
- const borderTopRadiusAnimated = translateY.interpolate({
145
- inputRange: [0, SCREEN_HEIGHT - collapsedHeight],
146
- outputRange: [MODAL_RADIUS, 0],
147
- extrapolate: "clamp",
148
- });
149
-
150
- if (pip) {
151
- return content(new Animated.Value(1));
152
- }
128
+ const yPosition = !isFullScreenOrPIP
129
+ ? translateY.interpolate({
130
+ inputRange: [
131
+ height * VIDEO_TRANSITION_THRESHOLD,
132
+ height - collapsedHeight,
133
+ ],
134
+ outputRange: [
135
+ 0,
136
+ isTablet && isTabletLandscape
137
+ ? -((-PROGRESS_BAR_HEIGHT + height - vidHeight * SCALE_FACTOR) / 2)
138
+ : -(
139
+ PROGRESS_BAR_HEIGHT +
140
+ insets.top / 2 +
141
+ (SCREEN_WIDTH / aspectRatio -
142
+ (SCREEN_WIDTH / aspectRatio) * SCALE_FACTOR) /
143
+ 2
144
+ ),
145
+ ],
146
+ extrapolate: "clamp",
147
+ })
148
+ : new Animated.Value(0);
149
+
150
+ const scalePosition = !isFullScreenOrPIP
151
+ ? translateY.interpolate({
152
+ inputRange: [
153
+ height * VIDEO_TRANSITION_THRESHOLD,
154
+ height - collapsedHeight,
155
+ ],
156
+ outputRange: [1, SCALE_FACTOR],
157
+ extrapolate: "clamp",
158
+ })
159
+ : new Animated.Value(1);
160
+
161
+ const borderTopRadiusAnimated = !isFullScreenOrPIP
162
+ ? translateY.interpolate({
163
+ inputRange: [0, height - collapsedHeight],
164
+ outputRange: [MODAL_RADIUS, 0],
165
+ extrapolate: "clamp",
166
+ })
167
+ : new Animated.Value(0);
153
168
 
154
169
  return (
155
170
  <PanGestureHandler
@@ -164,8 +179,8 @@ export function VideoPlayerModal({
164
179
  {
165
180
  borderTopLeftRadius: borderTopRadiusAnimated,
166
181
  borderTopRightRadius: borderTopRadiusAnimated,
167
- transform: [{ translateY }],
168
- height: SCREEN_HEIGHT,
182
+ transform: [{ translateY: isFullScreenOrPIP ? 0 : translateY }],
183
+ height: height,
169
184
  },
170
185
  ]}
171
186
  >
@@ -177,7 +192,7 @@ export function VideoPlayerModal({
177
192
  {
178
193
  borderTopLeftRadius: borderTopRadiusAnimated,
179
194
  borderTopRightRadius: borderTopRadiusAnimated,
180
- height: SCREEN_HEIGHT,
195
+ height: height,
181
196
  },
182
197
  ]}
183
198
  >
@@ -215,21 +230,23 @@ export function VideoPlayerModal({
215
230
  ) : null}
216
231
  </Animated.View>
217
232
 
218
- <Animated.View
219
- pointerEvents={collapsed ? "box-none" : "none"}
220
- style={[
221
- styles.collapsedBarContainer,
222
- { opacity: collapsedOpacity },
223
- ]}
224
- >
225
- <Pressable
226
- testID="collapsedBarWrapper"
227
- onPress={expand}
228
- style={styles.collapsedBarWrapper}
233
+ {!isFullScreenOrPIP ? (
234
+ <Animated.View
235
+ pointerEvents={collapsed ? "box-none" : "none"}
236
+ style={[
237
+ styles.collapsedBarContainer,
238
+ { opacity: collapsedOpacity },
239
+ ]}
229
240
  >
230
- {collapsedContent}
231
- </Pressable>
232
- </Animated.View>
241
+ <Pressable
242
+ testID="collapsedBarWrapper"
243
+ onPress={expand}
244
+ style={styles.collapsedBarWrapper}
245
+ >
246
+ {collapsedContent}
247
+ </Pressable>
248
+ </Animated.View>
249
+ ) : null}
233
250
  </Animated.View>
234
251
  </Animated.View>
235
252
  </PanGestureHandler>
@@ -1,17 +1,19 @@
1
+ import { useCallback, useEffect, useMemo, useRef } from "react";
2
+ import { useSafeAreaInsets } from "react-native-safe-area-context";
3
+ import { State } from "react-native-gesture-handler";
4
+ import { Animated } from "react-native";
5
+
1
6
  import { VideoModalMode } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainer";
2
7
  import { useConfiguration } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/utils";
3
8
  import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/getTabBarHeight";
4
9
  import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks/navigation/useNavigation";
5
- import { useCallback, useEffect, useMemo, useRef } from "react";
6
- import { useSafeAreaInsets } from "react-native-safe-area-context";
10
+ import { isMenuVisible } from "@applicaster/zapp-react-native-ui-components/Components/Screen/navigationHandler";
7
11
  import {
8
12
  ANIMATION_DURATION,
9
13
  DRAG_TO_COLLAPSE,
10
14
  DRAG_TO_EXPAND,
11
15
  SCREEN_HEIGHT,
12
16
  } from "../consts";
13
- import { State } from "react-native-gesture-handler";
14
- import { Animated } from "react-native";
15
17
  import { PROGRESS_BAR_HEIGHT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/utils";
16
18
 
17
19
  const bottomTabBarHeight = getTabBarHeight();
@@ -21,15 +23,25 @@ export const useVideoModalState = (
21
23
  ) => {
22
24
  const { minimised_height: minimisedHeight } = useConfiguration();
23
25
 
24
- const { maximiseVideoModal, minimiseVideoModal, videoModalState } =
25
- useNavigation();
26
+ const {
27
+ maximiseVideoModal,
28
+ minimiseVideoModal,
29
+ videoModalState,
30
+ currentRoute,
31
+ screenData,
32
+ } = useNavigation();
33
+
34
+ const menuVisible = isMenuVisible(currentRoute, screenData);
26
35
 
27
36
  const collapsed = videoModalState.mode === VideoModalMode.MINIMIZED;
28
37
 
29
38
  const { bottom } = useSafeAreaInsets();
30
39
 
31
40
  const collapsedHeight =
32
- minimisedHeight + bottom + bottomTabBarHeight + PROGRESS_BAR_HEIGHT;
41
+ minimisedHeight +
42
+ bottom +
43
+ (menuVisible ? bottomTabBarHeight : 0) +
44
+ PROGRESS_BAR_HEIGHT;
33
45
 
34
46
  const translateY = translateYRef.current;
35
47
 
@@ -58,74 +70,80 @@ export const useVideoModalState = (
58
70
  const offset = useRef(SCREEN_HEIGHT - collapsedHeight);
59
71
 
60
72
  // Gesture handler for modal
61
- const onGestureEvent = (event: any) => {
62
- if (event.nativeEvent.state === State.ACTIVE) {
63
- const y = event.nativeEvent.translationY;
64
- let newY = offset.current + y;
65
- if (newY < 0) newY = 0;
66
-
67
- if (newY > SCREEN_HEIGHT - collapsedHeight) {
68
- newY = SCREEN_HEIGHT - collapsedHeight;
69
- }
70
-
71
- translateY.setValue(newY);
72
- }
73
- };
74
-
75
- const onHandlerStateChange = (event: any) => {
76
- if (event.nativeEvent.oldState === State.ACTIVE) {
77
- const { translationY } = event.nativeEvent;
78
- let newY = offset.current + translationY;
79
- if (newY < 0) newY = 0;
80
-
81
- if (newY > SCREEN_HEIGHT - collapsedHeight) {
82
- newY = SCREEN_HEIGHT - collapsedHeight;
73
+ const onGestureEvent = useCallback(
74
+ (event: any) => {
75
+ if (event.nativeEvent.state === State.ACTIVE) {
76
+ const y = event.nativeEvent.translationY;
77
+ let newY = offset.current + y;
78
+ if (newY < 0) newY = 0;
79
+
80
+ if (newY > SCREEN_HEIGHT - collapsedHeight) {
81
+ newY = SCREEN_HEIGHT - collapsedHeight;
82
+ }
83
+
84
+ translateY.setValue(newY);
83
85
  }
86
+ },
87
+ [collapsedHeight, translateY]
88
+ );
84
89
 
85
- const shouldCollapse =
86
- translationY > (SCREEN_HEIGHT - collapsedHeight) * DRAG_TO_COLLAPSE;
87
-
88
- const shouldExpand =
89
- translationY < -(SCREEN_HEIGHT - collapsedHeight) * DRAG_TO_EXPAND;
90
-
91
- if (!collapsed && shouldCollapse) {
92
- // Collapse
93
- Animated.timing(translateY, {
94
- toValue: SCREEN_HEIGHT - collapsedHeight,
95
- duration: ANIMATION_DURATION,
96
- useNativeDriver: true,
97
- }).start(() => {
98
- minimiseVideoModal();
99
- offset.current = SCREEN_HEIGHT - collapsedHeight;
100
- });
101
- } else if (collapsed && shouldExpand) {
102
- // Expand
103
- Animated.timing(translateY, {
104
- toValue: 0,
105
- duration: ANIMATION_DURATION,
106
- useNativeDriver: true,
107
- }).start(() => {
108
- maximiseVideoModal();
109
- offset.current = 0;
110
- translateY.setValue(0);
111
- });
112
- } else {
113
- // Snap back to current state
114
- Animated.spring(translateY, {
115
- toValue: collapsed ? SCREEN_HEIGHT - collapsedHeight : 0,
116
- useNativeDriver: true,
117
- }).start(() => {
118
- offset.current = collapsed ? SCREEN_HEIGHT - collapsedHeight : 0;
119
- translateY.setValue(offset.current);
90
+ const onHandlerStateChange = useCallback(
91
+ (event: any) => {
92
+ if (event.nativeEvent.oldState === State.ACTIVE) {
93
+ const { translationY } = event.nativeEvent;
94
+ let newY = offset.current + translationY;
95
+ if (newY < 0) newY = 0;
96
+
97
+ if (newY > SCREEN_HEIGHT - collapsedHeight) {
98
+ newY = SCREEN_HEIGHT - collapsedHeight;
99
+ }
100
+
101
+ const shouldCollapse =
102
+ translationY > (SCREEN_HEIGHT - collapsedHeight) * DRAG_TO_COLLAPSE;
103
+
104
+ const shouldExpand =
105
+ translationY < -(SCREEN_HEIGHT - collapsedHeight) * DRAG_TO_EXPAND;
106
+
107
+ if (!collapsed && shouldCollapse) {
108
+ // Collapse
109
+ Animated.timing(translateY, {
110
+ toValue: SCREEN_HEIGHT - collapsedHeight,
111
+ duration: ANIMATION_DURATION,
112
+ useNativeDriver: true,
113
+ }).start(() => {
114
+ minimiseVideoModal();
115
+ offset.current = SCREEN_HEIGHT - collapsedHeight;
116
+ });
117
+ } else if (collapsed && shouldExpand) {
118
+ // Expand
119
+ Animated.timing(translateY, {
120
+ toValue: 0,
121
+ duration: ANIMATION_DURATION,
122
+ useNativeDriver: true,
123
+ }).start(() => {
124
+ maximiseVideoModal();
125
+ offset.current = 0;
126
+ translateY.setValue(0);
127
+ });
128
+ } else {
129
+ // Snap back to current state
130
+ Animated.spring(translateY, {
131
+ toValue: collapsed ? SCREEN_HEIGHT - collapsedHeight : 0,
132
+ useNativeDriver: true,
133
+ }).start(() => {
134
+ offset.current = collapsed ? SCREEN_HEIGHT - collapsedHeight : 0;
135
+ translateY.setValue(offset.current);
136
+ });
137
+ }
138
+ } else if (event.nativeEvent.state === State.BEGAN) {
139
+ // Gesture started, set offset
140
+ translateY.stopAnimation((value: number) => {
141
+ offset.current = value;
120
142
  });
121
143
  }
122
- } else if (event.nativeEvent.state === State.BEGAN) {
123
- // Gesture started, set offset
124
- translateY.stopAnimation((value: number) => {
125
- offset.current = value;
126
- });
127
- }
128
- };
144
+ },
145
+ [collapsedHeight, translateY]
146
+ );
129
147
 
130
148
  const gestureHandlerProps = useMemo(() => {
131
149
  return {
@@ -148,14 +166,23 @@ export const useVideoModalState = (
148
166
  translateY.setValue(SCREEN_HEIGHT - collapsedHeight);
149
167
  });
150
168
  }
151
- }, [videoModalState.visible, videoModalState.mode]);
152
-
153
- return {
154
- collapsed,
155
- collapsedHeight,
156
- offset,
157
- gestureHandlerProps,
158
- translateY,
159
- expand: maximiseVideoModal,
160
- };
169
+ }, [videoModalState.visible, videoModalState.mode, collapsedHeight]);
170
+
171
+ return useMemo(
172
+ () => ({
173
+ collapsed,
174
+ collapsedHeight,
175
+ offset,
176
+ gestureHandlerProps,
177
+ translateY,
178
+ expand: maximiseVideoModal,
179
+ }),
180
+ [
181
+ collapsed,
182
+ collapsedHeight,
183
+ gestureHandlerProps,
184
+ translateY,
185
+ maximiseVideoModal,
186
+ ]
187
+ );
161
188
  };
@@ -52,50 +52,52 @@ export const useStyles = ({ height }: { height: number }) => {
52
52
  const BG_COLOR_DEFAULT_BLACK = "black";
53
53
  const BG_COLOR_DEFAULT_TRANSPARENT = "transparent";
54
54
 
55
- const styles = StyleSheet.create({
56
- modal: {
57
- position: "absolute",
58
- left: 0,
59
- right: 0,
60
- top: 0,
61
- backgroundColor,
62
- elevation: 10,
63
- zIndex: 100,
64
- overflow: "hidden",
65
- },
66
- modalWrapper: {
67
- backgroundColor: BG_COLOR_DEFAULT_BLACK,
68
- },
69
- collapsedModalBg: {
70
- backgroundColor: BG_COLOR_DEFAULT_BLACK,
71
- },
72
- modalContent: {
73
- flex: 1,
74
- alignItems: "center",
75
- },
76
- expandedContentContainer: {
77
- justifyContent: "flex-start",
78
- backgroundColor: BG_COLOR_DEFAULT_TRANSPARENT,
79
- zIndex: 1,
80
- flex: 0,
81
- },
82
- extraContentScrollView: {
83
- width: "100%",
84
- backgroundColor: BG_COLOR_DEFAULT_TRANSPARENT,
85
- },
86
- collapsedBarContainer: {
87
- ...StyleSheet.absoluteFillObject,
88
- height: COLLAPSED_HEIGHT,
89
- justifyContent: "flex-end",
90
- },
91
- collapsedBarWrapper: {
92
- flex: 1,
93
- },
94
- flexNone: {
95
- ...StyleSheet.absoluteFillObject,
96
- flex: -1,
97
- },
98
- });
99
-
100
- return useMemo(() => styles, [styles]);
55
+ return useMemo(
56
+ () =>
57
+ StyleSheet.create({
58
+ modal: {
59
+ position: "absolute",
60
+ left: 0,
61
+ right: 0,
62
+ top: 0,
63
+ backgroundColor,
64
+ elevation: 10,
65
+ zIndex: 100,
66
+ overflow: "hidden",
67
+ },
68
+ modalWrapper: {
69
+ backgroundColor: BG_COLOR_DEFAULT_BLACK,
70
+ },
71
+ collapsedModalBg: {
72
+ backgroundColor: BG_COLOR_DEFAULT_BLACK,
73
+ },
74
+ modalContent: {
75
+ flex: 1,
76
+ alignItems: "center",
77
+ },
78
+ expandedContentContainer: {
79
+ justifyContent: "flex-start",
80
+ backgroundColor: BG_COLOR_DEFAULT_TRANSPARENT,
81
+ zIndex: 1,
82
+ flex: 0,
83
+ },
84
+ extraContentScrollView: {
85
+ width: "100%",
86
+ backgroundColor: BG_COLOR_DEFAULT_TRANSPARENT,
87
+ },
88
+ collapsedBarContainer: {
89
+ ...StyleSheet.absoluteFillObject,
90
+ height: COLLAPSED_HEIGHT,
91
+ justifyContent: "flex-end",
92
+ },
93
+ collapsedBarWrapper: {
94
+ flex: 1,
95
+ },
96
+ flexNone: {
97
+ ...StyleSheet.absoluteFillObject,
98
+ flex: -1,
99
+ },
100
+ }),
101
+ [backgroundColor, COLLAPSED_HEIGHT]
102
+ );
101
103
  };
@@ -1036,6 +1036,7 @@ export default class VideoPlayer extends React.Component<
1036
1036
  isTabletPortrait={isTabletPortrait}
1037
1037
  aspectRatio={aspectRatio}
1038
1038
  pip={this.state.piped}
1039
+ fullscreen={fullscreen}
1039
1040
  style={{
1040
1041
  tabletLandscapeWidth: getTabletWidth(
1041
1042
  this.getPluginConfiguration().tablet_landscape_sidebar_width,