@applicaster/zapp-react-native-ui-components 12.0.0-alpha.9233494544 → 12.0.0-alpha.9241554284
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 +30 -13
- 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/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__/__snapshots__/index.test.tsx.snap +10 -50
- package/Components/Layout/TV/__tests__/index.test.tsx +20 -75
- package/Components/Layout/TV/index.tsx +29 -181
- package/Components/Layout/TV/index.web.tsx +33 -0
- package/Components/Layout/index.tsx +15 -11
- package/Components/MasterCell/DefaultComponents/ActionButton.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +86 -116
- package/Components/MasterCell/DefaultComponents/DynamicBadge.tsx +4 -2
- package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
- package/Components/MasterCell/DefaultComponents/ImageBorderContainer/index.ts +57 -0
- package/Components/MasterCell/DefaultComponents/ImageContainer/index.tsx +5 -1
- package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +20 -0
- package/Components/MasterCell/DefaultComponents/Text/index.tsx +14 -2
- package/Components/MasterCell/DefaultComponents/__tests__/text.test.tsx +24 -9
- package/Components/MasterCell/DefaultComponents/index.ts +2 -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/SharedUI/CollapsibleTextContainer/index.ts +1 -3
- package/Components/MasterCell/SharedUI/ProgressBar/hooks/useFillInPercent.ts +7 -1
- package/Components/MasterCell/dataAdapter.ts +21 -7
- package/Components/MasterCell/hooks/useAsyncRendering/index.ts +1 -1
- 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/MeasurmentsPortal/BasicMeasurementsPortal.tsx +11 -7
- package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +10 -1
- package/Components/Navigator/StackNavigator.tsx +57 -0
- package/Components/Navigator/index.ts +1 -0
- package/Components/PlayerContainer/PlayerContainer.tsx +3 -0
- package/Components/River/ComponentsMap/ComponentsMap.tsx +24 -17
- package/Components/River/RefreshControl.tsx +55 -1
- package/Components/River/TV/River.tsx +0 -22
- package/Components/RouteManager/index.tsx +2 -2
- 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 +40 -44
- package/Components/Screen/__tests__/Screen.test.tsx +3 -49
- package/Components/Screen/index.tsx +55 -76
- package/Components/Screen/navigationHandler.ts +5 -0
- 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 +40 -26
- package/Components/Transitioner/Transitioner.tsx +46 -48
- package/Components/Transitioner/__tests__/Scene.test.js +7 -0
- package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +12 -4
- package/Components/Transitioner/__tests__/__snapshots__/transitioner.test.js.snap +2 -0
- package/Components/VideoLive/LiveImageManager.ts +28 -1
- 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 +44 -5
- package/Components/VideoModal/ModalAnimation/utils.ts +7 -4
- package/Components/VideoModal/PlayerDetails.tsx +3 -3
- package/Components/VideoModal/PlayerWrapper.tsx +67 -60
- package/Components/VideoModal/VideoModal.tsx +17 -17
- package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +7 -0
- 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/Viewport/ViewportTracker/ViewportTracker.tsx +31 -40
- 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/ScreenContext/index.tsx +2 -2
- package/Contexts/ScreenDataContext/index.tsx +20 -0
- package/events/index.ts +1 -0
- package/package.json +5 -5
- package/Components/Layout/TV/TransitionOverlay.tsx +0 -64
- /package/Components/FocusableGroup/{index.android.js → index.android.ts} +0 -0
- /package/Components/FocusableGroup/{index.ios.js → index.ios.ts} +0 -0
|
@@ -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;
|
|
@@ -189,12 +200,29 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
189
200
|
videoModalState.mode === "MINIMIZED" &&
|
|
190
201
|
videoModalState.previousMode === "MAXIMIZED"
|
|
191
202
|
) {
|
|
192
|
-
|
|
203
|
+
// set animation to the minimize values if moving from the player to another screen
|
|
204
|
+
if (playerAnimationState === null) {
|
|
205
|
+
setScrollModalAnimatedValue(
|
|
206
|
+
translateYOffset,
|
|
207
|
+
modalSnapPoints[1],
|
|
208
|
+
setLastSnap
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
resetScrollAnimatedValues(
|
|
212
|
+
lastScrollY,
|
|
213
|
+
lastScrollYValue,
|
|
214
|
+
dragScrollY,
|
|
215
|
+
dragVideoPlayerY
|
|
216
|
+
);
|
|
217
|
+
} else {
|
|
218
|
+
resetPlayerAnimationState();
|
|
219
|
+
}
|
|
193
220
|
}
|
|
194
221
|
|
|
195
222
|
if (
|
|
196
223
|
(videoModalState.mode === "MAXIMIZED" &&
|
|
197
|
-
videoModalState.previousMode === "
|
|
224
|
+
videoModalState.previousMode === "MINIMIZED" &&
|
|
225
|
+
previousItemId === videoModalState.item?.id) ||
|
|
198
226
|
previousItemId !== videoModalState.item?.id
|
|
199
227
|
) {
|
|
200
228
|
setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
|
|
@@ -271,10 +299,11 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
271
299
|
if (
|
|
272
300
|
preparedValue > 0 &&
|
|
273
301
|
scrollPosition.current === 0 &&
|
|
274
|
-
playerAnimationState !== PlayerAnimationStateEnum.drag_player
|
|
302
|
+
playerAnimationState !== PlayerAnimationStateEnum.drag_player &&
|
|
303
|
+
playerAnimationState !== PlayerAnimationStateEnum.drag_scroll
|
|
275
304
|
) {
|
|
276
|
-
|
|
277
|
-
|
|
305
|
+
isMinimizedModal && setStartComponentsAnimation(true);
|
|
306
|
+
setPlayerAnimationState(PlayerAnimationStateEnum.drag_scroll);
|
|
278
307
|
}
|
|
279
308
|
});
|
|
280
309
|
|
|
@@ -282,7 +311,7 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
282
311
|
lastScrollY.removeListener(lastScrollYListenerId);
|
|
283
312
|
dragScrollY.removeListener(dragListenerId);
|
|
284
313
|
};
|
|
285
|
-
}, [playerAnimationState, isAudioItem, modalSnapPoints]);
|
|
314
|
+
}, [playerAnimationState, isAudioItem, modalSnapPoints, isMinimizedModal]);
|
|
286
315
|
|
|
287
316
|
const Wrapper = React.useMemo(
|
|
288
317
|
() => (Platform.OS === "android" ? GestureHandlerRootView : View),
|
|
@@ -336,7 +365,12 @@ export const AnimatedScrollModalComponent = ({ children }: Props) => {
|
|
|
336
365
|
};
|
|
337
366
|
|
|
338
367
|
export const AnimatedScrollModal = ({ children }: Props) => {
|
|
339
|
-
const
|
|
368
|
+
const {
|
|
369
|
+
videoModalState: { visible },
|
|
370
|
+
} = useNavigation();
|
|
371
|
+
|
|
372
|
+
const Component =
|
|
373
|
+
!isTV() && visible ? AnimatedScrollModalComponent : React.Fragment;
|
|
340
374
|
|
|
341
375
|
return <Component>{children}</Component>;
|
|
342
376
|
};
|
|
@@ -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
|
|
@@ -145,7 +155,11 @@ export const AnimatedVideoPlayer = ({ children }: Props) => {
|
|
|
145
155
|
};
|
|
146
156
|
|
|
147
157
|
export const AnimatedVideoPlayerComponent = ({ children }: Props) => {
|
|
148
|
-
const
|
|
158
|
+
const {
|
|
159
|
+
videoModalState: { visible },
|
|
160
|
+
} = useNavigation();
|
|
161
|
+
|
|
162
|
+
const Component = !isTV() && visible ? AnimatedVideoPlayer : React.Fragment;
|
|
149
163
|
|
|
150
164
|
return <Component>{children}</Component>;
|
|
151
165
|
};
|
|
@@ -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}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
1
|
import React, { useContext } from "react";
|
|
2
2
|
import { Animated } from "react-native";
|
|
3
3
|
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
import {
|
|
5
|
+
useSafeAreaInsets,
|
|
6
|
+
useSafeAreaFrame,
|
|
7
|
+
} from "react-native-safe-area-context";
|
|
8
|
+
import {
|
|
9
|
+
useGetBottomTabBarHeight,
|
|
10
|
+
useNavigation,
|
|
11
|
+
} from "@applicaster/zapp-react-native-utils/reactHooks";
|
|
12
|
+
import { isLive } from "@applicaster/zapp-react-native-utils/playerUtils";
|
|
13
|
+
|
|
14
|
+
import { PROGRESS_BAR_HEIGHT } from "./utils";
|
|
7
15
|
import { useConfiguration } from "../utils";
|
|
8
16
|
|
|
9
17
|
export enum PlayerAnimationStateEnum {
|
|
@@ -36,6 +44,8 @@ export type ModalAnimationContextT = {
|
|
|
36
44
|
setLastSnap: (value: number) => void;
|
|
37
45
|
tabletLandscapePlayerTopPosition: number;
|
|
38
46
|
setTabletLandscapePlayerTopPosition: (value: number) => void;
|
|
47
|
+
startComponentsAnimationDistance: number;
|
|
48
|
+
progressBarHeight: number;
|
|
39
49
|
};
|
|
40
50
|
|
|
41
51
|
const ReactContext = React.createContext<ModalAnimationContextT>({
|
|
@@ -59,6 +69,8 @@ const ReactContext = React.createContext<ModalAnimationContextT>({
|
|
|
59
69
|
setLastSnap: () => null,
|
|
60
70
|
tabletLandscapePlayerTopPosition: 0,
|
|
61
71
|
setTabletLandscapePlayerTopPosition: () => null,
|
|
72
|
+
startComponentsAnimationDistance: 0,
|
|
73
|
+
progressBarHeight: 0,
|
|
62
74
|
});
|
|
63
75
|
|
|
64
76
|
export function useModalAnimationContext() {
|
|
@@ -77,6 +89,11 @@ const Provider = ({ children }: { children: React.ReactNode }) => {
|
|
|
77
89
|
const [startComponentsAnimation, setStartComponentsAnimation] =
|
|
78
90
|
React.useState<boolean>(false);
|
|
79
91
|
|
|
92
|
+
const {
|
|
93
|
+
videoModalState: { mode, visible, item },
|
|
94
|
+
} = useNavigation();
|
|
95
|
+
|
|
96
|
+
const isLiveItem = isLive(item);
|
|
80
97
|
const { minimised_height: minimisedHeight } = useConfiguration();
|
|
81
98
|
|
|
82
99
|
const resetPlayerAnimationState = React.useCallback(() => {
|
|
@@ -90,9 +107,29 @@ const Provider = ({ children }: { children: React.ReactNode }) => {
|
|
|
90
107
|
const translateYOffset = React.useRef(new Animated.Value(0)).current;
|
|
91
108
|
const dragVideoPlayerY = React.useRef(new Animated.Value(0)).current;
|
|
92
109
|
|
|
93
|
-
const { height } = useSafeAreaFrame();
|
|
110
|
+
const { height: safeAreaFrameHeight } = useSafeAreaFrame();
|
|
111
|
+
const [height, setHeight] = React.useState<number>(safeAreaFrameHeight);
|
|
112
|
+
const progressBarHeight = isLiveItem ? 0 : PROGRESS_BAR_HEIGHT;
|
|
113
|
+
const { bottom: bottomSafeArea } = useSafeAreaInsets();
|
|
94
114
|
const bottomTabBarHeight = useGetBottomTabBarHeight();
|
|
95
|
-
const
|
|
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]);
|
|
122
|
+
|
|
123
|
+
/*
|
|
124
|
+
If bottomTabBarHeight is equal 0 it means an app does not use bottomTabBar.
|
|
125
|
+
Because of this we need to minus bottom SafeArea offset.
|
|
126
|
+
*/
|
|
127
|
+
const minValue =
|
|
128
|
+
height -
|
|
129
|
+
minimisedHeight -
|
|
130
|
+
(bottomTabBarHeight || bottomSafeArea) -
|
|
131
|
+
progressBarHeight;
|
|
132
|
+
|
|
96
133
|
const modalSnapPoints = React.useMemo(() => [0, minValue], [minValue]);
|
|
97
134
|
// Last snap state which will helps us to make smooth responder to scrollview animation
|
|
98
135
|
const [lastSnap, setLastSnap] = React.useState<number>(modalSnapPoints[0]);
|
|
@@ -123,6 +160,8 @@ const Provider = ({ children }: { children: React.ReactNode }) => {
|
|
|
123
160
|
setLastSnap,
|
|
124
161
|
tabletLandscapePlayerTopPosition,
|
|
125
162
|
setTabletLandscapePlayerTopPosition,
|
|
163
|
+
startComponentsAnimationDistance,
|
|
164
|
+
progressBarHeight,
|
|
126
165
|
}}
|
|
127
166
|
>
|
|
128
167
|
{children}
|