@applicaster/quick-brick-player 14.0.0-alpha.5621117258 → 14.0.0-alpha.5974411329

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.5621117258",
3
+ "version": "14.0.0-alpha.5974411329",
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": "14.0.0-alpha.5621117258",
39
- "@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.7",
40
- "@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.5621117258",
41
- "@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.5621117258",
42
- "@applicaster/zapp-react-native-utils": "14.0.0-alpha.5621117258",
38
+ "@applicaster/quick-brick-mobile-transport-controls": "14.0.0-rc.40",
39
+ "@applicaster/quick-brick-tv-transport-controls": "14.0.0-rc.37",
40
+ "@applicaster/zapp-react-native-tvos-app": "14.0.0-alpha.5974411329",
41
+ "@applicaster/zapp-react-native-ui-components": "14.0.0-alpha.5974411329",
42
+ "@applicaster/zapp-react-native-utils": "14.0.0-alpha.5974411329",
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": "*",
@@ -22,6 +22,8 @@ import { getTabBarHeight } from "@applicaster/zapp-react-native-utils/reactHooks
22
22
  import { useTitleSummaryOverlay } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerTitleSummaryOverlay";
23
23
  import { usePlayerState } from "@applicaster/zapp-react-native-utils/appUtils/playerManager/usePlayerState";
24
24
  import { useConfiguration } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/utils";
