@applicaster/zapp-react-native-ui-components 15.0.0-rc.13 → 15.0.0-rc.131

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 (189) hide show
  1. package/Components/AnimatedInOut/index.tsx +69 -26
  2. package/Components/BaseFocusable/index.ios.ts +12 -2
  3. package/Components/Cell/Cell.tsx +14 -3
  4. package/Components/Cell/CellWithFocusable.tsx +9 -0
  5. package/Components/Cell/FocusableWrapper.tsx +3 -0
  6. package/Components/Cell/TvOSCellComponent.tsx +30 -6
  7. package/Components/Focusable/Focusable.tsx +4 -2
  8. package/Components/Focusable/FocusableTvOS.tsx +18 -1
  9. package/Components/Focusable/__tests__/__snapshots__/FocusableTvOS.test.tsx.snap +1 -0
  10. package/Components/FocusableGroup/FocusableTvOS.tsx +32 -1
  11. package/Components/GeneralContentScreen/GeneralContentScreen.tsx +39 -28
  12. package/Components/GeneralContentScreen/__tests__/GeneralContentScreen.test.tsx +104 -0
  13. package/Components/GeneralContentScreen/utils/__tests__/getScreenDataSource.test.ts +19 -0
  14. package/Components/GeneralContentScreen/utils/__tests__/useCurationAPI.test.js +1 -1
  15. package/Components/GeneralContentScreen/utils/getScreenDataSource.ts +9 -0
  16. package/Components/GeneralContentScreen/utils/useCurationAPI.ts +22 -6
  17. package/Components/HandlePlayable/HandlePlayable.tsx +33 -94
  18. package/Components/HandlePlayable/const.ts +3 -0
  19. package/Components/HandlePlayable/utils.ts +105 -0
  20. package/Components/HookRenderer/HookRenderer.tsx +40 -10
  21. package/Components/HookRenderer/__tests__/HookRenderer.test.tsx +60 -0
  22. package/Components/Layout/TV/LayoutBackground.tsx +5 -2
  23. package/Components/Layout/TV/NavBarContainer.tsx +1 -10
  24. package/Components/Layout/TV/ScreenContainer.tsx +2 -6
  25. package/Components/Layout/TV/__tests__/__snapshots__/NavBarContainer.test.tsx.snap +7 -12
  26. package/Components/Layout/TV/__tests__/__snapshots__/ScreenContainer.test.tsx.snap +7 -12
  27. package/Components/Layout/TV/index.tsx +3 -4
  28. package/Components/Layout/TV/index.web.tsx +3 -4
  29. package/Components/LinkHandler/LinkHandler.tsx +2 -2
  30. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/model.test.ts +80 -0
  31. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/placement.test.ts +187 -0
  32. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/selectors.test.ts +45 -0
  33. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/__tests__/style.test.ts +49 -0
  34. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/model.ts +47 -0
  35. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/placement.ts +170 -0
  36. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/selectors.ts +26 -0
  37. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/style.ts +29 -0
  38. package/Components/MasterCell/DefaultComponents/ActionButtonsCore/types.ts +37 -0
  39. package/Components/MasterCell/DefaultComponents/BorderContainerView/__tests__/index.test.tsx +16 -1
  40. package/Components/MasterCell/DefaultComponents/BorderContainerView/index.tsx +30 -2
  41. package/Components/MasterCell/DefaultComponents/Button.tsx +0 -15
  42. package/Components/MasterCell/DefaultComponents/Image/Image.android.tsx +5 -1
  43. package/Components/MasterCell/DefaultComponents/Image/Image.ios.tsx +11 -3
  44. package/Components/MasterCell/DefaultComponents/Image/Image.web.tsx +9 -1
  45. package/Components/MasterCell/DefaultComponents/Image/hooks/useImage.ts +15 -14
  46. package/Components/MasterCell/DefaultComponents/LiveImage/__tests__/prepareEntry.test.ts +352 -0
  47. package/Components/MasterCell/DefaultComponents/LiveImage/executePreloadHooks.ts +136 -0
  48. package/Components/MasterCell/DefaultComponents/LiveImage/index.tsx +43 -22
  49. package/Components/MasterCell/DefaultComponents/PressableView.tsx +196 -0
  50. package/Components/MasterCell/DefaultComponents/SecondaryImage/Image.tsx +40 -39
  51. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/Image.test.tsx +95 -0
  52. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/__snapshots__/Image.test.tsx.snap +86 -0
  53. package/Components/MasterCell/DefaultComponents/SecondaryImage/__tests__/index.test.ts +141 -0
  54. package/Components/MasterCell/DefaultComponents/SecondaryImage/hooks/__tests__/useGetImageDimensions.test.ts +7 -6
  55. package/Components/MasterCell/DefaultComponents/SecondaryImage/index.ts +1 -1
  56. package/Components/MasterCell/DefaultComponents/Text/index.tsx +10 -14
  57. package/Components/MasterCell/DefaultComponents/index.ts +2 -0
  58. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Asset.ts +46 -0
  59. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Button.ts +126 -0
  60. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/ButtonContainerView.ts +23 -0
  61. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/Spacer.ts +16 -0
  62. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/TextLabel.ts +67 -0
  63. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/TextLabelsContainer.ts +32 -0
  64. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/PressableView.test.tsx +191 -0
  65. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/builders.test.ts +140 -0
  66. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/__tests__/index.test.ts +222 -0
  67. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/helpers.ts +105 -0
  68. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/index.ts +104 -0
  69. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/__tests__/insertButtons.test.ts +118 -0
  70. package/Components/MasterCell/DefaultComponents/mobile/MobileActionButtons/utils/index.ts +73 -0
  71. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/__tests__/index.test.ts +86 -0
  72. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/index.ts +35 -48
  73. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/__tests__/getPluginIdentifier.test.ts +115 -29
  74. package/Components/MasterCell/DefaultComponents/tv/TvActionButtons/utils/index.ts +39 -144
  75. package/Components/MasterCell/elementMapper.tsx +1 -0
  76. package/Components/MasterCell/hoc/__tests__/withAsyncRender.test.tsx +219 -0
  77. package/Components/MasterCell/hoc/withAsyncRender.tsx +9 -7
  78. package/Components/MasterCell/index.tsx +2 -0
  79. package/Components/MasterCell/utils/__tests__/resolveColor.test.js +82 -3
  80. package/Components/MasterCell/utils/index.ts +61 -31
  81. package/Components/MeasurmentsPortal/MeasurementsPortal.tsx +102 -87
  82. package/Components/MeasurmentsPortal/__tests__/MeasurementsPortal.test.tsx +355 -0
  83. package/Components/OfflineHandler/NotificationView/NotificationView.lg.tsx +17 -9
  84. package/Components/OfflineHandler/NotificationView/NotificationView.samsung.tsx +16 -8
  85. package/Components/OfflineHandler/NotificationView/NotificationView.tsx +2 -2
  86. package/Components/OfflineHandler/NotificationView/__tests__/index.test.tsx +17 -18
  87. package/Components/OfflineHandler/NotificationView/utils.ts +34 -0
  88. package/Components/OfflineHandler/__tests__/index.test.tsx +27 -18
  89. package/Components/PlayerContainer/PlayerContainer.tsx +43 -64
  90. package/Components/PlayerImageBackground/index.tsx +3 -22
  91. package/Components/PreloaderWrapper/__tests__/index.test.tsx +26 -0
  92. package/Components/PreloaderWrapper/index.tsx +15 -0
  93. package/Components/River/ComponentsMap/ComponentsMap.tsx +16 -0
  94. package/Components/River/ComponentsMap/hooks/__tests__/useLoadingState.test.ts +1 -1
  95. package/Components/River/RefreshControl.tsx +36 -13
  96. package/Components/River/RiverItem.tsx +26 -20
  97. package/Components/River/TV/River.tsx +31 -14
  98. package/Components/River/TV/index.tsx +8 -4
  99. package/Components/River/TV/utils/__tests__/toStringOrEmpty.test.ts +30 -0
  100. package/Components/River/TV/utils/index.ts +4 -0
  101. package/Components/River/TV/withFocusableGroupForContent.tsx +71 -0
  102. package/Components/River/__tests__/__snapshots__/componentsMap.test.js.snap +2 -0
  103. package/Components/River/__tests__/componentsMap.test.js +38 -0
  104. package/Components/Screen/TV/index.web.tsx +4 -2
  105. package/Components/Screen/__tests__/Screen.test.tsx +66 -42
  106. package/Components/Screen/__tests__/__snapshots__/Screen.test.tsx.snap +68 -44
  107. package/Components/Screen/hooks.ts +75 -6
  108. package/Components/Screen/index.tsx +9 -4
  109. package/Components/Screen/navigationHandler.ts +49 -24
  110. package/Components/Screen/orientationHandler.ts +10 -13
  111. package/Components/ScreenFeedLoader/ScreenFeedLoader.tsx +46 -0
  112. package/Components/ScreenFeedLoader/__tests__/ScreenFeedLoader.test.tsx +94 -0
  113. package/Components/ScreenFeedLoader/index.ts +1 -0
  114. package/Components/ScreenResolver/__tests__/screenResolver.test.js +24 -0
  115. package/Components/ScreenResolver/hooks/index.ts +3 -0
  116. package/Components/ScreenResolver/hooks/useGetComponent.ts +15 -0
  117. package/Components/ScreenResolver/hooks/useScreenComponentResolver.tsx +90 -0
  118. package/Components/ScreenResolver/index.tsx +15 -111
  119. package/Components/ScreenResolver/utils/__tests__/getScreenTypeProps.test.ts +45 -0
  120. package/Components/ScreenResolver/utils/getScreenTypeProps.ts +43 -0
  121. package/Components/ScreenResolver/utils/index.ts +1 -0
  122. package/Components/ScreenResolver/withDefaultScreenContext.tsx +16 -0
  123. package/Components/ScreenResolverFeedProvider/ScreenResolverFeedProvider.tsx +25 -0
  124. package/Components/ScreenResolverFeedProvider/__tests__/ScreenResolverFeedProvider.test.tsx +44 -0
  125. package/Components/ScreenResolverFeedProvider/index.ts +1 -0
  126. package/Components/ScreenRevealManager/ScreenRevealManager.ts +40 -8
  127. package/Components/ScreenRevealManager/__tests__/ScreenRevealManager.test.ts +86 -69
  128. package/Components/ScreenRevealManager/withScreenRevealManager.tsx +44 -26
  129. package/Components/Tabs/TV/Tabs.tsx +20 -3
  130. package/Components/Tabs/TabContent.tsx +7 -4
  131. package/Components/Transitioner/Scene.tsx +10 -3
  132. package/Components/Transitioner/index.js +3 -3
  133. package/Components/VideoLive/LiveImageManager.ts +199 -54
  134. package/Components/VideoLive/PlayerLiveImageComponent.tsx +31 -33
  135. package/Components/VideoLive/__tests__/PlayerLiveImageComponent.test.tsx +2 -17
  136. package/Components/VideoLive/__tests__/__snapshots__/PlayerLiveImageComponent.test.tsx.snap +1 -0
  137. package/Components/VideoModal/ModalAnimation/ModalAnimationContext.tsx +118 -171
  138. package/Components/VideoModal/ModalAnimation/index.ts +2 -13
  139. package/Components/VideoModal/ModalAnimation/utils.ts +1 -327
  140. package/Components/VideoModal/PlayerWrapper.tsx +14 -88
  141. package/Components/VideoModal/VideoModal.tsx +1 -5
  142. package/Components/VideoModal/__tests__/PlayerWrapper.test.tsx +1 -0
  143. package/Components/VideoModal/hooks/__tests__/useDelayedPlayerDetails.test.ts +15 -7
  144. package/Components/VideoModal/hooks/useModalSize.ts +10 -5
  145. package/Components/VideoModal/playerWrapperStyle.ts +70 -0
  146. package/Components/VideoModal/playerWrapperUtils.ts +91 -0
  147. package/Components/VideoModal/utils.ts +19 -9
  148. package/Components/Viewport/ViewportAware/__tests__/viewportAware.test.js +0 -2
  149. package/Components/Viewport/ViewportAware/index.tsx +16 -7
  150. package/Components/Viewport/ViewportEvents/__tests__/viewportEvents.test.js +1 -1
  151. package/Components/ZappUIComponent/index.tsx +12 -6
  152. package/Components/default-cell-renderer/viewTrees/mobile/index.ts +0 -3
  153. package/Components/index.js +1 -1
  154. package/Contexts/ScreenContext/__tests__/index.test.tsx +57 -0
  155. package/Contexts/ScreenContext/index.tsx +71 -19
  156. package/Contexts/ScreenTrackedViewPositionsContext/__tests__/index.test.tsx +1 -1
  157. package/Contexts/ZappHookModalContext/index.tsx +37 -61
  158. package/Contexts/ZappPipesContext/ZappPipesContextFactory.tsx +18 -7
  159. package/Contexts/index.ts +0 -2
  160. package/Decorators/Analytics/index.tsx +6 -5
  161. package/Decorators/ConfigurationWrapper/__tests__/__snapshots__/withConfigurationProvider.test.tsx.snap +1 -0
  162. package/Decorators/ConfigurationWrapper/const.ts +1 -0
  163. package/Decorators/ZappPipesDataConnector/ResolverSelector.tsx +25 -7
  164. package/Decorators/ZappPipesDataConnector/__tests__/ResolverSelector.test.tsx +212 -5
  165. package/Decorators/ZappPipesDataConnector/__tests__/UrlFeedResolver.test.tsx +39 -21
  166. package/Decorators/ZappPipesDataConnector/__tests__/zappPipesDataConnector.test.js +1 -1
  167. package/Decorators/ZappPipesDataConnector/index.tsx +2 -2
  168. package/Decorators/ZappPipesDataConnector/resolvers/StaticFeedResolver.tsx +1 -1
  169. package/Decorators/ZappPipesDataConnector/resolvers/UrlFeedResolver.tsx +18 -7
  170. package/Helpers/DataSourceHelper/__tests__/itemLimitForData.test.ts +80 -0
  171. package/Helpers/DataSourceHelper/index.ts +19 -0
  172. package/events/index.ts +3 -0
  173. package/events/scrollEndReached.ts +15 -0
  174. package/index.d.ts +7 -0
  175. package/package.json +6 -5
  176. package/Components/MasterCell/DefaultComponents/Text/utils/__tests__/withAdjustedLineHeight.test.ts +0 -46
  177. package/Components/MasterCell/DefaultComponents/Text/utils/index.ts +0 -21
  178. package/Components/PlayerContainer/ErrorDisplay/ErrorDisplay.tsx +0 -57
  179. package/Components/PlayerContainer/ErrorDisplay/index.ts +0 -9
  180. package/Components/River/TV/withTVEventHandler.tsx +0 -27
  181. package/Components/VideoModal/ModalAnimation/AnimatedPlayerModalWrapper.tsx +0 -60
  182. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.tsx +0 -417
  183. package/Components/VideoModal/ModalAnimation/AnimatedScrollModal.web.tsx +0 -294
  184. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.tsx +0 -176
  185. package/Components/VideoModal/ModalAnimation/AnimatedVideoPlayerComponent.web.tsx +0 -93
  186. package/Components/VideoModal/ModalAnimation/AnimationComponent.tsx +0 -500
  187. package/Components/VideoModal/ModalAnimation/__tests__/getMoveUpValue.test.ts +0 -108
  188. package/Helpers/DataSourceHelper/index.js +0 -19
  189. /package/Components/HookRenderer/{index.tsx → index.ts} +0 -0
