@applicaster/zapp-react-native-ui-components 12.0.0-alpha.4201443043 → 12.0.0-alpha.4220424021
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/Components/BaseFocusable/index.tsx +2 -2
- package/Components/Cell/Cell.tsx +26 -5
- package/Components/Cell/CellWithFocusable.tsx +6 -4
- package/Components/Cell/TvOSCellComponent.tsx +3 -7
- package/Components/Focusable/Focusable.tsx +6 -1
- package/Components/FocusableGroup/index.tsx +10 -2
- package/Components/FreezeWithCallback/Freeze.tsx +31 -0
- package/Components/FreezeWithCallback/LICENSE +21 -0
- package/Components/FreezeWithCallback/Suspender.tsx +17 -0
- package/Components/FreezeWithCallback/__tests__/index.test.tsx +170 -0
- package/Components/FreezeWithCallback/index.tsx +3 -0
- package/Components/Layout/TV/ScreenContainer.tsx +79 -5
- package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +38 -28
- package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +25 -13
- package/Components/Layout/TV/__tests__/index.test.tsx +3 -2
- package/Components/Layout/TV/index.tsx +52 -9
- package/Components/Layout/TV/index.web.tsx +33 -0
- package/Components/Layout/index.tsx +15 -11
- package/Components/MasterCell/DefaultComponents/ActionButton.tsx +2 -1
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +86 -116
- package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/ImageBorderContainer/index.ts +71 -0
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +20 -0
- package/Components/MasterCell/DefaultComponents/index.ts +2 -0
- package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +6 -1
- package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +7 -1
- package/Components/MasterCell/dataAdapter.ts +21 -7
- package/Components/MasterCell/index.tsx +5 -3
- package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
- package/Components/MasterCell/utils/index.ts +17 -30
- package/Components/Navigator/StackNavigator.tsx +14 -5
- package/Components/PlayerContainer/PlayerContainer.tsx +2 -0
- package/Components/Screen/TV/hooks/index.ts +0 -2
- package/Components/Screen/TV/index.web.tsx +40 -41
- package/Components/Screen/__tests__/Screen.test.tsx +3 -49
- package/Components/Screen/index.tsx +55 -76
- package/Components/Screen/navigationHandler.ts +6 -3
- package/Components/Screen/orientationHandler.ts +18 -7
- package/Components/Screen/utils.ts +16 -0
- package/Components/ScreenResolver/index.tsx +6 -11
- package/Components/Transitioner/Scene.tsx +20 -12
- package/Components/Transitioner/Transitioner.tsx +40 -49
- package/Components/Transitioner/__tests__/Scene.test.js +7 -0
- package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +8 -4
- package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +1 -0
- package/Components/VideoLive/LiveImageManager.ts +10 -0
- package/Components/VideoLive/PlayerLiveImageComponent.tsx +52 -24
- package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +26 -24
- package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +2 -14
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +79 -45
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +47 -33
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +121 -86
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +32 -4
- package/Components/VideoModal/ModalAnimation/utils.ts +7 -4
- package/Components/VideoModal/PlayerDetails.tsx +3 -3
- package/Components/VideoModal/PlayerWrapper.tsx +10 -10
- package/Components/VideoModal/VideoModal.tsx +4 -4
- package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +80 -14
- package/Components/VideoModal/hooks/useModalSize.ts +10 -12
- package/Components/VideoModal/utils.ts +5 -2
- package/Components/ZappFrameworkComponents/BarView/BarView.tsx +4 -3
- package/Components/default-cell-renderer/__tests__/__snapshots__/defaultCellRenderer.test.tsx.snap +4 -4
- package/Contexts/FocusableGroupContext/FocusableGroupContext.ts +3 -0
- package/Contexts/FocusableGroupContext/FocusableGroupContextProvider.tsx +16 -0
- package/Contexts/FocusableGroupContext/__tests__/FocusableGroupContextProvider.test.tsx +22 -0
- package/Contexts/FocusableGroupContext/__tests__/withFocusableContext.test.tsx +26 -0
- package/Contexts/FocusableGroupContext/index.ts +7 -0
- package/Contexts/FocusableGroupContext/withFocusableContext.tsx +17 -0
- package/Contexts/ScreenDataContext/index.tsx +20 -0
- package/package.json +5 -5
- package/Components/Screen/TV/hooks/useRestoreFocus.ts +0 -22
- package/Contexts/ScreenDataContext/index.ts +0 -3
- /package/Components/FocusableGroup/{index.android.js → index.android.ts} +0 -0
- /package/Components/FocusableGroup/{index.ios.js → index.ios.ts} +0 -0
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import React, { useRef, useState } from "react";
|
|
2
|
-
import { Animated, View
|
|
2
|
+
import { Animated, View } from "react-native";
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
useSafeAreaInsets,
|
|
6
|
-
useSafeAreaFrame,
|
|
7
|
-
} from "react-native-safe-area-context";
|
|
4
|
+
import { useSafeAreaInsets } from "react-native-safe-area-context";
|
|
8
5
|
|
|
9
6
|
import {
|
|
10
7
|
useModalAnimationContext,
|
|
@@ -18,6 +15,7 @@ import {
|
|
|
18
15
|
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
19
16
|
import { useIsRTL } from "@applicaster/zapp-react-native-utils/localizationUtils";
|
|
20
17
|
import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
|
|
18
|
+
import { useAppState } from "@applicaster/zapp-react-native-utils/reactHooks/app";
|
|
21
19
|
|
|
22
20
|
import {
|
|
23
21
|
gestureListenerHelper,
|
|
@@ -35,10 +33,6 @@ type Props = {
|
|
|
35
33
|
additionalData?: { [key: string]: any };
|
|
36
34
|
};
|
|
37
35
|
|
|
38
|
-
const styles = StyleSheet.create({
|
|
39
|
-
flex: { flex: 1 },
|
|
40
|
-
});
|
|
41
|
-
|
|
42
36
|
export const AnimationView = ({
|
|
43
37
|
animationType,
|
|
44
38
|
style,
|
|
@@ -56,21 +50,22 @@ export const AnimationView = ({
|
|
|
56
50
|
tabletLandscapePlayerTopPosition,
|
|
57
51
|
setTabletLandscapePlayerTopPosition,
|
|
58
52
|
modalSnapPoints,
|
|
53
|
+
startComponentsAnimationDistance,
|
|
54
|
+
progressBarHeight,
|
|
59
55
|
} = useModalAnimationContext();
|
|
60
56
|
|
|
61
57
|
const isRTL = useIsRTL();
|
|
58
|
+
const isAppActive = useAppState(true);
|
|
62
59
|
|
|
63
60
|
const {
|
|
64
|
-
|
|
61
|
+
width: screenWidth,
|
|
65
62
|
deviceInfo: { isTablet, isTabletLandscape },
|
|
66
|
-
} = useDimensions("
|
|
63
|
+
} = useDimensions("window", { deviceInfo: true });
|
|
67
64
|
|
|
68
|
-
const startAnimationDistance = Math.round((screenHeight * 60) / 100);
|
|
69
65
|
const { videoModalState } = useNavigation();
|
|
70
|
-
const bottomTabBarHeight = useGetBottomTabBarHeight();
|
|
71
|
-
const minimisedWidth = defaultAspectRatioWidth(minimisedHeight);
|
|
72
66
|
const insets = useSafeAreaInsets();
|
|
73
|
-
const
|
|
67
|
+
const bottomTabBarHeight = useGetBottomTabBarHeight() + (insets.bottom || 0);
|
|
68
|
+
const minimisedWidth = defaultAspectRatioWidth(minimisedHeight);
|
|
74
69
|
const animationComponentRef = useRef(null);
|
|
75
70
|
|
|
76
71
|
// retrieving top position of the player for tablet landscape mode
|
|
@@ -88,13 +83,6 @@ export const AnimationView = ({
|
|
|
88
83
|
getAnimationDefaultValue(animationType, bottomTabBarHeight)
|
|
89
84
|
);
|
|
90
85
|
|
|
91
|
-
const animationValueType: string =
|
|
92
|
-
animationType === ComponentAnimationType.player ? "ValueXY" : "Value";
|
|
93
|
-
|
|
94
|
-
const animatedValue = useRef(
|
|
95
|
-
new Animated[animationValueType](defaultValue)
|
|
96
|
-
).current;
|
|
97
|
-
|
|
98
86
|
const isAudioItem = React.useMemo(
|
|
99
87
|
() =>
|
|
100
88
|
videoModalState.item?.content?.type?.includes?.("audio") ||
|
|
@@ -105,12 +93,12 @@ export const AnimationView = ({
|
|
|
105
93
|
const inlineAudioPlayer = additionalData.inlineAudioPlayer;
|
|
106
94
|
|
|
107
95
|
const moveUpValue = additionalData.saveArea
|
|
108
|
-
? -insets.top
|
|
96
|
+
? -insets.top + (isAudioItem ? 0 : progressBarHeight)
|
|
109
97
|
: isTablet
|
|
110
98
|
? isTabletLandscape && (!isAudioItem || (isAudioItem && inlineAudioPlayer))
|
|
111
|
-
? -tabletLandscapePlayerTopPosition
|
|
99
|
+
? -tabletLandscapePlayerTopPosition + progressBarHeight
|
|
112
100
|
: -130
|
|
113
|
-
: -50;
|
|
101
|
+
: -50 + progressBarHeight;
|
|
114
102
|
|
|
115
103
|
const moveComponentHorizontalValue = additionalData.moveValue
|
|
116
104
|
? isRTL
|
|
@@ -118,63 +106,8 @@ export const AnimationView = ({
|
|
|
118
106
|
: -additionalData.moveValue
|
|
119
107
|
: 0;
|
|
120
108
|
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
isAudioItem,
|
|
124
|
-
bottomTabBarHeight,
|
|
125
|
-
minimisedHeight,
|
|
126
|
-
minimisedWidth,
|
|
127
|
-
defaultValue,
|
|
128
|
-
moveUpValue,
|
|
129
|
-
moveComponentHorizontalValue,
|
|
130
|
-
isTablet,
|
|
131
|
-
isTabletLandscape,
|
|
132
|
-
isRTL,
|
|
133
|
-
fromMiniPlayer: videoModalState.mode === "MINIMIZED",
|
|
134
|
-
inlineAudioPlayer,
|
|
135
|
-
}),
|
|
136
|
-
[
|
|
137
|
-
bottomTabBarHeight,
|
|
138
|
-
minimisedHeight,
|
|
139
|
-
minimisedWidth,
|
|
140
|
-
defaultValue,
|
|
141
|
-
moveUpValue,
|
|
142
|
-
moveComponentHorizontalValue,
|
|
143
|
-
videoModalState.mode,
|
|
144
|
-
]
|
|
145
|
-
);
|
|
146
|
-
|
|
147
|
-
React.useEffect(() => {
|
|
148
|
-
if (additionalData.resetAnimationValue) {
|
|
149
|
-
animatedValue.setValue(0);
|
|
150
|
-
}
|
|
151
|
-
}, [additionalData.resetAnimationValue]);
|
|
152
|
-
|
|
153
|
-
React.useEffect(() => {
|
|
154
|
-
if (animationType === ComponentAnimationType.player) {
|
|
155
|
-
let width, height;
|
|
156
|
-
|
|
157
|
-
if (additionalData.aspectRatio) {
|
|
158
|
-
width = isTabletLandscape ? additionalData.width : screenWidth;
|
|
159
|
-
|
|
160
|
-
height =
|
|
161
|
-
(isTabletLandscape ? additionalData.width : screenWidth) /
|
|
162
|
-
additionalData.aspectRatio;
|
|
163
|
-
} else {
|
|
164
|
-
width =
|
|
165
|
-
typeof additionalData.width === "number" && additionalData.width;
|
|
166
|
-
|
|
167
|
-
height =
|
|
168
|
-
typeof additionalData.height === "number" && additionalData.height;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (defaultValue.x === 0 && width && height) {
|
|
172
|
-
const value = { x: width, y: height };
|
|
173
|
-
setDefaultValue(value);
|
|
174
|
-
animatedValue.setValue(value);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}, [additionalData, screenWidth]);
|
|
109
|
+
const animationValueType: string =
|
|
110
|
+
animationType === ComponentAnimationType.player ? "ValueXY" : "Value";
|
|
178
111
|
|
|
179
112
|
const getAnimationValue = React.useCallback(
|
|
180
113
|
(animationType, state) => {
|
|
@@ -292,6 +225,107 @@ export const AnimationView = ({
|
|
|
292
225
|
]
|
|
293
226
|
);
|
|
294
227
|
|
|
228
|
+
const getInitialValue = React.useCallback(() => {
|
|
229
|
+
const mode =
|
|
230
|
+
videoModalState.mode === "PIP"
|
|
231
|
+
? videoModalState.previousMode
|
|
232
|
+
: videoModalState.mode;
|
|
233
|
+
|
|
234
|
+
switch (mode) {
|
|
235
|
+
case "MINIMIZED":
|
|
236
|
+
return getAnimationValue(
|
|
237
|
+
animationType,
|
|
238
|
+
PlayerAnimationStateEnum.minimize
|
|
239
|
+
).toValue;
|
|
240
|
+
|
|
241
|
+
case "MAXIMIZED":
|
|
242
|
+
default:
|
|
243
|
+
return getAnimationValue(
|
|
244
|
+
animationType,
|
|
245
|
+
PlayerAnimationStateEnum.maximaze
|
|
246
|
+
).toValue;
|
|
247
|
+
}
|
|
248
|
+
}, [defaultValue, videoModalState]);
|
|
249
|
+
|
|
250
|
+
const animatedValue = useRef(
|
|
251
|
+
new Animated[animationValueType](getInitialValue())
|
|
252
|
+
).current;
|
|
253
|
+
|
|
254
|
+
const calculationData = React.useMemo(
|
|
255
|
+
() => ({
|
|
256
|
+
isAudioItem,
|
|
257
|
+
bottomTabBarHeight,
|
|
258
|
+
minimisedHeight,
|
|
259
|
+
minimisedWidth,
|
|
260
|
+
defaultValue,
|
|
261
|
+
moveUpValue,
|
|
262
|
+
moveComponentHorizontalValue,
|
|
263
|
+
isTablet,
|
|
264
|
+
isTabletLandscape,
|
|
265
|
+
isRTL,
|
|
266
|
+
fromMiniPlayer: videoModalState.mode === "MINIMIZED",
|
|
267
|
+
inlineAudioPlayer,
|
|
268
|
+
}),
|
|
269
|
+
[
|
|
270
|
+
bottomTabBarHeight,
|
|
271
|
+
minimisedHeight,
|
|
272
|
+
minimisedWidth,
|
|
273
|
+
defaultValue,
|
|
274
|
+
moveUpValue,
|
|
275
|
+
moveComponentHorizontalValue,
|
|
276
|
+
videoModalState.mode,
|
|
277
|
+
]
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
React.useEffect(() => {
|
|
281
|
+
if (additionalData.resetAnimationValue) {
|
|
282
|
+
animatedValue.setValue(defaultValue);
|
|
283
|
+
}
|
|
284
|
+
}, [additionalData.resetAnimationValue, defaultValue]);
|
|
285
|
+
|
|
286
|
+
React.useEffect(() => {
|
|
287
|
+
if (animationType === ComponentAnimationType.player) {
|
|
288
|
+
let width, height;
|
|
289
|
+
|
|
290
|
+
if (additionalData.aspectRatio) {
|
|
291
|
+
width = isTabletLandscape ? additionalData.width : screenWidth;
|
|
292
|
+
|
|
293
|
+
height =
|
|
294
|
+
(isTabletLandscape ? additionalData.width : screenWidth) /
|
|
295
|
+
additionalData.aspectRatio;
|
|
296
|
+
} else {
|
|
297
|
+
width =
|
|
298
|
+
typeof additionalData.width === "number" && additionalData.width;
|
|
299
|
+
|
|
300
|
+
height =
|
|
301
|
+
typeof additionalData.height === "number" && additionalData.height;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
if (defaultValue.x === 0 && width && height) {
|
|
305
|
+
const value = { x: width, y: height };
|
|
306
|
+
setDefaultValue(value);
|
|
307
|
+
animatedValue.setValue(value);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}, [additionalData, screenWidth]);
|
|
311
|
+
|
|
312
|
+
React.useEffect(() => {
|
|
313
|
+
if (
|
|
314
|
+
videoModalState.mode === "MINIMIZED" &&
|
|
315
|
+
videoModalState.previousMode === "MAXIMIZED"
|
|
316
|
+
) {
|
|
317
|
+
// set animation to the minimize values if moving from the player to another screen
|
|
318
|
+
if (playerAnimationState === null) {
|
|
319
|
+
const value = getAnimationValue(
|
|
320
|
+
animationType,
|
|
321
|
+
PlayerAnimationStateEnum.minimize
|
|
322
|
+
).toValue;
|
|
323
|
+
|
|
324
|
+
animatedValue.setValue(value);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}, [videoModalState]);
|
|
328
|
+
|
|
295
329
|
React.useEffect(() => {
|
|
296
330
|
if (
|
|
297
331
|
playerAnimationState === PlayerAnimationStateEnum.minimize &&
|
|
@@ -325,7 +359,7 @@ export const AnimationView = ({
|
|
|
325
359
|
animatedValue,
|
|
326
360
|
calculationData,
|
|
327
361
|
modalSnapPoint: modalSnapPoints[1],
|
|
328
|
-
|
|
362
|
+
startComponentsAnimationDistance,
|
|
329
363
|
startComponentsAnimation,
|
|
330
364
|
setStartComponentsAnimation,
|
|
331
365
|
getAnimationValue,
|
|
@@ -350,7 +384,7 @@ export const AnimationView = ({
|
|
|
350
384
|
animatedValue,
|
|
351
385
|
calculationData,
|
|
352
386
|
modalSnapPoint: modalSnapPoints[1],
|
|
353
|
-
|
|
387
|
+
startComponentsAnimationDistance,
|
|
354
388
|
startComponentsAnimation,
|
|
355
389
|
setStartComponentsAnimation,
|
|
356
390
|
getAnimationValue,
|
|
@@ -372,9 +406,9 @@ export const AnimationView = ({
|
|
|
372
406
|
ref={animationComponentRef}
|
|
373
407
|
style={[
|
|
374
408
|
...preparedStyles,
|
|
375
|
-
additionalData.saveArea ? styles.flex : null,
|
|
376
409
|
(videoModalState.mode === "MAXIMIZED" ||
|
|
377
|
-
videoModalState.mode === "MINIMIZED"
|
|
410
|
+
videoModalState.mode === "MINIMIZED" ||
|
|
411
|
+
(videoModalState.mode === "PIP" && isAppActive)) &&
|
|
378
412
|
getAnimationStyle(animationType, animatedValue),
|
|
379
413
|
]}
|
|
380
414
|
>
|
|
@@ -412,6 +446,7 @@ export const AnimationComponent = (props: Props) => {
|
|
|
412
446
|
delete additionalData.extraAnimation[animationType];
|
|
413
447
|
|
|
414
448
|
return (
|
|
449
|
+
// @ts-ignore
|
|
415
450
|
<Component {...(isReactFragment ? null : props)}>
|
|
416
451
|
<AnimationComponent
|
|
417
452
|
{...animationProps}
|
|
@@ -2,11 +2,16 @@ import React, { useContext } from "react";
|
|
|
2
2
|
import { Animated } from "react-native";
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
useSafeAreaFrame,
|
|
6
5
|
useSafeAreaInsets,
|
|
6
|
+
useSafeAreaFrame,
|
|
7
7
|
} from "react-native-safe-area-context";
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
useGetBottomTabBarHeight,
|
|
10
|
+
useNavigation,
|
|
11
|
+
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
|
+
import { isLive } from "@applicaster/zapp-react-native-utils/playerUtils";
|
|
9
13
|
|
|
14
|
+
import { PROGRESS_BAR_HEIGHT } from "./utils";
|
|
10
15
|
import { useConfiguration } from "../utils";
|
|
11
16
|
|
|
12
17
|
export enum PlayerAnimationStateEnum {
|
|
@@ -39,6 +44,8 @@ export type ModalAnimationContextT = {
|
|
|
39
44
|
setLastSnap: (value: number) => void;
|
|
40
45
|
tabletLandscapePlayerTopPosition: number;
|
|
41
46
|
setTabletLandscapePlayerTopPosition: (value: number) => void;
|
|
47
|
+
startComponentsAnimationDistance: number;
|
|
48
|
+
progressBarHeight: number;
|
|
42
49
|
};
|
|
43
50
|
|
|
44
51
|
const ReactContext = React.createContext<ModalAnimationContextT>({
|
|
@@ -62,6 +69,8 @@ const ReactContext = React.createContext<ModalAnimationContextT>({
|
|
|
62
69
|
setLastSnap: () => null,
|
|
63
70
|
tabletLandscapePlayerTopPosition: 0,
|
|
64
71
|
setTabletLandscapePlayerTopPosition: () => null,
|
|
72
|
+
startComponentsAnimationDistance: 0,
|
|
73
|
+
progressBarHeight: 0,
|
|
65
74
|
});
|
|
66
75
|
|
|
67
76
|
export function useModalAnimationContext() {
|
|
@@ -80,6 +89,11 @@ const Provider = ({ children }: { children: React.ReactNode }) => {
|
|
|
80
89
|
const [startComponentsAnimation, setStartComponentsAnimation] =
|
|
81
90
|
React.useState<boolean>(false);
|
|
82
91
|
|
|
92
|
+
const {
|
|
93
|
+
videoModalState: { mode, visible, item },
|
|
94
|
+
} = useNavigation();
|
|
95
|
+
|
|
96
|
+
const isLiveItem = isLive(item);
|
|
83
97
|
const { minimised_height: minimisedHeight } = useConfiguration();
|
|
84
98
|
|
|
85
99
|
const resetPlayerAnimationState = React.useCallback(() => {
|
|
@@ -93,16 +107,28 @@ const Provider = ({ children }: { children: React.ReactNode }) => {
|
|
|
93
107
|
const translateYOffset = React.useRef(new Animated.Value(0)).current;
|
|
94
108
|
const dragVideoPlayerY = React.useRef(new Animated.Value(0)).current;
|
|
95
109
|
|
|
96
|
-
const { height } = useSafeAreaFrame();
|
|
110
|
+
const { height: safeAreaFrameHeight } = useSafeAreaFrame();
|
|
111
|
+
const [height, setHeight] = React.useState<number>(safeAreaFrameHeight);
|
|
112
|
+
const progressBarHeight = isLiveItem ? 0 : PROGRESS_BAR_HEIGHT;
|
|
97
113
|
const { bottom: bottomSafeArea } = useSafeAreaInsets();
|
|
98
114
|
const bottomTabBarHeight = useGetBottomTabBarHeight();
|
|
115
|
+
const startComponentsAnimationDistance = Math.round((height * 60) / 100);
|
|
116
|
+
|
|
117
|
+
React.useEffect(() => {
|
|
118
|
+
if (visible && mode === "MAXIMIZED" && height !== safeAreaFrameHeight) {
|
|
119
|
+
setHeight(safeAreaFrameHeight);
|
|
120
|
+
}
|
|
121
|
+
}, [height, safeAreaFrameHeight, mode, visible]);
|
|
99
122
|
|
|
100
123
|
/*
|
|
101
124
|
If bottomTabBarHeight is equal 0 it means an app does not use bottomTabBar.
|
|
102
125
|
Because of this we need to minus bottom SafeArea offset.
|
|
103
126
|
*/
|
|
104
127
|
const minValue =
|
|
105
|
-
height -
|
|
128
|
+
height -
|
|
129
|
+
minimisedHeight -
|
|
130
|
+
(bottomTabBarHeight || bottomSafeArea) -
|
|
131
|
+
progressBarHeight;
|
|
106
132
|
|
|
107
133
|
const modalSnapPoints = React.useMemo(() => [0, minValue], [minValue]);
|
|
108
134
|
// Last snap state which will helps us to make smooth responder to scrollview animation
|
|
@@ -134,6 +160,8 @@ const Provider = ({ children }: { children: React.ReactNode }) => {
|
|
|
134
160
|
setLastSnap,
|
|
135
161
|
tabletLandscapePlayerTopPosition,
|
|
136
162
|
setTabletLandscapePlayerTopPosition,
|
|
163
|
+
startComponentsAnimationDistance,
|
|
164
|
+
progressBarHeight,
|
|
137
165
|
}}
|
|
138
166
|
>
|
|
139
167
|
{children}
|
|
@@ -13,6 +13,7 @@ export enum ComponentAnimationType {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export const AUDIO_PLAYER_HORIZONTAL_PADDING = 15;
|
|
16
|
+
export const PROGRESS_BAR_HEIGHT = 3;
|
|
16
17
|
|
|
17
18
|
export const defaultAspectRatioWidth = (height: number): number =>
|
|
18
19
|
(height / 9) * 16;
|
|
@@ -233,7 +234,7 @@ export const gestureListenerHelper = (data) => {
|
|
|
233
234
|
animatedValue,
|
|
234
235
|
calculationData,
|
|
235
236
|
modalSnapPoint,
|
|
236
|
-
|
|
237
|
+
startComponentsAnimationDistance,
|
|
237
238
|
startComponentsAnimation,
|
|
238
239
|
setStartComponentsAnimation,
|
|
239
240
|
getAnimationValue,
|
|
@@ -243,7 +244,7 @@ export const gestureListenerHelper = (data) => {
|
|
|
243
244
|
if (listenerValue <= 0) {
|
|
244
245
|
if (
|
|
245
246
|
preparedValue >= 0 &&
|
|
246
|
-
preparedValue <= modalSnapPoint -
|
|
247
|
+
preparedValue <= modalSnapPoint - startComponentsAnimationDistance
|
|
247
248
|
) {
|
|
248
249
|
!startComponentsAnimation && setStartComponentsAnimation(true);
|
|
249
250
|
|
|
@@ -263,9 +264,11 @@ export const gestureListenerHelper = (data) => {
|
|
|
263
264
|
animatedValue.setValue(value);
|
|
264
265
|
}
|
|
265
266
|
} else {
|
|
266
|
-
if (preparedValue >=
|
|
267
|
+
if (preparedValue >= startComponentsAnimationDistance) {
|
|
267
268
|
!startComponentsAnimation && setStartComponentsAnimation(true);
|
|
268
|
-
const value = Math.round(
|
|
269
|
+
const value = Math.round(
|
|
270
|
+
preparedValue - startComponentsAnimationDistance
|
|
271
|
+
);
|
|
269
272
|
|
|
270
273
|
animatedValue.setValue(
|
|
271
274
|
calculateAnimationValue(animationType, value, calculationData)
|
|
@@ -42,12 +42,12 @@ export const PlayerDetails = ({
|
|
|
42
42
|
: {};
|
|
43
43
|
|
|
44
44
|
// Animation setup
|
|
45
|
-
const translateY = useRef(new Animated.Value(
|
|
45
|
+
const translateY = useRef(new Animated.Value(50)).current;
|
|
46
46
|
const opacity = useRef(new Animated.Value(0)).current;
|
|
47
47
|
|
|
48
48
|
const runAnimation = () => {
|
|
49
49
|
Animated.timing(translateY, {
|
|
50
|
-
toValue:
|
|
50
|
+
toValue: -30,
|
|
51
51
|
duration: 500,
|
|
52
52
|
easing: Easing.inOut(Easing.ease),
|
|
53
53
|
useNativeDriver: true,
|
|
@@ -63,7 +63,7 @@ export const PlayerDetails = ({
|
|
|
63
63
|
|
|
64
64
|
useEffect(() => {
|
|
65
65
|
if (isAudioPlayer) {
|
|
66
|
-
setTimeout(() => runAnimation(),
|
|
66
|
+
setTimeout(() => runAnimation(), 1500);
|
|
67
67
|
}
|
|
68
68
|
}, [isAudioPlayer]);
|
|
69
69
|
|
|
@@ -184,8 +184,8 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
184
184
|
const pathname = `${ROUTE_TYPES.VIDEO_MODAL}/${entry?.id}`;
|
|
185
185
|
|
|
186
186
|
return (
|
|
187
|
-
<
|
|
188
|
-
<
|
|
187
|
+
<PathnameContext.Provider value={pathname}>
|
|
188
|
+
<ScreenContextProvider pathname={pathname}>
|
|
189
189
|
<WrapperView
|
|
190
190
|
edges={getEdges(isTablet, isInlineModal) as readonly Edge[]}
|
|
191
191
|
style={[
|
|
@@ -197,10 +197,10 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
197
197
|
<AnimationComponent
|
|
198
198
|
animationType={ComponentAnimationType.moveUpComponent}
|
|
199
199
|
additionalData={{ saveArea: true }}
|
|
200
|
-
style={directionStyles(isTabletLandscape)}
|
|
200
|
+
style={[directionStyles(isTabletLandscape), defaultStyles.flex]}
|
|
201
201
|
>
|
|
202
|
-
<
|
|
203
|
-
<
|
|
202
|
+
<PathnameContext.Provider value={pathname}>
|
|
203
|
+
<ScreenContextProvider pathname={pathname}>
|
|
204
204
|
<View
|
|
205
205
|
testID={`${entry?.id}-player-container`}
|
|
206
206
|
style={[
|
|
@@ -225,7 +225,7 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
225
225
|
</AnimationComponent>
|
|
226
226
|
</View>
|
|
227
227
|
<AnimatedScrollModal>
|
|
228
|
-
{isInlineModal ? (
|
|
228
|
+
{isInlineModal && !docked ? (
|
|
229
229
|
<AnimationComponent
|
|
230
230
|
animationType={ComponentAnimationType.componentFade}
|
|
231
231
|
style={defaultStyles.flex}
|
|
@@ -241,11 +241,11 @@ export const PlayerWrapper = (props: Props) => {
|
|
|
241
241
|
<View style={defaultStyles.playerDetails} />
|
|
242
242
|
)}
|
|
243
243
|
</AnimatedScrollModal>
|
|
244
|
-
</
|
|
245
|
-
</
|
|
244
|
+
</ScreenContextProvider>
|
|
245
|
+
</PathnameContext.Provider>
|
|
246
246
|
</AnimationComponent>
|
|
247
247
|
</WrapperView>
|
|
248
|
-
</
|
|
249
|
-
</
|
|
248
|
+
</ScreenContextProvider>
|
|
249
|
+
</PathnameContext.Provider>
|
|
250
250
|
);
|
|
251
251
|
};
|
|
@@ -129,8 +129,8 @@ const VideoModalComponent = () => {
|
|
|
129
129
|
const pathname = `${ROUTE_TYPES.VIDEO_MODAL}/${item?.id}`;
|
|
130
130
|
|
|
131
131
|
return (
|
|
132
|
-
<
|
|
133
|
-
<
|
|
132
|
+
<PathnameContext.Provider value={pathname}>
|
|
133
|
+
<ScreenContextProvider pathname={pathname}>
|
|
134
134
|
{itemIdHooksFinished === item?.id ? (
|
|
135
135
|
<AnimatedPlayerModalWrapper
|
|
136
136
|
style={[
|
|
@@ -153,8 +153,8 @@ const VideoModalComponent = () => {
|
|
|
153
153
|
<Spinner />
|
|
154
154
|
</View>
|
|
155
155
|
)}
|
|
156
|
-
</
|
|
157
|
-
</
|
|
156
|
+
</ScreenContextProvider>
|
|
157
|
+
</PathnameContext.Provider>
|
|
158
158
|
);
|
|
159
159
|
};
|
|
160
160
|
|
|
@@ -42,9 +42,14 @@ exports[`PlayerWrapper renders inline 1`] = `
|
|
|
42
42
|
}
|
|
43
43
|
animationType="moveUpComponent"
|
|
44
44
|
style={
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
Array [
|
|
46
|
+
Object {
|
|
47
|
+
"flexDirection": "column",
|
|
48
|
+
},
|
|
49
|
+
Object {
|
|
50
|
+
"flex": 1,
|
|
51
|
+
},
|
|
52
|
+
]
|
|
48
53
|
}
|
|
49
54
|
>
|
|
50
55
|
<View
|
|
@@ -67,12 +72,34 @@ exports[`PlayerWrapper renders inline 1`] = `
|
|
|
67
72
|
testID="test-player-container"
|
|
68
73
|
/>
|
|
69
74
|
<View
|
|
75
|
+
animationType="componentFade"
|
|
70
76
|
style={
|
|
71
77
|
Object {
|
|
72
78
|
"flex": 1,
|
|
73
79
|
}
|
|
74
80
|
}
|
|
75
|
-
|
|
81
|
+
>
|
|
82
|
+
<View
|
|
83
|
+
configuration={
|
|
84
|
+
Object {
|
|
85
|
+
"tablet_landscape_player_container_background_color": "red",
|
|
86
|
+
"tablet_landscape_sidebar_width": "35%",
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
entry={
|
|
90
|
+
Object {
|
|
91
|
+
"id": "test",
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
isTabletLandscape={false}
|
|
95
|
+
style={
|
|
96
|
+
Object {
|
|
97
|
+
"flex": 1,
|
|
98
|
+
"paddingTop": 20,
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/>
|
|
102
|
+
</View>
|
|
76
103
|
</View>
|
|
77
104
|
</RNCSafeAreaView>
|
|
78
105
|
</RNCSafeAreaProvider>
|
|
@@ -120,9 +147,14 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
|
|
|
120
147
|
}
|
|
121
148
|
animationType="moveUpComponent"
|
|
122
149
|
style={
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
150
|
+
Array [
|
|
151
|
+
Object {
|
|
152
|
+
"flexDirection": "column",
|
|
153
|
+
},
|
|
154
|
+
Object {
|
|
155
|
+
"flex": 1,
|
|
156
|
+
},
|
|
157
|
+
]
|
|
126
158
|
}
|
|
127
159
|
>
|
|
128
160
|
<View
|
|
@@ -148,6 +180,7 @@ exports[`PlayerWrapper renders inline and docked 1`] = `
|
|
|
148
180
|
style={
|
|
149
181
|
Object {
|
|
150
182
|
"flex": 1,
|
|
183
|
+
"paddingTop": 20,
|
|
151
184
|
}
|
|
152
185
|
}
|
|
153
186
|
/>
|
|
@@ -198,9 +231,14 @@ exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
|
|
|
198
231
|
}
|
|
199
232
|
animationType="moveUpComponent"
|
|
200
233
|
style={
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
234
|
+
Array [
|
|
235
|
+
Object {
|
|
236
|
+
"flexDirection": "row",
|
|
237
|
+
},
|
|
238
|
+
Object {
|
|
239
|
+
"flex": 1,
|
|
240
|
+
},
|
|
241
|
+
]
|
|
204
242
|
}
|
|
205
243
|
>
|
|
206
244
|
<View
|
|
@@ -239,12 +277,34 @@ exports[`PlayerWrapper renders inline on tablet in landscape orientation 1`] = `
|
|
|
239
277
|
/>
|
|
240
278
|
</View>
|
|
241
279
|
<View
|
|
280
|
+
animationType="componentFade"
|
|
242
281
|
style={
|
|
243
282
|
Object {
|
|
244
283
|
"flex": 1,
|
|
245
284
|
}
|
|
246
285
|
}
|
|
247
|
-
|
|
286
|
+
>
|
|
287
|
+
<View
|
|
288
|
+
configuration={
|
|
289
|
+
Object {
|
|
290
|
+
"tablet_landscape_player_container_background_color": "red",
|
|
291
|
+
"tablet_landscape_sidebar_width": "35%",
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
entry={
|
|
295
|
+
Object {
|
|
296
|
+
"id": "test",
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
isTabletLandscape={true}
|
|
300
|
+
style={
|
|
301
|
+
Object {
|
|
302
|
+
"flex": 1,
|
|
303
|
+
"paddingTop": 20,
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
/>
|
|
307
|
+
</View>
|
|
248
308
|
</View>
|
|
249
309
|
</RNCSafeAreaView>
|
|
250
310
|
</RNCSafeAreaProvider>
|
|
@@ -292,9 +352,14 @@ exports[`PlayerWrapper renders properly 1`] = `
|
|
|
292
352
|
}
|
|
293
353
|
animationType="moveUpComponent"
|
|
294
354
|
style={
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
355
|
+
Array [
|
|
356
|
+
Object {
|
|
357
|
+
"flexDirection": "column",
|
|
358
|
+
},
|
|
359
|
+
Object {
|
|
360
|
+
"flex": 1,
|
|
361
|
+
},
|
|
362
|
+
]
|
|
298
363
|
}
|
|
299
364
|
>
|
|
300
365
|
<View
|
|
@@ -320,6 +385,7 @@ exports[`PlayerWrapper renders properly 1`] = `
|
|
|
320
385
|
style={
|
|
321
386
|
Object {
|
|
322
387
|
"flex": 1,
|
|
388
|
+
"paddingTop": 20,
|
|
323
389
|
}
|
|
324
390
|
}
|
|
325
391
|
/>
|