@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.
Files changed (66) hide show
  1. package/Components/BaseFocusable/index.tsx +3 -3
  2. package/Components/Cell/Cell.tsx +14 -13
  3. package/Components/Cell/CellWithFocusable.tsx +24 -10
  4. package/Components/Cell/TvOSCellComponent.tsx +6 -11
  5. package/Components/Focusable/Focusable.tsx +6 -1
  6. package/Components/FocusableGroup/index.tsx +11 -2
  7. package/Components/HandlePlayable/HandlePlayable.tsx +3 -0
  8. package/Components/Layout/TV/ScreenContainer.tsx +79 -5
  9. package/Components/Layout/TV/ScreenLayoutContextProvider.tsx +2 -2
  10. package/Components/Layout/TV/__tests__/ScreenContainer.test.tsx +38 -28
  11. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +25 -13
  12. package/Components/Layout/TV/__tests__/__snapshots__/index.test.tsx.snap +10 -50
  13. package/Components/Layout/TV/__tests__/index.test.tsx +20 -75
  14. package/Components/Layout/TV/index.tsx +11 -67
  15. package/Components/Layout/TV/index.web.tsx +33 -0
  16. package/Components/Layout/index.tsx +15 -11
  17. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +7 -2
  18. package/Components/MasterCell/DefaultComponents/FocusableView/index.tsx +4 -1
  19. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +20 -0
  20. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.android.tsx +4 -1
  21. package/Components/MasterCell/DefaultComponents/tv/ButtonContainerView/index.tsx +10 -2
  22. package/Components/MasterCell/utils/__tests__/insertBetween.test.js +9 -0
  23. package/Components/MasterCell/utils/index.ts +17 -30
  24. package/Components/NativeFocusables/{index.js → index.ts} +4 -2
  25. package/Components/Navigator/StackNavigator.tsx +57 -0
  26. package/Components/Navigator/index.ts +1 -0
  27. package/Components/PlayerContainer/PlayerContainer.tsx +5 -1
  28. package/Components/River/TV/River.tsx +0 -23
  29. package/Components/Screen/TV/hooks/index.ts +3 -0
  30. package/Components/Screen/TV/hooks/useInitialFocus.ts +70 -0
  31. package/Components/Screen/TV/hooks/useRestoreFocus.ts +22 -0
  32. package/Components/Screen/TV/index.web.tsx +165 -0
  33. package/Components/Screen/__tests__/Screen.test.tsx +3 -0
  34. package/Components/Screen/index.tsx +55 -58
  35. package/Components/Screen/navigationHandler.ts +5 -0
  36. package/Components/ScreenResolver/index.tsx +3 -1
  37. package/Components/Transitioner/Scene.tsx +12 -11
  38. package/Components/Transitioner/Transitioner.tsx +15 -29
  39. package/Components/Transitioner/__tests__/__snapshots__/Scene.test.js.snap +8 -4
  40. package/Components/VideoLive/LiveImageManager.ts +25 -1
  41. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +2 -14
  42. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +56 -43
  43. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +42 -32
  44. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +104 -86
  45. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +32 -4
  46. package/Components/VideoModal/ModalAnimation/utils.ts +7 -4
  47. package/Components/VideoModal/PlayerWrapper.tsx +10 -10
  48. package/Components/VideoModal/VideoModal.tsx +4 -4
  49. package/Components/VideoModal/__tests__/__snapshots__/PlayerWrapper.test.tsx.snap +32 -12
  50. package/Components/VideoModal/hooks/useModalSize.ts +10 -12
  51. package/Components/VideoModal/utils.ts +5 -2
  52. package/Contexts/FocusableGroupContext/FocusableGroupContext.ts +3 -0
  53. package/Contexts/FocusableGroupContext/FocusableGroupContextProvider.tsx +16 -0
  54. package/Contexts/FocusableGroupContext/__tests__/FocusableGroupContextProvider.test.tsx +22 -0
  55. package/Contexts/FocusableGroupContext/__tests__/withFocusableContext.test.tsx +26 -0
  56. package/Contexts/FocusableGroupContext/index.ts +7 -0
  57. package/Contexts/FocusableGroupContext/withFocusableContext.tsx +17 -0
  58. package/Contexts/ScreenDataContext/index.tsx +20 -0
  59. package/Contexts/ZappPipesContext/ZappPipesEntryContext.ts +1 -1
  60. package/Decorators/Analytics/{index.js → index.tsx} +11 -11
  61. package/README.md +1 -13
  62. package/package.json +5 -5
  63. package/Components/Layout/TV/TransitionOverlay.tsx +0 -64
  64. package/Contexts/ScreenDataContext/index.ts +0 -3
  65. /package/Components/FocusableGroup/{index.android.js → index.android.ts} +0 -0
  66. /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 = "onEnd" | "onStart" | "onError";
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(({ value }) => {
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 = ({ nativeEvent }) => {
104
- if (nativeEvent.oldState === State.ACTIVE && scrollPosition.current === 0) {
105
- // eslint-disable-next-line prefer-const
106
- const { velocityY, translationY } = nativeEvent;
107
- const dragToss = 0.05;
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
- const preparedTranslationY =
110
- Math.abs(translationY) - lastScrollYValue.current;
114
+ const preparedTranslationY =
115
+ Math.abs(translationY) - lastScrollYValue.current;
111
116
 
112
- if (videoModalState.mode === "MAXIMIZED") {
113
- const endOffsetY =
114
- lastSnap + preparedTranslationY + dragToss * velocityY + 150;
117
+ if (videoModalState.mode === "MAXIMIZED") {
118
+ const endOffsetY =
119
+ lastSnap + preparedTranslationY + dragToss * velocityY + 150;
115
120
 
116
- let destSnapPoint = modalSnapPoints[0];
121
+ let destSnapPoint = modalSnapPoints[0];
117
122
 
118
- for (const snapPoint of modalSnapPoints) {
119
- const distFromSnap = Math.abs(snapPoint - endOffsetY);
123
+ for (const snapPoint of modalSnapPoints) {
124
+ const distFromSnap = Math.abs(snapPoint - endOffsetY);
120
125
 
121
- if (distFromSnap < Math.abs(destSnapPoint - endOffsetY)) {
122
- destSnapPoint = snapPoint;
126
+ if (distFromSnap < Math.abs(destSnapPoint - endOffsetY)) {
127
+ destSnapPoint = snapPoint;
128
+ }
123
129
  }
124
- }
125
130
 
126
- setLastSnap(destSnapPoint);
131
+ setLastSnap(destSnapPoint);
127
132
 
128
- if (destSnapPoint === modalSnapPoints[0]) {
129
- translateYOffset.extractOffset();
130
- translateYOffset.setValue(preparedTranslationY);
131
- translateYOffset.flattenOffset();
132
- dragScrollY.setValue(0);
133
+ if (destSnapPoint === modalSnapPoints[0]) {
134
+ translateYOffset.extractOffset();
135
+ translateYOffset.setValue(preparedTranslationY);
136
+ translateYOffset.flattenOffset();
137
+ dragScrollY.setValue(0);
133
138
 
134
- setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
139
+ setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
140
+ } else {
141
+ setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
142
+ }
135
143
  } else {
136
- setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
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
- if (translationY < 0) {
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
- } else {
151
- playerAnimationState === PlayerAnimationStateEnum.drag_scroll &&
152
- resetPlayerAnimationState();
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 === "MAXIMIZED") ||
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
- playerAnimationState !== PlayerAnimationStateEnum.drag_scroll &&
277
- setPlayerAnimationState(PlayerAnimationStateEnum.drag_scroll);
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 = ({ nativeEvent }) => {
54
- if (nativeEvent.oldState === State.ACTIVE) {
55
- // eslint-disable-next-line prefer-const
56
- const { velocityY, translationY } = nativeEvent;
57
- const preparedTranslationY = Math.abs(translationY);
58
- const dragToss = 0.05;
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
- if (videoModalState.mode === "MAXIMIZED") {
61
- if (translationY > 0) {
62
- const endOffsetY =
63
- lastSnap + preparedTranslationY + dragToss * velocityY + 200;
62
+ if (videoModalState.mode === "MAXIMIZED") {
63
+ if (translationY > 0) {
64
+ const endOffsetY =
65
+ lastSnap + preparedTranslationY + dragToss * velocityY + 200;
64
66
 
65
- let destSnapPoint = modalSnapPoints[0];
67
+ let destSnapPoint = modalSnapPoints[0];
66
68
 
67
- for (const snapPoint of modalSnapPoints) {
68
- const distFromSnap = Math.abs(snapPoint - endOffsetY);
69
+ for (const snapPoint of modalSnapPoints) {
70
+ const distFromSnap = Math.abs(snapPoint - endOffsetY);
69
71
 
70
- if (distFromSnap < Math.abs(destSnapPoint - endOffsetY)) {
71
- destSnapPoint = snapPoint;
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
- setLastSnap(destSnapPoint);
92
+ translateYOffset.setValue(
93
+ modalSnapPoints[1] - preparedTranslationY
94
+ );
76
95
 
77
- if (destSnapPoint === modalSnapPoints[0]) {
78
96
  setPlayerAnimationState(PlayerAnimationStateEnum.maximaze);
79
97
  } else {
80
- lastScrollY.setValue(0);
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, StyleSheet } from "react-native";
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
- height: screenHeight,
61
+ width: screenWidth,
65
62
  deviceInfo: { isTablet, isTabletLandscape },
66
- } = useDimensions("screen", { deviceInfo: true });
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 { width: screenWidth } = useSafeAreaFrame();
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 calculationData = React.useMemo(
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
- startAnimationDistance,
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
- startAnimationDistance,
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}