25
+ import { noop } from "@applicaster/zapp-react-native-utils/functionUtils";
26
+ import { PROGRESS_BAR_HEIGHT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/utils";
25
27
 
26
28
  const bottomTabBarHeight = getTabBarHeight();
27
29
 
@@ -38,7 +40,6 @@ type Props = {
38
40
  ImageComponent?: React.ReactNode;
39
41
  isActiveGesture?: boolean;
40
42
  minimisedHeight: number;
41
- progressBarHeight: number;
42
43
  aspectRatio?: number;
43
44
  };
44
45
 
@@ -47,7 +48,7 @@ const styles = StyleSheet.create({
47
48
  flex: 1,
48
49
  flexDirection: "column",
49
50
  alignItems: "stretch",
50
- marginTop: 3, // from plugins/mobile-transport-controls/src/ProgressBar/layouts/DockedLayout.tsx
51
+ marginTop: PROGRESS_BAR_HEIGHT,
51
52
  },
52
53
  content: {
53
54
  flex: 1,
@@ -160,7 +161,7 @@ export const DockedControls = (props: Props) => {
160
161
  const {
161
162
  entry,
162
163
  layoutState,
163
- onPlayerSeek,
164
+ onPlayerSeek = noop,
164
165
  playNextData,
165
166
  ImageComponent,
166
167
  isActiveGesture = true,
@@ -210,8 +211,6 @@ export const DockedControls = (props: Props) => {
210
211
 
211
212
  const liveButton = Boolean(value("live_badge_enabled"));
212
213
 
213
- const startComponentsAnimation = () => {};
214
-
215
214
  const dockedBackgroundColor = value("docked_player_background_color");
216
215
 
217
216
  const insets = useSafeAreaInsets();
@@ -234,7 +233,7 @@ export const DockedControls = (props: Props) => {
234
233
  layoutState={layoutState}
235
234
  onPlayerSeek={onPlayerSeek}
236
235
  playerState={playerState}
237
- startComponentsAnimation={startComponentsAnimation}
236
+ startComponentsAnimation={noop}
238
237
  docked
239
238
  />
240
239
  ) : null}
@@ -4,7 +4,6 @@ import {
4
4
  useSafeAreaFrame,
5
5
  useSafeAreaInsets,
6
6
  } from "react-native-safe-area-context";
7
- import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
8
7
 
9
8
  import { MOBILE, NAVBAR_HEIGHT } from "./const";
10
9
  import { TransportInfo } from "./TransportInfo";
@@ -17,7 +16,7 @@ import {
17
16
  BottomDebugSquare,
18
17
  LeftDebugSquare,
19
18
  RightDebugSquare,
20
- } from "./Debug/index";
19
+ } from "./DebugComponent";
21
20
 
22
21
  import { Props } from "./types";
23
22
 
@@ -79,8 +78,6 @@ export function MobileLayout({
79
78
  onSpeedButtonPress,
80
79
  playbackSpeedName,
81
80
  configuration,
82
- dimensions,
83
- playNextData,
84
81
  title,
85
82
  summary,
86
83
  }: Props) {
@@ -88,12 +85,10 @@ export function MobileLayout({
88
85
 
89
86
  const { bottom: bottomInset, top: topInset } = useSafeAreaInsets();
90
87
  const { height: screenHeight } = useSafeAreaFrame();
91
- const { progressBarHeight } = useModalAnimationContext();
92
88
 
93
89
  const { imageSize } = useMobileLayoutImageSize();
94
90
 
95
- const { height: transportInfoHeight, onLayout: onTransportInfoLayout } =
96
- useTransportInfoHeight();
91
+ const { onLayout: onTransportInfoLayout } = useTransportInfoHeight();
97
92
 
98
93
  const controlsContainerHeight = React.useMemo(() => {
99
94
  return (
@@ -107,10 +102,6 @@ export function MobileLayout({
107
102
  );
108
103
  }, [screenHeight, topInset, imageSize, bottomInset]);
109
104
 
110
- const verticalOffsetForImage = React.useMemo(() => {
111
- return transportInfoHeight + MOBILE.MARGIN_TOP - progressBarHeight;
112
- }, [transportInfoHeight, progressBarHeight]);
113
-
114
105
  return (
115
106
  <View
116
107
  style={[
@@ -162,18 +153,9 @@ export function MobileLayout({
162
153
  >
163
154
  <PlayerImage
164
155
  entry={entry}
165
- layoutState={layoutState}
166
- playerState={playerState}
167
- value={value}
168
- configuration={configuration}
169
- onPlayerSeek={onPlayerSeek}
170
- dimensions={dimensions}
171
- playNextData={playNextData}
172
- title={title}
173
- summary={summary}
174
- docked={docked}
156
+ docked={false}
175
157
  imageWidth={imageSize}
176
- verticalOffset={verticalOffsetForImage}
158
+ configuration={configuration}
177
159
  />
178
160
  </View>
179
161
  {/* PlayerImage */}
@@ -1,7 +1,16 @@
1
1
  import React, { PropsWithChildren } from "react";
2
2
  import { Image, Animated, StyleSheet, ImageStyle } from "react-native";
3
3
 
4
- import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
4
+ import {
5
+ useModalAnimationContext,
6
+ PlayerAnimationStateEnum,
7
+ DURATION_TO_MINIMIZE,
8
+ DURATION_TO_MAXIMIZE,
9
+ } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
10
+ import { PlayerAnimationStateT } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation/ModalAnimationContext";
11
+ import { useBackgroundImage } from "@applicaster/zapp-react-native-utils/audioPlayerUtils";
12
+
13
+ import { useChangePlayerState } from "./hooks";
5
14
 
6
15
  const styles = StyleSheet.create({
7
16
  container: {
@@ -15,17 +24,48 @@ type Props = PropsWithChildren<{
15
24
  entry: ZappEntry;
16
25
  style?: ImageStyle | ImageStyle[];
17
26
  imageWidth: number;
27
+ docked: boolean;
18
28
  }>;
19
29
 
20
- export const AnimatedImage = ({ entry, style, imageWidth }: Props) => {
30
+ export const AnimatedImage = ({ entry, style, imageWidth, docked }: Props) => {
21
31
  const heightAnim = React.useRef(new Animated.Value(imageWidth)).current;
22
32
 
23
- const source = React.useMemo(
24
- () => ({ uri: imageSrcFromMediaItem(entry, undefined) }),
25
- [entry]
26
- );
33
+ const backgroundImageSource = useBackgroundImage(entry);
34
+
35
+ const { minimisedHeight } = useModalAnimationContext();
36
+
37
+ const changePlayerState$ = useChangePlayerState({ docked });
38
+
39
+ React.useEffect(() => {
40
+ const subscription = changePlayerState$.subscribe({
41
+ next: (nextPlayerState: PlayerAnimationStateT) => {
42
+ if (nextPlayerState === PlayerAnimationStateEnum.minimize) {
43
+ Animated.timing(heightAnim, {
44
+ toValue: minimisedHeight,
45
+ duration: DURATION_TO_MINIMIZE,
46
+ useNativeDriver: false, // width/height can't use native driver
47
+ }).start();
48
+ }
49
+
50
+ if (nextPlayerState === PlayerAnimationStateEnum.maximize) {
51
+ Animated.timing(heightAnim, {
52
+ toValue: imageWidth,
53
+ duration: DURATION_TO_MAXIMIZE,
54
+ useNativeDriver: false, // width/height can't use native driver
55
+ }).start();
56
+ }
57
+
58
+ if (nextPlayerState === PlayerAnimationStateEnum.appear_as_docked) {
59
+ // minimize image immediatly
60
+ heightAnim.setValue(minimisedHeight);
61
+ }
62
+ },
63
+ });
27
64
 
28
- if (!source) return null;
65
+ return () => {
66
+ subscription.unsubscribe();
67
+ };
68
+ }, [changePlayerState$, minimisedHeight, imageWidth]);
29
69
 
30
70
  return (
31
71
  <Animated.View
@@ -36,7 +76,7 @@ export const AnimatedImage = ({ entry, style, imageWidth }: Props) => {
36
76
  },
37
77
  ]}
38
78
  >
39
- <Image resizeMode="cover" style={style} source={source} />
79
+ <Image resizeMode="cover" style={style} source={backgroundImageSource} />
40
80
  </Animated.View>
41
81
  );
42
82
  };
@@ -1,7 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { Image, ImageStyle } from "react-native";
3
-
4
- import { imageSrcFromMediaItem } from "@applicaster/zapp-react-native-utils/configurationUtils";
3
+ import { useBackgroundImage } from "@applicaster/zapp-react-native-utils/audioPlayerUtils";
5
4
 
6
5
  type Props = {
7
6
  entry: ZappEntry;
@@ -9,12 +8,9 @@ type Props = {
9
8
  };
10
9
 
11
10
  export const FlexImage = ({ entry, style }: Props) => {
12
- const source = React.useMemo(
13
- () => ({ uri: imageSrcFromMediaItem(entry, undefined) }),
14
- [entry]
15
- );
11
+ const backgroundImageSource = useBackgroundImage(entry);
16
12
 
17
- if (!source) return null;
18
-
19
- return <Image resizeMode="cover" style={style} source={source} />;
13
+ return (
14
+ <Image resizeMode="cover" style={style} source={backgroundImageSource} />
15
+ );
20
16
  };
@@ -53,6 +53,7 @@ export const PlayerImage = (props: Props) => {
53
53
  entry={entry}
54
54
  style={[styles.backgroundImageContainer, { borderRadius }]}
55
55
  imageWidth={imageWidth}
56
+ docked={docked}
56
57
  />
57
58
  )}
58
59
  </View>
@@ -1,11 +1,6 @@
1
1
  import * as React from "react";
2
2
  import { StyleSheet, View } from "react-native";
3
- import {
4
- useSafeAreaFrame,
5
- useSafeAreaInsets,
6
- } from "react-native-safe-area-context";
7
- import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
8
- import { isApplePlatform } from "@applicaster/zapp-react-native-utils/reactUtils";
3
+ import { useSafeAreaFrame } from "react-native-safe-area-context";
9
4
 
10
5
  import { TransportInfo } from "./TransportInfo";
11
6
  import { PlayerImage } from "./PlayerImage";
@@ -17,8 +12,6 @@ import { Props } from "./types";
17
12
  import { isSmallTabletHeight as getIsSmallTabletHeight } from "./utils";
18
13
  import { NAVBAR_HEIGHT, TABLET_LANDSCAPE } from "./const";
19
14
 
20
- const isIOS = isApplePlatform();
21
-
22
15
  const MIN_WIDTH = TABLET_LANDSCAPE.MIN_WIDTH; // Minimum width for the audio player container
23
16
  const MAX_SPACING = TABLET_LANDSCAPE.MARGIN_VERTICAL; // Maximum spacing for the audio player container
24
17
  const MIN_SPACING = TABLET_LANDSCAPE.MARGIN_VERTICAL_S; // Minimum spacing for the audio player container
@@ -68,22 +61,6 @@ const styles = StyleSheet.create({
68
61
  },
69
62
  });
70
63
 
71
- const isTabletWithHomeButton = (bottomInset: number): boolean =>
72
- bottomInset === 0;
73
-
74
- const withAdditionalOffset = ({ progressBarHeight, bottomInset }) => {
75
- if (isIOS && isTabletWithHomeButton(bottomInset)) {
76
- return progressBarHeight === 0 ? 8 : progressBarHeight + 2;
77
- }
78
-
79
- if (isIOS && !isTabletWithHomeButton(bottomInset)) {
80
- return progressBarHeight === 0 ? 4 : 1;
81
- }
82
-
83
- // android
84
- return progressBarHeight === 0 ? 4 : 0.5;
85
- };
86
-
87
64
  export function TabletLandscapeLayout({
88
65
  entry,
89
66
  layoutState,
@@ -96,21 +73,16 @@ export function TabletLandscapeLayout({
96
73
  onSkipStart,
97
74
  onSkipLive,
98
75
  onSpeedButtonPress,
99
- onCloseVideoModal,
100
76
  playbackSpeedName,
101
77
  configuration,
102
- dimensions,
103
- playNextData,
104
78
  title,
105
79
  summary,
106
80
  }: Props) {
107
81
  const [imageWidth, setImageWidth] = React.useState(0);
108
82
  const { docked } = layoutState;
109
83
 
110
- const { bottom: bottomInset } = useSafeAreaInsets();
111
84
  const { height: screenHeight } = useSafeAreaFrame();
112
85
  const isSmallScreen = getIsSmallTabletHeight(screenHeight);
113
- const { progressBarHeight } = useModalAnimationContext();
114
86
 
115
87
  const onLayoutImage = React.useCallback((e) => {
116
88
  setImageWidth(e.nativeEvent.layout.width);
@@ -149,20 +121,7 @@ export function TabletLandscapeLayout({
149
121
  <PlayerImage
150
122
  docked={false}
151
123
  entry={entry}
152
- layoutState={layoutState}
153
- playerState={playerState}
154
- value={value}
155
124
  configuration={configuration}
156
- onPlayerSeek={onPlayerSeek}
157
- onCloseVideoModal={onCloseVideoModal}
158
- dimensions={dimensions}
159
- playNextData={playNextData}
160
- title={title}
161
- summary={summary}
162
- verticalOffset={withAdditionalOffset({
163
- progressBarHeight,
164
- bottomInset,
165
- })}
166
125
  onLayoutImage={onLayoutImage}
167
126
  />
168
127
  ) : null}
@@ -4,8 +4,6 @@ import {
4
4
  useSafeAreaFrame,
5
5
  useSafeAreaInsets,
6
6
  } from "react-native-safe-area-context";
7
- import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
8
- import { toNumberWithDefaultZero } from "@applicaster/zapp-react-native-utils/numberUtils";
9
7
 
10
8
  import { withDebug } from "./debug";
11
9
  import { TABLET_PORTRAIT } from "./const";
@@ -15,7 +13,6 @@ import { PlayerImage } from "./PlayerImage";
15
13
  import { Controls } from "./Controls";
16
14
 
17
15
  import { useTabletLayoutImageSize } from "./hooks";
18
- import { DockedControls } from "./DockedControls";
19
16
  import { VerticalGutter } from "./VerticalGutter";
20
17
 
21
18
  import { Props } from "./types";
@@ -82,11 +79,8 @@ export function TabletPortraitLayout({
82
79
  onSkipStart,
83
80
  onSkipLive,
84
81
  onSpeedButtonPress,
85
- onCloseVideoModal,
86
82
  playbackSpeedName,
87
83
  configuration,
88
- dimensions,
89
- playNextData,
90
84
  title,
91
85
  summary,
92
86
  }: Props) {
@@ -94,7 +88,6 @@ export function TabletPortraitLayout({
94
88
 
95
89
  const { bottom: bottomInset, top: topInset } = useSafeAreaInsets();
96
90
  const { height: screenHeight } = useSafeAreaFrame();
97
- const { progressBarHeight } = useModalAnimationContext();
98
91
 
99
92
  const {
100
93
  imageSize,
@@ -153,21 +146,9 @@ export function TabletPortraitLayout({
153
146
  >
154
147
  <PlayerImage
155
148
  entry={entry}
156
- layoutState={layoutState}
157
- playerState={playerState}
158
- value={value}
159
149
  configuration={configuration}
160
- onPlayerSeek={onPlayerSeek}
161
- onCloseVideoModal={onCloseVideoModal}
162
- dimensions={dimensions}
163
- playNextData={playNextData}
164
- title={title}
165
- summary={summary}
166
150
  docked={docked}
167
151
  imageWidth={imageSize}
168
- verticalOffset={
169
- toNumberWithDefaultZero(topOffset) - progressBarHeight
170
- }
171
152
  />
172
153
  </View>
173
154
 
@@ -196,20 +177,6 @@ export function TabletPortraitLayout({
196
177
  </View>
197
178
  </View>
198
179
  </View>
199
- {/* PlayerImage */}
200
-
201
- <DockedControls
202
- entry={entry}
203
- layoutState={layoutState}
204
- playerState={playerState}
205
- value={value}
206
- dimensions={dimensions}
207
- onCloseVideoModal={onCloseVideoModal}
208
- onPlayerSeek={onPlayerSeek}
209
- playNextData={playNextData}
210
- title={title}
211
- summary={summary}
212
- />
213
180
  </View>
214
181
  );
215
182
  }
@@ -1,5 +1,4 @@
1
1
  import * as React from "react";
2
- import { compose, map, propOr, split, take, trim } from "ramda";
3
2
  import { LayoutChangeEvent, StyleSheet, View } from "react-native";
4
3
 
5
4
  import { TransportInfo as MobileTransportInfo } from "@applicaster/quick-brick-mobile-transport-controls";
@@ -13,6 +12,7 @@ import { NAVBAR_HEIGHT, TABLET_LANDSCAPE } from "../const";
13
12
  import { withDebug } from "../debug";
14
13
  import { useSafeAreaFrame } from "react-native-safe-area-context";
15
14
  import { isSmallTabletHeight } from "../utils";
15
+ import { getPlayerActionButtons } from "@applicaster/zapp-react-native-utils/playerUtils";
16
16
 
17
17
  const styles = StyleSheet.create({
18
18
  container: {
@@ -82,14 +82,8 @@ export const TransportInfo = ({
82
82
  );
83
83
 
84
84
  const actionButtons = React.useMemo(
85
- () =>
86
- compose(
87
- take(2),
88
- map(trim),
89
- split(","),
90
- propOr("", "player_action_buttons")
91
- )(configuration),
92
- [configuration.player_action_buttons]
85
+ () => getPlayerActionButtons(configuration),
86
+ [configuration]
93
87
  );
94
88
 
95
89
  return (
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { ModalHeader } from "@applicaster/zapp-react-native-ui-components/Components/ModalComponent/Header";
3
- import { isNil } from "lodash";
3
+ import { isNil } from "@applicaster/zapp-react-native-utils/utils";
4
4
 
5
5
  const formatTime = (milliseconds: number) => {
6
6
  const totalSeconds = Math.floor(milliseconds / 1000);
@@ -0,0 +1,7 @@
1
+ import { Animated } from "react-native";
2
+ import { createNativeWrapper } from "react-native-gesture-handler";
3
+
4
+ export const GestureAnimatedScrollView = createNativeWrapper(
5
+ Animated.ScrollView,
6
+ {}
7
+ );
@@ -1,6 +1,6 @@
1
- import React, { ReactNode } from "react";
1
+ import React, { ReactElement } from "react";
2
2
 
3
- import { StyleSheet, Animated, Pressable } from "react-native";
3
+ import { Animated, Pressable } from "react-native";
4
4
  import { PanGestureHandler } from "react-native-gesture-handler";
5
5
  import { useStyles } from "./styles";
6
6
  import { useVideoModalState } from "./hooks";
@@ -8,8 +8,8 @@ import { MODAL_COLLAPSE_START, MODAL_RADIUS, SCREEN_HEIGHT } from "./consts";
8
8
  import { useModalAnimationContext } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
9
9
 
10
10
  type AnimatedModalProps = {
11
- content?: ReactNode;
12
- collapsedContent?: ReactNode;
11
+ content?: ReactElement;
12
+ collapsedContent?: ReactElement;
13
13
  };
14
14
 
15
15
  export function AnimatedModal({
@@ -50,8 +50,9 @@ export function AnimatedModal({
50
50
  return (
51
51
  <PanGestureHandler {...gestureHandlerProps}>
52
52
  <Animated.View
53
+ pointerEvents={"auto"}
53
54
  style={[
54
- styles.modal,
55
+ styles.modalWrapper,
55
56
  {
56
57
  borderTopLeftRadius: borderTopRadiusAnimated,
57
58
  borderTopRightRadius: borderTopRadiusAnimated,
@@ -60,31 +61,47 @@ export function AnimatedModal({
60
61
  },
61
62
  ]}
62
63
  >
63
- {/* Expanded Content (fades in) */}
64
64
  <Animated.View
65
- pointerEvents={!collapsed ? "auto" : "none"}
66
65
  style={[
67
- StyleSheet.absoluteFill,
68
- styles.expandedContentContainer,
69
- { opacity: expandedOpacity },
66
+ styles.modal,
67
+ {
68
+ borderTopLeftRadius: borderTopRadiusAnimated,
69
+ borderTopRightRadius: borderTopRadiusAnimated,
70
+ height: SCREEN_HEIGHT,
71
+ },
70
72
  ]}
71
73
  >
72
- {content}
73
- </Animated.View>
74
- {/* Collapsed Bar (fades out) */}
75
- <Animated.View
76
- pointerEvents={collapsed ? "box-none" : "none"}
77
- style={[styles.collapsedBarContainer, { opacity: collapsedOpacity }]}
78
- >
79
- <Pressable
80
- testID="collapsedBarWrapper"
81
- onPress={() => {
82
- expand();
83
- }}
84
- style={styles.collapsedBarWrapper}
74
+ {/* Expanded Content (fades in) */}
75
+ <Animated.View
76
+ pointerEvents={!collapsed ? "auto" : "none"}
77
+ style={styles.modalContent}
78
+ >
79
+ <Animated.View
80
+ pointerEvents={!collapsed ? "auto" : "none"}
81
+ style={[
82
+ styles.expandedContentContainer,
83
+ { opacity: expandedOpacity },
84
+ ]}
85
+ >
86
+ {content}
87
+ </Animated.View>
88
+ </Animated.View>
89
+ {/* Collapsed Bar (fades out) */}
90
+ <Animated.View
91
+ pointerEvents={collapsed ? "box-none" : "none"}
92
+ style={[
93
+ styles.collapsedBarContainer,
94
+ { opacity: collapsedOpacity },
95
+ ]}
85
96
  >
86
- {collapsedContent}
87
- </Pressable>
97
+ <Pressable
98
+ testID="collapsedBarWrapper"
99
+ onPress={expand}
100
+ style={styles.collapsedBarWrapper}
101
+ >
102
+ {collapsedContent}
103
+ </Pressable>
104
+ </Animated.View>
88
105
  </Animated.View>
89
106
  </Animated.View>
90
107
  </PanGestureHandler>