@applicaster/zapp-react-native-ui-components 12.0.0-alpha.4342066143 → 12.0.0-alpha.4354608902
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 +3 -3
- package/Components/Cell/Cell.tsx +14 -13
- package/Components/Cell/CellWithFocusable.tsx +24 -10
- package/Components/Cell/TvOSCellComponent.tsx +6 -11
- package/Components/Focusable/Focusable.tsx +6 -1
- package/Components/FocusableGroup/index.tsx +11 -2
- package/Components/HandlePlayable/HandlePlayable.tsx +3 -0
- package/Components/Layout/TV/ScreenContainer.tsx +79 -5
- package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +2 -2
- 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__/__snapshots__/index.test.tsx.snap +10 -50
- package/Components/Layout/TV/__tests__/index.test.tsx +20 -75
- package/Components/Layout/TV/index.tsx +11 -67
- package/Components/Layout/TV/index.web.tsx +33 -0
- package/Components/Layout/index.tsx +15 -11
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +7 -2
- package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +20 -0
- package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +10 -2
- package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
- package/Components/MasterCell/utils/index.ts +17 -30
- package/Components/NativeFocusables/{index.js → index.ts} +4 -2
- package/Components/Navigator/StackNavigator.tsx +57 -0
- package/Components/Navigator/index.ts +1 -0
- package/Components/PlayerContainer/PlayerContainer.tsx +5 -1
- package/Components/River/TV/River.tsx +0 -23
- package/Components/Screen/TV/hooks/index.ts +3 -0
- package/Components/Screen/TV/hooks/useInitialFocus.ts +70 -0
- package/Components/Screen/TV/hooks/useRestoreFocus.ts +22 -0
- package/Components/Screen/TV/index.web.tsx +165 -0
- package/Components/Screen/__tests__/Screen.test.tsx +3 -0
- package/Components/Screen/index.tsx +55 -58
- package/Components/Screen/navigationHandler.ts +5 -0
- package/Components/ScreenResolver/index.tsx +3 -1
- package/Components/Transitioner/Scene.tsx +12 -11
- package/Components/Transitioner/Transitioner.tsx +15 -29
- package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +8 -4
- package/Components/VideoLive/LiveImageManager.ts +25 -1
- package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +2 -14
- package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +56 -43
- package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +42 -32
- package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +104 -86
- package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +32 -4
- package/Components/VideoModal/ModalAnimation/utils.ts +7 -4
- package/Components/VideoModal/PlayerWrapper.tsx +10 -10
- package/Components/VideoModal/VideoModal.tsx +4 -4
- package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +32 -12
- package/Components/VideoModal/hooks/useModalSize.ts +10 -12
- package/Components/VideoModal/utils.ts +5 -2
- 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/Contexts/ZappPipesContext/ZappPipesEntryContext.ts +1 -1
- package/Decorators/Analytics/{index.js → index.tsx} +11 -11
- package/README.md +1 -13
- package/package.json +5 -5
- package/Components/Layout/TV/TransitionOverlay.tsx +0 -64
- 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
|
@@ -10,7 +10,11 @@ import { Component } from "react";
|
|
|
10
10
|
|
|
11
11
|
const { log_debug, log_info, log_error } = loggerLiveImageManager;
|
|
12
12
|
|
|
13
|
-
export type LiveImageManagerEvent =
|
|
13
|
+
export type LiveImageManagerEvent =
|
|
14
|
+
| "onEnd"
|
|
15
|
+
| "onStart"
|
|
16
|
+
| "onError"
|
|
17
|
+
| "onDestroy";
|
|
14
18
|
|
|
15
19
|
export type LiveImageManagerListenerData = {
|
|
16
20
|
id: string;
|
|
@@ -102,6 +106,16 @@ export class LiveImageManager implements PlayerLifecycleListener {
|
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
this.items = this.items.filter((i) => i !== item);
|
|
109
|
+
|
|
110
|
+
this.invokeListenersUpdate({
|
|
111
|
+
callbackName: "onDestroy",
|
|
112
|
+
event: {
|
|
113
|
+
item,
|
|
114
|
+
playerId: this.currentlyPlaying?.playerId,
|
|
115
|
+
primaryPlayerId: this.primaryPlayer?.playerId,
|
|
116
|
+
entry: item.getPlayer().getEntry(),
|
|
117
|
+
},
|
|
118
|
+
});
|
|
105
119
|
};
|
|
106
120
|
|
|
107
121
|
public onViewportEnter = (item: LiveImage) => {
|
|
@@ -511,6 +525,16 @@ export class LiveImage implements QuickBrickPlayer.SharedPlayerCallBacks {
|
|
|
511
525
|
LiveImageManager.instance.onLiveImageError(this, error);
|
|
512
526
|
};
|
|
513
527
|
|
|
528
|
+
onVideoError = (error: Error) => {
|
|
529
|
+
log_error(
|
|
530
|
+
`onVideoError: live-image, fail to play, switching back to image. error: ${
|
|
531
|
+
error?.message
|
|
532
|
+
}, ${playerInfo(this.player)}`
|
|
533
|
+
);
|
|
534
|
+
|
|
535
|
+
LiveImageManager.instance.onLiveImageError(this, error);
|
|
536
|
+
};
|
|
537
|
+
|
|
514
538
|
onVideoEnd = (_event) => {
|
|
515
539
|
log_info(
|
|
516
540
|
`onVideoEnd: live-image, video completed, switching back to image, ${playerInfo(
|
|
@@ -5,7 +5,6 @@ import {
|
|
|
5
5
|
useModalAnimationContext,
|
|
6
6
|
PlayerAnimationStateEnum,
|
|
7
7
|
} from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
|
|
8
|
-
import { useDimensions } from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
9
8
|
|
|
10
9
|
type Props = {
|
|
11
10
|
style: ViewStyle[];
|
|
@@ -18,13 +17,8 @@ export const AnimatedPlayerModalWrapper = (props: Props) => {
|
|
|
18
17
|
animatedValues: { lastScrollY, dragScrollY, translateYOffset },
|
|
19
18
|
modalSnapPoints,
|
|
20
19
|
setStartComponentsAnimation,
|
|
21
|
-
lastScrollYValue,
|
|
22
20
|
} = useModalAnimationContext();
|
|
23
21
|
|
|
24
|
-
const { height: screenHeight } = useDimensions("screen", {
|
|
25
|
-
deviceInfo: true,
|
|
26
|
-
});
|
|
27
|
-
|
|
28
22
|
const interpolateConfig: Animated.InterpolationConfigType = React.useMemo(
|
|
29
23
|
() => ({
|
|
30
24
|
inputRange: modalSnapPoints,
|
|
@@ -51,16 +45,10 @@ export const AnimatedPlayerModalWrapper = (props: Props) => {
|
|
|
51
45
|
}
|
|
52
46
|
|
|
53
47
|
React.useEffect(() => {
|
|
54
|
-
const translateYListener = translateY.addListener((
|
|
55
|
-
const preparedValue = Math.round(
|
|
56
|
-
Math.abs(value) - lastScrollYValue.current
|
|
57
|
-
);
|
|
58
|
-
|
|
48
|
+
const translateYListener = translateY.addListener(() => {
|
|
59
49
|
(playerAnimationState === PlayerAnimationStateEnum.minimize ||
|
|
60
50
|
playerAnimationState === PlayerAnimationStateEnum.maximaze) &&
|
|
61
|
-
setStartComponentsAnimation(
|
|
62
|
-
preparedValue >= Math.round((screenHeight * 10) / 100)
|
|
63
|
-
);
|
|
51
|
+
setStartComponentsAnimation(true);
|
|
64
52
|
});
|
|
65
53
|
|
|
66
54
|
return () => {
|
|
@@ -58,6 +58,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
58
58
|
modalSnapPoints,
|
|
59
59
|
lastSnap,
|
|
60
60
|
setLastSnap,
|
|
61
|
+
setStartComponentsAnimation,
|
|
61
62
|
} = useModalAnimationContext();
|
|
62
63
|
|
|
63
64
|
const { isLanguageOverlayVisible } = React.useContext(PlayerContainerContext);
|
|
@@ -100,58 +101,68 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
100
101
|
{ useNativeDriver: true }
|
|
101
102
|
);
|
|
102
103
|
|
|
103
|
-
const onHandlerStateChange = (
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
const onHandlerStateChange = React.useCallback(
|
|
105
|
+
({ nativeEvent }) => {
|
|
106
|
+
if (
|
|
107
|
+
nativeEvent.oldState === State.ACTIVE &&
|
|
108
|
+
scrollPosition.current === 0
|
|
109
|
+
) {
|
|
110
|
+
// eslint-disable-next-line prefer-const
|
|
111
|
+
const { velocityY, translationY } = nativeEvent;
|
|
112
|
+
const dragToss = 0.05;
|
|
108
113
|
|
|
109
|
-
|
|
110
|
-
|
|
114
|
+
const preparedTranslationY =
|
|
115
|
+
Math.abs(translationY) - lastScrollYValue.current;
|
|
111
116
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
if (videoModalState.mode === "MAXIMIZED") {
|
|
118
|
+
const endOffsetY =
|
|
119
|
+
lastSnap + preparedTranslationY + dragToss * velocityY + 150;
|
|
115
120
|
|
|
116
|
-
|
|
121
|
+
let destSnapPoint = modalSnapPoints[0];
|
|
117
122
|
|
|
118
|
-
|
|
119
|
-
|
|
123
|
+
for (const snapPoint of modalSnapPoints) {
|
|
124
|
+
const distFromSnap = Math.abs(snapPoint - endOffsetY);
|
|
120
125
|
|
|
121
|
-
|
|
122
|
-
|
|
126
|
+
if (distFromSnap < Math.abs(destSnapPoint - endOffsetY)) {
|
|
127
|
+
destSnapPoint = snapPoint;
|
|
128
|
+
}
|
|
123
129
|
}
|
|
124
|
-
}
|
|
125
130
|
|
|
126
|
-
|
|
131
|
+
setLastSnap(destSnapPoint);
|
|
127
132
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
+
if (destSnapPoint === modalSnapPoints[0]) {
|
|
134
|
+
translateYOffset.extractOffset();
|
|
135
|
+
translateYOffset.setValue(preparedTranslationY);
|
|
136
|
+
translateYOffset.flattenOffset();
|
|
137
|
+
dragScrollY.setValue(0);
|
|
133
138
|
|
|
134
|
-
|
|
139
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
140
|
+
} else {
|
|
141
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
|
|
142
|
+
}
|
|
135
143
|
} else {
|
|
136
|
-
|
|
144
|
+
if (translationY < 0) {
|
|
145
|
+
// from mini to full
|
|
146
|
+
setLastSnap(modalSnapPoints[0]);
|
|
147
|
+
|
|
148
|
+
translateYOffset.setValue(
|
|
149
|
+
modalSnapPoints[1] - preparedTranslationY
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
dragScrollY.setValue(0);
|
|
153
|
+
|
|
154
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
155
|
+
} else {
|
|
156
|
+
resetPlayerAnimationState();
|
|
157
|
+
}
|
|
137
158
|
}
|
|
138
159
|
} else {
|
|
139
|
-
|
|
140
|
-
// from mini to full
|
|
141
|
-
setLastSnap(modalSnapPoints[0]);
|
|
142
|
-
translateYOffset.setValue(modalSnapPoints[1] - preparedTranslationY);
|
|
143
|
-
dragScrollY.setValue(0);
|
|
144
|
-
|
|
145
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
146
|
-
} else {
|
|
160
|
+
playerAnimationState === PlayerAnimationStateEnum.drag_scroll &&
|
|
147
161
|
resetPlayerAnimationState();
|
|
148
|
-
}
|
|
149
162
|
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
}
|
|
154
|
-
};
|
|
163
|
+
},
|
|
164
|
+
[lastSnap, modalSnapPoints, playerAnimationState, videoModalState.mode]
|
|
165
|
+
);
|
|
155
166
|
|
|
156
167
|
const onScroll = React.useCallback(({ nativeEvent }) => {
|
|
157
168
|
scrollPosition.current = nativeEvent.contentOffset.y;
|
|
@@ -194,7 +205,8 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
194
205
|
|
|
195
206
|
if (
|
|
196
207
|
(videoModalState.mode === "MAXIMIZED" &&
|
|
197
|
-
videoModalState.previousMode === "
|
|
208
|
+
videoModalState.previousMode === "MINIMIZED" &&
|
|
209
|
+
previousItemId === videoModalState.item?.id) ||
|
|
198
210
|
previousItemId !== videoModalState.item?.id
|
|
199
211
|
) {
|
|
200
212
|
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
@@ -271,10 +283,11 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
271
283
|
if (
|
|
272
284
|
preparedValue > 0 &&
|
|
273
285
|
scrollPosition.current === 0 &&
|
|
274
|
-
playerAnimationState !== PlayerAnimationStateEnum.drag_player
|
|
286
|
+
playerAnimationState !== PlayerAnimationStateEnum.drag_player &&
|
|
287
|
+
playerAnimationState !== PlayerAnimationStateEnum.drag_scroll
|
|
275
288
|
) {
|
|
276
|
-
|
|
277
|
-
|
|
289
|
+
isMinimizedModal && setStartComponentsAnimation(true);
|
|
290
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.drag_scroll);
|
|
278
291
|
}
|
|
279
292
|
});
|
|
280
293
|
|
|
@@ -282,7 +295,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
282
295
|
lastScrollY.removeListener(lastScrollYListenerId);
|
|
283
296
|
dragScrollY.removeListener(dragListenerId);
|
|
284
297
|
};
|
|
285
|
-
}, [playerAnimationState, isAudioItem, modalSnapPoints]);
|
|
298
|
+
}, [playerAnimationState, isAudioItem, modalSnapPoints, isMinimizedModal]);
|
|
286
299
|
|
|
287
300
|
const Wrapper = React.useMemo(
|
|
288
301
|
() => (Platform.OS === "android" ? GestureHandlerRootView : View),
|
|
@@ -34,6 +34,7 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
34
34
|
lastSnap,
|
|
35
35
|
setLastSnap,
|
|
36
36
|
resetPlayerAnimationState,
|
|
37
|
+
setStartComponentsAnimation,
|
|
37
38
|
} = useModalAnimationContext();
|
|
38
39
|
|
|
39
40
|
const { videoModalState } = useNavigation();
|
|
@@ -50,50 +51,57 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
50
51
|
{ useNativeDriver: true }
|
|
51
52
|
);
|
|
52
53
|
|
|
53
|
-
const onHandlerStateChange = (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
const onHandlerStateChange = React.useCallback(
|
|
55
|
+
({ nativeEvent }) => {
|
|
56
|
+
if (nativeEvent.oldState === State.ACTIVE) {
|
|
57
|
+
// eslint-disable-next-line prefer-const
|
|
58
|
+
const { velocityY, translationY } = nativeEvent;
|
|
59
|
+
const preparedTranslationY = Math.abs(translationY);
|
|
60
|
+
const dragToss = 0.05;
|
|
59
61
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
if (videoModalState.mode === "MAXIMIZED") {
|
|
63
|
+
if (translationY > 0) {
|
|
64
|
+
const endOffsetY =
|
|
65
|
+
lastSnap + preparedTranslationY + dragToss * velocityY + 200;
|
|
64
66
|
|
|
65
|
-
|
|
67
|
+
let destSnapPoint = modalSnapPoints[0];
|
|
66
68
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
for (const snapPoint of modalSnapPoints) {
|
|
70
|
+
const distFromSnap = Math.abs(snapPoint - endOffsetY);
|
|
69
71
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
if (distFromSnap < Math.abs(destSnapPoint - endOffsetY)) {
|
|
73
|
+
destSnapPoint = snapPoint;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
setLastSnap(destSnapPoint);
|
|
78
|
+
|
|
79
|
+
if (destSnapPoint === modalSnapPoints[0]) {
|
|
80
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
81
|
+
} else {
|
|
82
|
+
lastScrollY.setValue(0);
|
|
83
|
+
lastScrollYValue.current = 0;
|
|
84
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
|
|
72
85
|
}
|
|
73
86
|
}
|
|
87
|
+
} else if (videoModalState.mode === "MINIMIZED") {
|
|
88
|
+
if (translationY < 0) {
|
|
89
|
+
// from mini to full
|
|
90
|
+
setLastSnap(modalSnapPoints[0]);
|
|
74
91
|
|
|
75
|
-
|
|
92
|
+
translateYOffset.setValue(
|
|
93
|
+
modalSnapPoints[1] - preparedTranslationY
|
|
94
|
+
);
|
|
76
95
|
|
|
77
|
-
if (destSnapPoint === modalSnapPoints[0]) {
|
|
78
96
|
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
79
97
|
} else {
|
|
80
|
-
|
|
81
|
-
lastScrollYValue.current = 0;
|
|
82
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
|
|
98
|
+
resetPlayerAnimationState();
|
|
83
99
|
}
|
|
84
100
|
}
|
|
85
|
-
} else if (videoModalState.mode === "MINIMIZED") {
|
|
86
|
-
if (translationY < 0) {
|
|
87
|
-
// from mini to full
|
|
88
|
-
setLastSnap(modalSnapPoints[0]);
|
|
89
|
-
translateYOffset.setValue(modalSnapPoints[1] - preparedTranslationY);
|
|
90
|
-
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
91
|
-
} else {
|
|
92
|
-
resetPlayerAnimationState();
|
|
93
|
-
}
|
|
94
101
|
}
|
|
95
|
-
}
|
|
96
|
-
|
|
102
|
+
},
|
|
103
|
+
[lastSnap, modalSnapPoints, videoModalState.mode]
|
|
104
|
+
);
|
|
97
105
|
|
|
98
106
|
React.useEffect(() => {
|
|
99
107
|
const dragVideoPlayerYListenerId = dragVideoPlayerY.addListener(
|
|
@@ -114,8 +122,10 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
114
122
|
preparedValue > 0 &&
|
|
115
123
|
playerAnimationState !== PlayerAnimationStateEnum.drag_scroll
|
|
116
124
|
) {
|
|
117
|
-
playerAnimationState !== PlayerAnimationStateEnum.drag_player
|
|
125
|
+
if (playerAnimationState !== PlayerAnimationStateEnum.drag_player) {
|
|
126
|
+
isMinimizedModal && setStartComponentsAnimation(true);
|
|
118
127
|
setPlayerAnimationState(PlayerAnimationStateEnum.drag_player);
|
|
128
|
+
}
|
|
119
129
|
|
|
120
130
|
translateYOffset.setValue(
|
|
121
131
|
isMaximazedModal
|
|
@@ -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,90 @@ 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
|
+
|
|
295
312
|
React.useEffect(() => {
|
|
296
313
|
if (
|
|
297
314
|
playerAnimationState === PlayerAnimationStateEnum.minimize &&
|
|
@@ -325,7 +342,7 @@ export const AnimationView = ({
|
|
|
325
342
|
animatedValue,
|
|
326
343
|
calculationData,
|
|
327
344
|
modalSnapPoint: modalSnapPoints[1],
|
|
328
|
-
|
|
345
|
+
startComponentsAnimationDistance,
|
|
329
346
|
startComponentsAnimation,
|
|
330
347
|
setStartComponentsAnimation,
|
|
331
348
|
getAnimationValue,
|
|
@@ -350,7 +367,7 @@ export const AnimationView = ({
|
|
|
350
367
|
animatedValue,
|
|
351
368
|
calculationData,
|
|
352
369
|
modalSnapPoint: modalSnapPoints[1],
|
|
353
|
-
|
|
370
|
+
startComponentsAnimationDistance,
|
|
354
371
|
startComponentsAnimation,
|
|
355
372
|
setStartComponentsAnimation,
|
|
356
373
|
getAnimationValue,
|
|
@@ -372,9 +389,9 @@ export const AnimationView = ({
|
|
|
372
389
|
ref={animationComponentRef}
|
|
373
390
|
style={[
|
|
374
391
|
...preparedStyles,
|
|
375
|
-
additionalData.saveArea ? styles.flex : null,
|
|
376
392
|
(videoModalState.mode === "MAXIMIZED" ||
|
|
377
|
-
videoModalState.mode === "MINIMIZED"
|
|
393
|
+
videoModalState.mode === "MINIMIZED" ||
|
|
394
|
+
(videoModalState.mode === "PIP" && isAppActive)) &&
|
|
378
395
|
getAnimationStyle(animationType, animatedValue),
|
|
379
396
|
]}
|
|
380
397
|
>
|
|
@@ -412,6 +429,7 @@ export const AnimationComponent = (props: Props) => {
|
|
|
412
429
|
delete additionalData.extraAnimation[animationType];
|
|
413
430
|
|
|
414
431
|
return (
|
|
432
|
+
// @ts-ignore
|
|
415
433
|
<Component {...(isReactFragment ? null : props)}>
|
|
416
434
|
<AnimationComponent
|
|
417
435
|
{...animationProps}
|