@@ -1,417 +0,0 @@
1
- import React from "react";
2
- import { Animated, StyleSheet, View } from "react-native";
3
-
4
- import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
5
- import {
6
- NativeViewGestureHandler,
7
- PanGestureHandler,
8
- State,
9
- TapGestureHandler,
10
- } from "react-native-gesture-handler";
11
-
12
- import { PlayerContainerContext } from "@applicaster/zapp-react-native-ui-components/Components/PlayerContainer/PlayerContainerContext";
13
- import {
14
- PlayerAnimationStateEnum,
15
- useModalAnimationContext,
16
- } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
17
- import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
18
- import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
19
-
20
- import {
21
- resetScrollAnimatedValues,
22
- setScrollModalAnimatedValue,
23
- } from "./utils";
24
-
25
- import { DURATION_TO_MINIMIZE } from "./const";
26
-
27
- const getAnimatedConfig = (toValue) => {
28
- return {
29
- toValue,
30
- duration: DURATION_TO_MINIMIZE,
31
- useNativeDriver: true,
32
- };
33
- };
34
-
35
- const generalStyles = StyleSheet.create({
36
- container: {
37
- flex: 1,
38
- },
39
- });
40
-
41
- type Props = {
42
- children: React.ReactNode;
43
- };
44
-
45
- const activeOffsetY = [-5, 5] as [number, number];
46
-
47
- export const AnimatedScrollModalComponent = ({ children }: Props) => {
48
- const {
49
- isActiveGesture,
50
- playerAnimationState,
51
- setPlayerAnimationState,
52
- resetPlayerAnimationState,
53
- animatedValues: {
54
- lastScrollY,
55
- dragScrollY,
56
- dragVideoPlayerY,
57
- translateYOffset,
58
- },
59
- lastScrollYValue,
60
- scrollPosition,
61
- modalSnapPoints,
62
- lastSnap,
63
- setLastSnap,
64
- setStartComponentsAnimation,
65
- } = useModalAnimationContext();
66
-
67
- const [enableGesture, setIEnableGesture] = React.useState<boolean>(true);
68
-
69
- const { isLanguageOverlayVisible, isSeekBarTouch } = React.useContext(
70
- PlayerContainerContext
71
- );
72
-
73
- const { maximiseVideoModal, minimiseVideoModal, videoModalState } =
74
- useNavigation();
75
-
76
- const {
77
- mode: videoModalMode,
78
- previousMode: previousVideoModalMode,
79
- item: videoModalItem,
80
- } = videoModalState;
81
-
82
- const isMaximizedModal: boolean = videoModalMode === "MAXIMIZED";
83
- const isMinimizedModal: boolean = videoModalMode === "MINIMIZED";
84
- const previousItemId = usePrevious(videoModalItem?.id);
85
-
86
- const isNotMinimizeMaximazeAnimation =
87
- playerAnimationState !== PlayerAnimationStateEnum.minimize &&
88
- playerAnimationState !== PlayerAnimationStateEnum.maximize;
89
-
90
- const isEnablePanGesture =
91
- enableGesture &&
92
- !isLanguageOverlayVisible &&
93
- isNotMinimizeMaximazeAnimation &&
94
- !isSeekBarTouch &&
95
- (isMaximizedModal || isMinimizedModal);
96
-
97
- const isAudioItem = React.useMemo(
98
- () =>
99
- videoModalItem?.content?.type?.includes?.("audio") ||
100
- videoModalItem?.type?.value === "audio",
101
- [videoModalItem]
102
- );
103
-
104
- // Refs for components
105
- const scrollRef = React.useRef(null);
106
- const tapHandlerRef = React.useRef(null);
107
- const panHandlerRef = React.useRef(null);
108
-
109
- const onRegisterLastScroll = Animated.event(
110
- [{ nativeEvent: { contentOffset: { y: lastScrollY } } }],
111
- { useNativeDriver: true }
112
- );
113
-
114
- const onGestureEvent = Animated.event(
115
- [{ nativeEvent: { translationY: dragScrollY } }],
116
- { useNativeDriver: true }
117
- );
118
-
119
- const onHandlerStateChange = React.useCallback(
120
- ({ nativeEvent }) => {
121
- if (
122
- nativeEvent.oldState === State.ACTIVE &&
123
- scrollPosition.current === 0
124
- ) {
125
- // eslint-disable-next-line prefer-const
126
- const { velocityY, translationY } = nativeEvent;
127
- const dragToss = 0.05;
128
-
129
- const preparedTranslationY =
130
- Math.abs(translationY) - lastScrollYValue.current;
131
-
132
- if (isMaximizedModal) {
133
- const endOffsetY =
134
- lastSnap + preparedTranslationY + dragToss * velocityY + 150;
135
-
136
- let destSnapPoint = modalSnapPoints[0];
137
-
138
- for (const snapPoint of modalSnapPoints) {
139
- const distFromSnap = Math.abs(snapPoint - endOffsetY);
140
-
141
- if (distFromSnap < Math.abs(destSnapPoint - endOffsetY)) {
142
- destSnapPoint = snapPoint;
143
- }
144
- }
145
-
146
- setLastSnap(destSnapPoint);
147
-
148
- if (destSnapPoint === modalSnapPoints[0]) {
149
- translateYOffset.extractOffset();
150
- translateYOffset.setValue(preparedTranslationY);
151
- translateYOffset.flattenOffset();
152
- dragScrollY.setValue(0);
153
-
154
- setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
155
- } else if (destSnapPoint !== modalSnapPoints[0] && isMaximizedModal) {
156
- setPlayerAnimationState(PlayerAnimationStateEnum.minimize);
157
- }
158
- } else {
159
- if (translationY < 0) {
160
- // from mini to full
161
- setLastSnap(modalSnapPoints[0]);
162
-
163
- translateYOffset.setValue(
164
- modalSnapPoints[1] - preparedTranslationY
165
- );
166
-
167
- dragScrollY.setValue(0);
168
-
169
- setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
170
- } else {
171
- resetPlayerAnimationState();
172
- }
173
- }
174
- } else {
175
- playerAnimationState === PlayerAnimationStateEnum.drag_scroll &&
176
- resetPlayerAnimationState();
177
- }
178
- },
179
- [
180
- lastSnap,
181
- modalSnapPoints,
182
- playerAnimationState,
183
- isMinimizedModal,
184
- isMaximizedModal,
185
- ]
186
- );
187
-
188
- const onScroll = React.useCallback(({ nativeEvent }) => {
189
- scrollPosition.current = nativeEvent.contentOffset.y;
190
- }, []);
191
-
192
- // Workaround for onMomentumScrollEnd issue
193
- // https://github.com/facebook/react-native/issues/32696#issuecomment-1104217223
194
- const canMomentum = React.useRef(false);
195
-
196
- const onMomentumScrollBegin = React.useCallback(() => {
197
- canMomentum.current = true;
198
- }, []);
199
-
200
- const onMomentumScrollEnd = React.useCallback(
201
- ({ nativeEvent }) => {
202
- if (canMomentum.current && !isActiveGesture) {
203
- if (nativeEvent.contentOffset.y === 0) {
204
- resetScrollAnimatedValues(
205
- lastScrollY,
206
- lastScrollYValue,
207
- dragScrollY,
208
- dragVideoPlayerY
209
- );
210
-
211
- setIEnableGesture(true);
212
- } else {
213
- setIEnableGesture(false);
214
- }
215
-
216
- canMomentum.current = false;
217
- }
218
- },
219
- [isActiveGesture]
220
- );
221
-
222
- React.useEffect(() => {
223
- return () => {
224
- scrollPosition.current = 0;
225
-
226
- resetScrollAnimatedValues(
227
- lastScrollY,
228
- lastScrollYValue,
229
- dragScrollY,
230
- dragVideoPlayerY
231
- );
232
- };
233
- }, []);
234
-
235
- React.useEffect(() => {
236
- if (
237
- videoModalMode === "MAXIMIZED" &&
238
- !enableGesture &&
239
- scrollPosition.current === 0
240
- ) {
241
- setIEnableGesture(true);
242
- }
243
-
244
- if (
245
- videoModalMode === "MINIMIZED" &&
246
- previousVideoModalMode === "MAXIMIZED"
247
- ) {
248
- // set animation to the minimize values if moving from the player to another screen
249
- if (playerAnimationState === null) {
250
- setScrollModalAnimatedValue(
251
- translateYOffset,
252
- modalSnapPoints[1],
253
- setLastSnap
254
- );
255
-
256
- resetScrollAnimatedValues(
257
- lastScrollY,
258
- lastScrollYValue,
259
- dragScrollY,
260
- dragVideoPlayerY
261
- );
262
- }
263
- } else if (
264
- playerAnimationState === null &&
265
- ((previousItemId === videoModalItem?.id &&
266
- videoModalMode === "MAXIMIZED" &&
267
- (previousVideoModalMode === "MINIMIZED" ||
268
- previousVideoModalMode === "MAXIMIZED")) ||
269
- (previousItemId !== videoModalItem?.id &&
270
- videoModalMode !== "FULLSCREEN"))
271
- ) {
272
- setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
273
- }
274
- }, [videoModalMode, previousVideoModalMode, videoModalItem]);
275
-
276
- React.useEffect(() => {
277
- if (playerAnimationState === PlayerAnimationStateEnum.minimize) {
278
- if (
279
- (scrollPosition.current === 0 &&
280
- (lastScrollY as any)._value !== 0 &&
281
- (dragScrollY as any)._value === 0 &&
282
- (dragVideoPlayerY as any)._value === 0) ||
283
- (scrollPosition.current !== 0 &&
284
- ((dragScrollY as any)._value !== 0 ||
285
- (dragVideoPlayerY as any)._value !== 0))
286
- ) {
287
- resetScrollAnimatedValues(
288
- lastScrollY,
289
- lastScrollYValue,
290
- dragScrollY,
291
- dragVideoPlayerY
292
- );
293
- }
294
-
295
- Animated.timing(
296
- translateYOffset,
297
- getAnimatedConfig(modalSnapPoints[1])
298
- ).start(() => {
299
- minimiseVideoModal();
300
-
301
- setScrollModalAnimatedValue(
302
- translateYOffset,
303
- modalSnapPoints[1],
304
- setLastSnap
305
- );
306
-
307
- resetScrollAnimatedValues(
308
- lastScrollY,
309
- lastScrollYValue,
310
- dragScrollY,
311
- dragVideoPlayerY
312
- );
313
-
314
- resetPlayerAnimationState();
315
- });
316
- } else if (playerAnimationState === PlayerAnimationStateEnum.maximize) {
317
- Animated.timing(translateYOffset, getAnimatedConfig(0)).start(() => {
318
- maximiseVideoModal();
319
- setScrollModalAnimatedValue(translateYOffset, 0, setLastSnap);
320
-
321
- resetScrollAnimatedValues(
322
- lastScrollY,
323
- lastScrollYValue,
324
- dragScrollY,
325
- dragVideoPlayerY
326
- );
327
-
328
- resetPlayerAnimationState();
329
- });
330
- }
331
- }, [playerAnimationState]);
332
-
333
- React.useEffect(() => {
334
- const lastScrollYListenerId = lastScrollY.addListener(({ value }) => {
335
- lastScrollYValue.current = value;
336
- });
337
-
338
- const dragListenerId = dragScrollY.addListener(({ value }) => {
339
- const preparedValue =
340
- isMinimizedModal && value >= 0
341
- ? 0
342
- : Math.round(isAudioItem ? Math.abs(value) : value);
343
-
344
- if (
345
- preparedValue > 0 &&
346
- scrollPosition.current === 0 &&
347
- playerAnimationState !== PlayerAnimationStateEnum.drag_player &&
348
- playerAnimationState !== PlayerAnimationStateEnum.drag_scroll
349
- ) {
350
- isMinimizedModal && setStartComponentsAnimation(true);
351
- setPlayerAnimationState(PlayerAnimationStateEnum.drag_scroll);
352
- }
353
- });
354
-
355
- return () => {
356
- lastScrollY.removeListener(lastScrollYListenerId);
357
- dragScrollY.removeListener(dragListenerId);
358
- };
359
- }, [playerAnimationState, isAudioItem, isMinimizedModal]);
360
-
361
- const scrollEnabled = isMaximizedModal && isNotMinimizeMaximazeAnimation;
362
-
363
- return (
364
- <View style={generalStyles.container}>
365
- <TapGestureHandler
366
- maxDurationMs={100000}
367
- ref={tapHandlerRef}
368
- maxDeltaY={lastSnap - modalSnapPoints[0]}
369
- numberOfTaps={1}
370
- >
371
- <View pointerEvents="box-none">
372
- <PanGestureHandler
373
- enabled={isEnablePanGesture}
374
- ref={panHandlerRef}
375
- simultaneousHandlers={[scrollRef, tapHandlerRef]}
376
- shouldCancelWhenOutside={isMaximizedModal}
377
- activeOffsetY={activeOffsetY}
378
- onGestureEvent={onGestureEvent}
379
- onHandlerStateChange={onHandlerStateChange}
380
- >
381
- <Animated.View>
382
- <NativeViewGestureHandler
383
- ref={scrollRef}
384
- waitFor={tapHandlerRef}
385
- simultaneousHandlers={panHandlerRef}
386
- >
387
- <Animated.ScrollView
388
- scrollEnabled={scrollEnabled}
389
- bounces={false}
390
- onScrollBeginDrag={onRegisterLastScroll}
391
- onScroll={onScroll}
392
- onMomentumScrollBegin={onMomentumScrollBegin}
393
- onMomentumScrollEnd={onMomentumScrollEnd}
394
- scrollEventThrottle={1}
395
- showsVerticalScrollIndicator={false}
396
- >
397
- {children}
398
- </Animated.ScrollView>
399
- </NativeViewGestureHandler>
400
- </Animated.View>
401
- </PanGestureHandler>
402
- </View>
403
- </TapGestureHandler>
404
- </View>
405
- );
406
- };
407
-
408
- export const AnimatedScrollModal = ({ children }: Props) => {
409
- const {
410
- videoModalState: { visible },
411
- } = useNavigation();
412
-
413
- const Component =
414
- !isTV() && visible ? AnimatedScrollModalComponent : React.Fragment;
415
-
416
- return <Component>{children}</Component>;
417
- };
@@ -1,294 +0,0 @@
1
- import React from "react";
2
- import { Animated, StyleSheet, View } from "react-native";
3
-
4
- import { useNavigation } from "@applicaster/zapp-react-native-utils/reactHooks";
5
-
6
- import {
7
- PlayerAnimationStateEnum,
8
- useModalAnimationContext,
9
- } from "@applicaster/zapp-react-native-ui-components/Components/VideoModal/ModalAnimation";
10
- import { isTV } from "@applicaster/zapp-react-native-utils/reactUtils";
11
- import { usePrevious } from "@applicaster/zapp-react-native-utils/reactHooks/utils";
12
-
13
- import {
14
- resetScrollAnimatedValues,
15
- setScrollModalAnimatedValue,
16
- } from "./utils";
17
-
18
- import { DURATION_TO_MINIMIZE } from "./const";
19
-
20
- const getAnimatedConfig = (toValue) => {
21
- return {
22
- toValue,
23
- duration: DURATION_TO_MINIMIZE,
24
- useNativeDriver: true,
25
- };
26
- };
27
-
28
- const generalStyles = StyleSheet.create({
29
- container: {
30
- flex: 1,
31
- },
32
- });
33
-
34
- type Props = {
35
- children: React.ReactNode;
36
- };
37
-
38
- export const AnimatedScrollModalComponent = ({ children }: Props) => {
39
- const {
40
- isActiveGesture,
41
- playerAnimationState,
42
- setPlayerAnimationState,
43
- resetPlayerAnimationState,
44
- animatedValues: {
45
- lastScrollY,
46
- dragScrollY,
47
- dragVideoPlayerY,
48
- translateYOffset,
49
- },
50
- lastScrollYValue,
51
- scrollPosition,
52
- modalSnapPoints,
53
- setLastSnap,
54
- setStartComponentsAnimation,
55
- } = useModalAnimationContext();
56
-
57
- const [enableGesture, setIEnableGesture] = React.useState<boolean>(true);
58
-
59
- const { maximiseVideoModal, minimiseVideoModal, videoModalState } =
60
- useNavigation();
61
-
62
- const {
63
- mode: videoModalMode,
64
- previousMode: previousVideoModalMode,
65
- item: videoModalItem,
66
- } = videoModalState;
67
-
68
- const isMaximizedModal: boolean = videoModalMode === "MAXIMIZED";
69
- const isMinimizedModal: boolean = videoModalMode === "MINIMIZED";
70
- const previousItemId = usePrevious(videoModalItem?.id);
71
-
72
- const isNotMinimizeMaximazeAnimation =
73
- playerAnimationState !== PlayerAnimationStateEnum.minimize &&
74
- playerAnimationState !== PlayerAnimationStateEnum.maximize;
75
-
76
- const isAudioItem = React.useMemo(
77
- () =>
78
- videoModalItem?.content?.type?.includes?.("audio") ||
79
- videoModalItem?.type?.value === "audio",
80
- [videoModalItem]
81
- );
82
-
83
- const onRegisterLastScroll = Animated.event(
84
- [{ nativeEvent: { contentOffset: { y: lastScrollY } } }],
85
- { useNativeDriver: true }
86
- );
87
-
88
- const onScroll = React.useCallback(({ nativeEvent }) => {
89
- scrollPosition.current = nativeEvent.contentOffset.y;
90
- }, []);
91
-
92
- // Workaround for onMomentumScrollEnd issue
93
- // https://github.com/facebook/react-native/issues/32696#issuecomment-1104217223
94
- const canMomentum = React.useRef(false);
95
-
96
- const onMomentumScrollBegin = React.useCallback(() => {
97
- canMomentum.current = true;
98
- }, []);
99
-
100
- const onMomentumScrollEnd = React.useCallback(
101
- ({ nativeEvent }) => {
102
- if (canMomentum.current && !isActiveGesture) {
103
- if (nativeEvent.contentOffset.y === 0) {
104
- resetScrollAnimatedValues(
105
- lastScrollY,
106
- lastScrollYValue,
107
- dragScrollY,
108
- dragVideoPlayerY
109
- );
110
-
111
- setIEnableGesture(true);
112
- } else {
113
- setIEnableGesture(false);
114
- }
115
-
116
- canMomentum.current = false;
117
- }
118
- },
119
- [isActiveGesture]
120
- );
121
-
122
- React.useEffect(() => {
123
- return () => {
124
- scrollPosition.current = 0;
125
-
126
- resetScrollAnimatedValues(
127
- lastScrollY,
128
- lastScrollYValue,
129
- dragScrollY,
130
- dragVideoPlayerY
131
- );
132
- };
133
- }, []);
134
-
135
- React.useEffect(() => {
136
- if (
137
- videoModalMode === "MAXIMIZED" &&
138
- !enableGesture &&
139
- scrollPosition.current === 0
140
- ) {
141
- setIEnableGesture(true);
142
- }
143
-
144
- if (
145
- videoModalMode === "MINIMIZED" &&
146
- previousVideoModalMode === "MAXIMIZED"
147
- ) {
148
- // set animation to the minimize values if moving from the player to another screen
149
- if (playerAnimationState === null) {
150
- setScrollModalAnimatedValue(
151
- translateYOffset,
152
- modalSnapPoints[1],
153
- setLastSnap
154
- );
155
-
156
- resetScrollAnimatedValues(
157
- lastScrollY,
158
- lastScrollYValue,
159
- dragScrollY,
160
- dragVideoPlayerY
161
- );
162
- }
163
- } else if (
164
- playerAnimationState === null &&
165
- ((previousItemId === videoModalItem?.id &&
166
- videoModalMode === "MAXIMIZED" &&
167
- (previousVideoModalMode === "MINIMIZED" ||
168
- previousVideoModalMode === "MAXIMIZED")) ||
169
- (previousItemId !== videoModalItem?.id &&
170
- videoModalMode !== "FULLSCREEN"))
171
- ) {
172
- setPlayerAnimationState(PlayerAnimationStateEnum.maximize);
173
- }
174
- }, [videoModalMode, previousVideoModalMode, videoModalItem]);
175
-
176
- React.useEffect(() => {
177
- if (playerAnimationState === PlayerAnimationStateEnum.minimize) {
178
- if (
179
- (scrollPosition.current === 0 &&
180
- (lastScrollY as any)._value !== 0 &&
181
- (dragScrollY as any)._value === 0 &&
182
- (dragVideoPlayerY as any)._value === 0) ||
183
- (scrollPosition.current !== 0 &&
184
- ((dragScrollY as any)._value !== 0 ||
185
- (dragVideoPlayerY as any)._value !== 0))
186
- ) {
187
- resetScrollAnimatedValues(
188
- lastScrollY,
189
- lastScrollYValue,
190
- dragScrollY,
191
- dragVideoPlayerY
192
- );
193
- }
194
-
195
- Animated.timing(
196
- translateYOffset,
197
- getAnimatedConfig(modalSnapPoints[1])
198
- ).start(() => {
199
- minimiseVideoModal();
200
-
201
- setScrollModalAnimatedValue(
202
- translateYOffset,
203
- modalSnapPoints[1],
204
- setLastSnap
205
- );
206
-
207
- resetScrollAnimatedValues(
208
- lastScrollY,
209
- lastScrollYValue,
210
- dragScrollY,
211
- dragVideoPlayerY
212
- );
213
-
214
- resetPlayerAnimationState();
215
- });
216
- } else if (playerAnimationState === PlayerAnimationStateEnum.maximize) {
217
- Animated.timing(translateYOffset, getAnimatedConfig(0)).start(() => {
218
- maximiseVideoModal();
219
- setScrollModalAnimatedValue(translateYOffset, 0, setLastSnap);
220
-
221
- resetScrollAnimatedValues(
222
- lastScrollY,
223
- lastScrollYValue,
224
- dragScrollY,
225
- dragVideoPlayerY
226
- );
227
-
228
- resetPlayerAnimationState();
229
- });
230
- }
231
- }, [playerAnimationState]);
232
-
233
- React.useEffect(() => {
234
- const lastScrollYListenerId = lastScrollY.addListener(({ value }) => {
235
- lastScrollYValue.current = value;
236
- });
237
-
238
- const dragListenerId = dragScrollY.addListener(({ value }) => {
239
- const preparedValue =
240
- isMinimizedModal && value >= 0
241
- ? 0
242
- : Math.round(isAudioItem ? Math.abs(value) : value);
243
-
244
- if (
245
- preparedValue > 0 &&
246
- scrollPosition.current === 0 &&
247
- playerAnimationState !== PlayerAnimationStateEnum.drag_player &&
248
- playerAnimationState !== PlayerAnimationStateEnum.drag_scroll
249
- ) {
250
- isMinimizedModal && setStartComponentsAnimation(true);
251
- setPlayerAnimationState(PlayerAnimationStateEnum.drag_scroll);
252
- }
253
- });
254
-
255
- return () => {
256
- lastScrollY.removeListener(lastScrollYListenerId);
257
- dragScrollY.removeListener(dragListenerId);
258
- };
259
- }, [playerAnimationState, isAudioItem, isMinimizedModal]);
260
-
261
- const scrollEnabled = isMaximizedModal && isNotMinimizeMaximazeAnimation;
262
-
263
- return (
264
- <View style={generalStyles.container}>
265
- <View pointerEvents="box-none">
266
- <Animated.View>
267
- <Animated.ScrollView
268
- scrollEnabled={scrollEnabled}
269
- bounces={false}
270
- onScrollBeginDrag={onRegisterLastScroll}
271
- onScroll={onScroll}
272
- onMomentumScrollBegin={onMomentumScrollBegin}
273
- onMomentumScrollEnd={onMomentumScrollEnd}
274
- scrollEventThrottle={1}
275
- showsVerticalScrollIndicator={false}
276
- >
277
- {children}
278
- </Animated.ScrollView>
279
- </Animated.View>
280
- </View>
281
- </View>
282
- );
283
- };
284
-
285
- export const AnimatedScrollModal = ({ children }: Props) => {
286
- const {
287
- videoModalState: { visible },
288
- } = useNavigation();
289
-
290
- const Component =
291
- !isTV() && visible ? AnimatedScrollModalComponent : React.Fragment;
292
-
293
- return <Component>{children}</Component>;
294
- };