@zezosoft/zezo-ott-react-native-ui-kit 1.3.6 → 1.3.8

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 (276) hide show
  1. package/README.md +40 -36
  2. package/lib/module/components/Content/Card/components/AdsPoster.js +40 -55
  3. package/lib/module/components/Content/Card/components/AdsPoster.js.map +1 -1
  4. package/lib/module/components/Content/Card/components/CardPoster.js +81 -107
  5. package/lib/module/components/Content/Card/components/CardPoster.js.map +1 -1
  6. package/lib/module/components/Content/Card/components/ThumbnailCard.js +48 -70
  7. package/lib/module/components/Content/Card/components/ThumbnailCard.js.map +1 -1
  8. package/lib/module/components/Search/components/SearchCard.js +2 -2
  9. package/lib/module/components/Search/components/SearchCard.js.map +1 -1
  10. package/lib/typescript/src/components/Content/Card/components/AdsPoster.d.ts +1 -1
  11. package/lib/typescript/src/components/Content/Card/components/AdsPoster.d.ts.map +1 -1
  12. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts.map +1 -1
  13. package/lib/typescript/src/components/Content/Card/components/ThumbnailCard.d.ts +1 -1
  14. package/lib/typescript/src/components/Content/Card/components/ThumbnailCard.d.ts.map +1 -1
  15. package/lib/typescript/src/components/Search/components/SearchCard.d.ts.map +1 -1
  16. package/package.json +1 -3
  17. package/lib/module/utils/colorUtils.js +0 -68
  18. package/lib/module/utils/colorUtils.js.map +0 -1
  19. package/lib/typescript/src/utils/colorUtils.d.ts +0 -19
  20. package/lib/typescript/src/utils/colorUtils.d.ts.map +0 -1
  21. package/src/assets/animations/135037-payment-processing-error.json +0 -1347
  22. package/src/assets/animations/7227-vui-animation.json +0 -3377
  23. package/src/assets/animations/Failed.json +0 -2103
  24. package/src/assets/animations/Pending.json +0 -522
  25. package/src/assets/animations/Successful.json +0 -2289
  26. package/src/assets/animations/heart.json +0 -788
  27. package/src/assets/animations/succesfull-payment.json +0 -2379
  28. package/src/assets/animations/voice-icon.json +0 -542
  29. package/src/assets/img/back.png +0 -0
  30. package/src/assets/img/bottom-panel.png +0 -0
  31. package/src/assets/img/camera.png +0 -0
  32. package/src/assets/img/camera2.png +0 -0
  33. package/src/assets/img/home.png +0 -0
  34. package/src/assets/img/lock.png +0 -0
  35. package/src/assets/img/play.png +0 -0
  36. package/src/assets/img/profile.jpg +0 -0
  37. package/src/assets/img/qr-code.png +0 -0
  38. package/src/assets/img/shadow.png +0 -0
  39. package/src/assets/img/shadow2.png +0 -0
  40. package/src/assets/img/user.png +0 -0
  41. package/src/assets/svg/Account.svg +0 -4
  42. package/src/assets/svg/Favourite.svg +0 -14
  43. package/src/assets/svg/Upcoming.svg +0 -4
  44. package/src/assets/svg/content-error.svg +0 -28
  45. package/src/assets/svg/download.svg +0 -3
  46. package/src/assets/svg/eye-off.svg +0 -10
  47. package/src/assets/svg/favorites.svg +0 -3
  48. package/src/assets/svg/h.svg +0 -4
  49. package/src/assets/svg/home.svg +0 -5
  50. package/src/assets/svg/home1.svg +0 -3
  51. package/src/assets/svg/menu-bar.svg +0 -4
  52. package/src/assets/svg/my-space.svg +0 -14
  53. package/src/assets/svg/play-icon-with-bg.svg +0 -5
  54. package/src/assets/svg/profile.svg +0 -4
  55. package/src/assets/svg/search.svg +0 -5
  56. package/src/assets/svg/search1.svg +0 -4
  57. package/src/assets/svg/server-error.svg +0 -139
  58. package/src/components/Account/Account.tsx +0 -354
  59. package/src/components/Account/index.ts +0 -6
  60. package/src/components/Alert/AlertDialog.tsx +0 -253
  61. package/src/components/Alert/UAAlert.tsx +0 -176
  62. package/src/components/Alert/index.ts +0 -7
  63. package/src/components/Auth/AuthProvider/AuthProvider.tsx +0 -412
  64. package/src/components/Auth/One/ForgotPassword/ForgotPassword.tsx +0 -333
  65. package/src/components/Auth/One/Login/LoginWithEmail.tsx +0 -449
  66. package/src/components/Auth/One/Login/LoginWithPhone.tsx +0 -309
  67. package/src/components/Auth/One/OTP/OTP.tsx +0 -539
  68. package/src/components/Auth/One/QrLogin/QrLogin.tsx +0 -329
  69. package/src/components/Auth/One/QrLogin/components/index.ts +0 -8
  70. package/src/components/Auth/One/QrLogin/components/qr-scanner-fallback.tsx +0 -158
  71. package/src/components/Auth/One/QrLogin/components/qr-scanner-frame.tsx +0 -207
  72. package/src/components/Auth/One/QrLogin/components/qr-scanner-header.tsx +0 -65
  73. package/src/components/Auth/One/QrLogin/components/qr-scanner-intro.tsx +0 -255
  74. package/src/components/Auth/One/QrLogin/components/qr-scanner-overlay.tsx +0 -291
  75. package/src/components/Auth/One/SignUp/SignUp.tsx +0 -470
  76. package/src/components/Auth/One/SplashScreen/SplashScreen.tsx +0 -229
  77. package/src/components/Auth/One/SplashScreen/components/SplashImage/SplashImage.tsx +0 -92
  78. package/src/components/Auth/One/SplashScreen/components/SplashLottie/SplashLottie.tsx +0 -129
  79. package/src/components/Auth/One/SplashScreen/components/SplashVideo/SplashVideo.tsx +0 -172
  80. package/src/components/Auth/One/SplashScreen/utils/splashUtils.ts +0 -23
  81. package/src/components/Auth/One/index.ts +0 -24
  82. package/src/components/Auth/Two/AuthHeader/AuthHeader.tsx +0 -130
  83. package/src/components/Auth/Two/ForgotPassword/ForgotPassword.tsx +0 -331
  84. package/src/components/Auth/Two/Login/EmailOrPhoneLogin.tsx +0 -612
  85. package/src/components/Auth/Two/OTP/OTP.tsx +0 -504
  86. package/src/components/Auth/Two/SignUp/SignUp.tsx +0 -439
  87. package/src/components/Auth/Two/index.ts +0 -20
  88. package/src/components/Auth/index.ts +0 -16
  89. package/src/components/BackgroundLayout/One/One.tsx +0 -184
  90. package/src/components/BackgroundLayout/Two/Two.tsx +0 -65
  91. package/src/components/BackgroundLayout/index.ts +0 -14
  92. package/src/components/BlogView/BlogView.tsx +0 -282
  93. package/src/components/BlogView/index.ts +0 -8
  94. package/src/components/BlurView/BlurView.tsx +0 -199
  95. package/src/components/BlurView/index.ts +0 -7
  96. package/src/components/BottomSheet/BottomSheet.tsx +0 -204
  97. package/src/components/BottomSheet/BottomSheetOne.tsx +0 -223
  98. package/src/components/BottomSheet/index.ts +0 -9
  99. package/src/components/Button/BackBtn.tsx +0 -149
  100. package/src/components/Button/MenuBtn.tsx +0 -220
  101. package/src/components/Button/PrimaryBtn.tsx +0 -123
  102. package/src/components/Button/SecondaryBtn.tsx +0 -123
  103. package/src/components/Button/TextButton.tsx +0 -150
  104. package/src/components/Button/index.ts +0 -18
  105. package/src/components/Button/types.ts +0 -33
  106. package/src/components/Content/Card/Category/Category.tsx +0 -436
  107. package/src/components/Content/Card/Category/CategroyTwo.tsx +0 -429
  108. package/src/components/Content/Card/NowWatching/NowWatching.tsx +0 -607
  109. package/src/components/Content/Card/Sliders/Styles/One.tsx +0 -490
  110. package/src/components/Content/Card/Sliders/Styles/Three.tsx +0 -1017
  111. package/src/components/Content/Card/Sliders/Styles/Two.tsx +0 -395
  112. package/src/components/Content/Card/Sliders/index.ts +0 -18
  113. package/src/components/Content/Card/Styles/Five.tsx +0 -367
  114. package/src/components/Content/Card/Styles/Four.tsx +0 -366
  115. package/src/components/Content/Card/Styles/One.tsx +0 -372
  116. package/src/components/Content/Card/Styles/RotateInOut.tsx +0 -413
  117. package/src/components/Content/Card/Styles/Six.tsx +0 -378
  118. package/src/components/Content/Card/Styles/Three.tsx +0 -312
  119. package/src/components/Content/Card/Styles/TopTen.tsx +0 -402
  120. package/src/components/Content/Card/Styles/Two.tsx +0 -404
  121. package/src/components/Content/Card/components/AdsPoster.tsx +0 -207
  122. package/src/components/Content/Card/components/CardPoster.tsx +0 -377
  123. package/src/components/Content/Card/components/LiveBadge.tsx +0 -125
  124. package/src/components/Content/Card/components/NavigateToMore.tsx +0 -97
  125. package/src/components/Content/Card/components/RentOrBuyIcon.tsx +0 -134
  126. package/src/components/Content/Card/components/ShowAllButton.tsx +0 -92
  127. package/src/components/Content/Card/components/ThumbnailCard.tsx +0 -219
  128. package/src/components/Content/Card/components/index.ts +0 -12
  129. package/src/components/Content/Card/index.ts +0 -31
  130. package/src/components/Content/Content.tsx +0 -338
  131. package/src/components/Content/Sections.tsx +0 -239
  132. package/src/components/Content/types.ts +0 -180
  133. package/src/components/ContentView/MoreContentList.tsx +0 -330
  134. package/src/components/ContentView/One/ContentViewOne.tsx +0 -251
  135. package/src/components/ContentView/One/components/CastCard.tsx +0 -266
  136. package/src/components/ContentView/One/components/HeroBanner.tsx +0 -413
  137. package/src/components/ContentView/One/components/MiniInfo.tsx +0 -343
  138. package/src/components/ContentView/One/components/Title.tsx +0 -149
  139. package/src/components/ContentView/Two/ContentViewTwo.tsx +0 -332
  140. package/src/components/ContentView/Two/components/Details.tsx +0 -196
  141. package/src/components/ContentView/Two/components/HeroBanner.tsx +0 -267
  142. package/src/components/ContentView/Two/components/LikeShareActions.tsx +0 -125
  143. package/src/components/ContentView/Two/components/MoreLikeThisContentList .tsx +0 -308
  144. package/src/components/ContentView/Two/components/PlayOrTrailer.tsx +0 -162
  145. package/src/components/ContentView/Two/components/SectionTabs.tsx +0 -181
  146. package/src/components/ContentView/Two/components/Title.tsx +0 -229
  147. package/src/components/ContentView/Two/components/index.ts +0 -12
  148. package/src/components/ContentView/index.ts +0 -13
  149. package/src/components/ContentView/shared/AboutSection.tsx +0 -226
  150. package/src/components/ContentView/shared/EpisodeCard.tsx +0 -600
  151. package/src/components/ContentView/shared/GenreTags.tsx +0 -189
  152. package/src/components/ContentView/shared/PlayButton.tsx +0 -52
  153. package/src/components/ContentView/shared/TrailerButton.tsx +0 -76
  154. package/src/components/Fallbacks/NoContentFallback.tsx +0 -175
  155. package/src/components/Fallbacks/NotFoundFallback.tsx +0 -94
  156. package/src/components/Fallbacks/index.ts +0 -7
  157. package/src/components/Headers/AppHeader.tsx +0 -151
  158. package/src/components/Headers/Four.tsx +0 -84
  159. package/src/components/Headers/One.tsx +0 -115
  160. package/src/components/Headers/Three.tsx +0 -137
  161. package/src/components/Headers/Two.tsx +0 -101
  162. package/src/components/Headers/index.ts +0 -34
  163. package/src/components/Input/Input.ts +0 -18
  164. package/src/components/Input/InputOne.tsx +0 -265
  165. package/src/components/Input/InputThree.tsx +0 -205
  166. package/src/components/Input/InputTwo.tsx +0 -217
  167. package/src/components/Input/PhoneInput/One/One.tsx +0 -415
  168. package/src/components/Input/PhoneInput/Two/Two.tsx +0 -406
  169. package/src/components/Input/PhoneInput/index.ts +0 -14
  170. package/src/components/Keyboard/HideKeyboard.tsx +0 -91
  171. package/src/components/Loader/Loader.tsx +0 -49
  172. package/src/components/Logo/Logo.tsx +0 -150
  173. package/src/components/NewRelease/NewReleaseSheet.tsx +0 -260
  174. package/src/components/NewRelease/index.ts +0 -6
  175. package/src/components/Reels/ReelsSeries/MediaControls/BottomControls.tsx +0 -226
  176. package/src/components/Reels/ReelsSeries/MediaControls/MediaControlsProvider.tsx +0 -324
  177. package/src/components/Reels/ReelsSeries/MediaControls/MiddleControls.tsx +0 -201
  178. package/src/components/Reels/ReelsSeries/MediaControls/RightControls.tsx +0 -100
  179. package/src/components/Reels/ReelsSeries/MediaControls/TopControls.tsx +0 -168
  180. package/src/components/Reels/ReelsSeries/Model/DetailsModal.tsx +0 -207
  181. package/src/components/Reels/ReelsSeries/Model/SettingModal.tsx +0 -151
  182. package/src/components/Reels/ReelsSeries/Model/UnlockModal.tsx +0 -159
  183. package/src/components/Reels/ReelsSeries/ReelsSeries.tsx +0 -278
  184. package/src/components/Reels/ReelsSeries/ReelsSeriesItem.tsx +0 -569
  185. package/src/components/Reels/ReelsSeries/components/AnimatedThreeLines.tsx +0 -189
  186. package/src/components/Reels/ReelsSeries/components/Episodes.tsx +0 -159
  187. package/src/components/Reels/ReelsSeries/components/GradientOverlay.tsx +0 -46
  188. package/src/components/Reels/ReelsSeries/components/Like.tsx +0 -45
  189. package/src/components/Reels/ReelsSeries/components/RotatingLoader.tsx +0 -84
  190. package/src/components/Reels/ReelsSeries/components/Synopsis.tsx +0 -338
  191. package/src/components/Reels/ReelsSeries/components/VideoControls/QualityControl.tsx +0 -185
  192. package/src/components/Reels/ReelsSeries/components/VideoControls/SpeedControl.tsx +0 -77
  193. package/src/components/Reels/ReelsSeries/components/VideoControls/index.ts +0 -7
  194. package/src/components/Reels/ReelsSeries/types.ts +0 -78
  195. package/src/components/Reels/ReelsSeries/useReelsWatchProgress.ts +0 -90
  196. package/src/components/Reels/ReelsSeries/utils/quality.ts +0 -72
  197. package/src/components/Reels/index.ts +0 -9
  198. package/src/components/Reels/utils/Controls/gestureUtils.ts +0 -46
  199. package/src/components/Reels/utils/Controls/index.ts +0 -9
  200. package/src/components/Reels/utils/Controls/overlayUtils.ts +0 -40
  201. package/src/components/Reels/utils/Controls/videoControlsConstants.ts +0 -30
  202. package/src/components/Reels/utils/Controls/videoRef.ts +0 -9
  203. package/src/components/Reels/utils/index.ts +0 -6
  204. package/src/components/Reels/utils/timeoutUtils.ts +0 -34
  205. package/src/components/Search/One.tsx +0 -262
  206. package/src/components/Search/components/RecentSearchesSection.tsx +0 -181
  207. package/src/components/Search/components/SearchCard.tsx +0 -285
  208. package/src/components/Search/index.ts +0 -16
  209. package/src/components/Settings/AppSettings.tsx +0 -442
  210. package/src/components/Settings/index.ts +0 -6
  211. package/src/components/Subscription/SubOne.tsx +0 -423
  212. package/src/components/Subscription/components/SubsDetailsModal.tsx +0 -347
  213. package/src/components/Subscription/components/SubscriptionCard.tsx +0 -342
  214. package/src/components/Subscription/index.ts +0 -12
  215. package/src/components/TabBar/One.tsx +0 -145
  216. package/src/components/TabBar/Three.tsx +0 -162
  217. package/src/components/TabBar/Two.tsx +0 -179
  218. package/src/components/TabBar/index.ts +0 -20
  219. package/src/components/Text/Text.tsx +0 -90
  220. package/src/components/Text/index.ts +0 -6
  221. package/src/components/User/DeviceSessions/DeviceSessions.tsx +0 -468
  222. package/src/components/User/ProfileUpdate/ProfileUpdate.tsx +0 -293
  223. package/src/components/User/PurchaseHistory/PurchaseHistory.tsx +0 -504
  224. package/src/components/User/WatchHistory/WatchHistory.tsx +0 -214
  225. package/src/components/User/WatchLater/WatchLater.tsx +0 -400
  226. package/src/components/User/components/UserAvatar.tsx +0 -121
  227. package/src/components/User/components/UserSection.tsx +0 -218
  228. package/src/components/User/index.ts +0 -18
  229. package/src/components/View/View.tsx +0 -38
  230. package/src/components/View/index.ts +0 -6
  231. package/src/components/common/AppStatusBar.tsx +0 -57
  232. package/src/components/common/index.ts +0 -1
  233. package/src/components/index.ts +0 -30
  234. package/src/components/layout/SafeAreaWrapper.tsx +0 -50
  235. package/src/components/layout/index.ts +0 -6
  236. package/src/constants/dummySections.ts +0 -103
  237. package/src/hooks/Images/index.ts +0 -6
  238. package/src/hooks/Images/useImageLoader.ts +0 -209
  239. package/src/hooks/index.ts +0 -16
  240. package/src/hooks/useAdTracking.ts +0 -354
  241. package/src/hooks/useCards.ts +0 -247
  242. package/src/hooks/useDebounce.ts +0 -40
  243. package/src/hooks/useKeyboard.ts +0 -43
  244. package/src/hooks/useNavigationMode.ts +0 -48
  245. package/src/hooks/usePaginatedSection.ts +0 -108
  246. package/src/hooks/usePrevious.ts +0 -28
  247. package/src/hooks/useSafeCallback.ts +0 -29
  248. package/src/hooks/useSkeletonItems.ts +0 -30
  249. package/src/hooks/useSplashCache.ts +0 -245
  250. package/src/index.tsx +0 -9
  251. package/src/store/RecentSearchesStore.ts +0 -72
  252. package/src/store/splashStore.ts +0 -86
  253. package/src/store/storage.ts +0 -29
  254. package/src/theme/ThemeContext.ts +0 -19
  255. package/src/theme/ThemeProvider.tsx +0 -87
  256. package/src/theme/hooks/index.ts +0 -6
  257. package/src/theme/hooks/useTheme.ts +0 -118
  258. package/src/theme/index.ts +0 -8
  259. package/src/theme/store/theme.ts +0 -50
  260. package/src/theme/themes.ts +0 -262
  261. package/src/theme/utils/cleanColors.ts +0 -71
  262. package/src/theme/utils/toRgba.ts +0 -150
  263. package/src/types/content/content-view.types.ts +0 -209
  264. package/src/types/hook/index.ts +0 -6
  265. package/src/types/hook/usePaginatedSection.ts +0 -20
  266. package/src/types/index.ts +0 -10
  267. package/src/types/navigation.ts +0 -17
  268. package/src/types/sections/index.ts +0 -87
  269. package/src/types/user.ts +0 -18
  270. package/src/utils/Display.ts +0 -15
  271. package/src/utils/Formater.ts +0 -33
  272. package/src/utils/SizeMatters.ts +0 -8
  273. package/src/utils/Spacing.ts +0 -27
  274. package/src/utils/colorUtils.ts +0 -70
  275. package/src/utils/imageValidation.ts +0 -36
  276. package/src/utils/interaction.ts +0 -19
@@ -1,413 +0,0 @@
1
- /**
2
- * @author Naresh Dhamu
3
- * @LastModified Tue 14 Jul 2026 at 3:57 PM
4
- */
5
-
6
- // ─── Imports ─────────────────────────────────────────────────────────────────
7
-
8
- import React, { useMemo, useCallback } from 'react';
9
- import { View, StyleSheet, Animated } from 'react-native';
10
- import LinearGradient from 'react-native-linear-gradient';
11
- import SkeletonPlaceholder from 'react-native-skeleton-placeholder';
12
- import { scale, verticalScale } from 'react-native-size-matters';
13
- import FastImage, { type ImageStyle } from 'react-native-fast-image';
14
- import tinycolor from 'tinycolor2';
15
- import { RFValue } from 'react-native-responsive-fontsize';
16
-
17
- import { PlayButton } from '../../shared/PlayButton';
18
- import { TrailerButton } from '../../shared/TrailerButton';
19
- import BackBtn from '../../../Button/BackBtn';
20
- import MenuBtn from '../../../Button/MenuBtn';
21
- import RentOrBuyIcon from '../../../Content/Card/components/RentOrBuyIcon';
22
- import LiveBadge from '../../../Content/Card/components/LiveBadge';
23
- import { Text } from '../../../Text';
24
- import { useTheme } from '../../../../theme';
25
- import { useImageLoader } from '../../../../hooks/Images';
26
- import type { HeroBannerProps } from '../../../../types/content/content-view.types';
27
-
28
- // ─── Constants ───────────────────────────────────────────────────────────────
29
-
30
- const BANNER_HEIGHT = verticalScale(200);
31
- const BACK_BTN_SIZE = scale(35);
32
- const SKELETON_CIRCLE_SIZE = scale(50);
33
-
34
- // ─── Component ───────────────────────────────────────────────────────────────
35
-
36
- export const HeroBanner = React.memo(
37
- ({
38
- backgroundImage,
39
- title,
40
- theme: themeOverride,
41
- isLoading = false,
42
- onPressPlay,
43
- onBackPress,
44
- menuActions,
45
- content_offering_type,
46
- contentType,
47
- }: HeroBannerProps) => {
48
- const { theme } = useTheme(themeOverride);
49
- const isLiveStream = contentType === 'live_stream';
50
-
51
- const {
52
- imageError,
53
- showSkeleton: imageLoadingSkeleton,
54
- imageSource,
55
- handleLoad: handleImageLoad,
56
- handleError: handleImageError,
57
- } = useImageLoader({
58
- imageUri: backgroundImage || '',
59
- isLoading,
60
- });
61
-
62
- const showSkeleton = useMemo(
63
- () => isLoading || (imageLoadingSkeleton && !!backgroundImage),
64
- [isLoading, imageLoadingSkeleton, backgroundImage]
65
- );
66
-
67
- const shouldShowLiveBadge = !showSkeleton && !imageError && isLiveStream;
68
- const showHeader = !!(onBackPress || shouldShowLiveBadge || menuActions);
69
-
70
- const gradientColors = useMemo(() => {
71
- const base = theme.colors.background;
72
- return [
73
- tinycolor(base).toRgbString(),
74
- tinycolor(base).setAlpha(0.66).toRgbString(),
75
- tinycolor(base).setAlpha(0.2).toRgbString(),
76
- tinycolor(base).setAlpha(0.1).toRgbString(),
77
- 'rgba(0, 0, 0, 0)',
78
- ];
79
- }, [theme.colors.background]);
80
-
81
- const handlePressPlay = useCallback(
82
- ({ is_trailer }: { is_trailer: boolean }) => {
83
- onPressPlay?.({ is_trailer });
84
- },
85
- [onPressPlay]
86
- );
87
-
88
- // Dynamic styles
89
- const containerStyle = [
90
- styles.container,
91
- { backgroundColor: theme.colors.backgroundDisabled },
92
- ];
93
-
94
- const badgeStyle = [
95
- styles.badge,
96
- { backgroundColor: theme.colors.primary },
97
- ];
98
-
99
- const badgeTextStyle = [
100
- styles.badgeText,
101
- { color: theme.colors.onPrimary },
102
- ];
103
-
104
- const backBtnStyle = [
105
- styles.button,
106
- { backgroundColor: theme.colors.background },
107
- ];
108
-
109
- return (
110
- <View style={containerStyle} accessibilityLabel={title}>
111
- {/* ── Header: Back Button, Live Badge, Menu ── */}
112
- {showHeader && (
113
- <View style={styles.header} pointerEvents="box-none">
114
- {/* Left: Back Button */}
115
- <View style={styles.headerLeft}>
116
- {showSkeleton ? (
117
- <SkeletonPlaceholder
118
- backgroundColor={theme.colors.skeletonBaseColor}
119
- highlightColor={theme.colors.skeletonHighlightColor}
120
- speed={800}
121
- >
122
- <SkeletonPlaceholder.Item {...styles.roundBtnSkeletonItem} />
123
- </SkeletonPlaceholder>
124
- ) : (
125
- onBackPress && (
126
- <BackBtn
127
- theme={themeOverride}
128
- onPress={onBackPress}
129
- style={backBtnStyle}
130
- size={scale(32)}
131
- />
132
- )
133
- )}
134
-
135
- {shouldShowLiveBadge && (
136
- <LiveBadge
137
- theme={theme}
138
- size="large"
139
- style={styles.liveBadgeInline}
140
- />
141
- )}
142
- </View>
143
-
144
- {/* Right: Menu Button */}
145
- <View style={styles.headerRight}>
146
- {menuActions &&
147
- (showSkeleton ? (
148
- <SkeletonPlaceholder
149
- backgroundColor={theme.colors.skeletonBaseColor}
150
- highlightColor={theme.colors.skeletonHighlightColor}
151
- speed={800}
152
- >
153
- <SkeletonPlaceholder.Item
154
- {...styles.roundBtnSkeletonItem}
155
- />
156
- </SkeletonPlaceholder>
157
- ) : (
158
- <MenuBtn
159
- style={styles.button}
160
- theme={themeOverride}
161
- actions={menuActions}
162
- />
163
- ))}
164
- </View>
165
- </View>
166
- )}
167
-
168
- {/* ── Background: Gradient + Image + Badges ── */}
169
- {!showSkeleton && (
170
- <LinearGradient
171
- colors={gradientColors}
172
- style={styles.gradient}
173
- start={{ x: 0, y: 1 }}
174
- end={{ x: 0, y: 0 }}
175
- />
176
- )}
177
-
178
- {!isLoading && (
179
- <>
180
- <View style={styles.imageContainer}>
181
- <FastImage
182
- style={StyleSheet.absoluteFill as ImageStyle}
183
- source={imageSource}
184
- resizeMode={FastImage.resizeMode.cover}
185
- onLoad={handleImageLoad}
186
- onError={handleImageError}
187
- accessibilityLabel={`Background image for ${title}`}
188
- />
189
- </View>
190
-
191
- {content_offering_type === 'FREE' && (
192
- <View style={badgeStyle}>
193
- <Text
194
- type="caption"
195
- style={badgeTextStyle}
196
- theme={themeOverride}
197
- >
198
- {content_offering_type}
199
- </Text>
200
- </View>
201
- )}
202
-
203
- {content_offering_type && (
204
- <RentOrBuyIcon
205
- size={30}
206
- theme={theme}
207
- style={styles.rentOrBuyIcon}
208
- content_offering_type={content_offering_type}
209
- />
210
- )}
211
- </>
212
- )}
213
-
214
- {/* ── Skeleton: Play + Trailer placeholders ── */}
215
- {showSkeleton && !imageError && onPressPlay && (
216
- <>
217
- <View style={styles.skeletonContainer}>
218
- <SkeletonPlaceholder
219
- backgroundColor={theme.colors.skeletonBaseColor}
220
- highlightColor={theme.colors.skeletonHighlightColor}
221
- speed={800}
222
- >
223
- <SkeletonPlaceholder.Item {...styles.skeletonPlayWrapper}>
224
- <SkeletonPlaceholder.Item {...styles.skeletonPlayCircle} />
225
- </SkeletonPlaceholder.Item>
226
- </SkeletonPlaceholder>
227
- </View>
228
-
229
- {!isLiveStream && (
230
- <View style={styles.trailerButtonWrapper}>
231
- <SkeletonPlaceholder
232
- backgroundColor={theme.colors.skeletonBaseColor}
233
- highlightColor={theme.colors.skeletonHighlightColor}
234
- speed={800}
235
- >
236
- <SkeletonPlaceholder.Item {...styles.skeletonTrailerBtn} />
237
- </SkeletonPlaceholder>
238
- </View>
239
- )}
240
- </>
241
- )}
242
-
243
- {/* ── Center: Play Button ── */}
244
- {/* ── Footer: Trailer Button ── */}
245
- {!showSkeleton && !imageError && onPressPlay && (
246
- <>
247
- <Animated.View style={styles.centeredContent}>
248
- <PlayButton
249
- color={theme.colors.buttonText}
250
- backgroundColor={theme.colors.button}
251
- onPress={() => handlePressPlay({ is_trailer: false })}
252
- />
253
- </Animated.View>
254
-
255
- {!isLiveStream && (
256
- <Animated.View style={styles.trailerButtonWrapper}>
257
- <TrailerButton
258
- color={theme.colors.buttonText}
259
- backgroundColor={theme.colors.button}
260
- onPress={() => handlePressPlay({ is_trailer: true })}
261
- />
262
- </Animated.View>
263
- )}
264
- </>
265
- )}
266
-
267
- {/* ── Error: Image load failure ── */}
268
- {imageError && !isLoading && (
269
- <Animated.View style={styles.errorContainer}>
270
- <Text
271
- style={[styles.errorText, { color: theme.colors.textSecondary }]}
272
- >
273
- Failed to load image
274
- </Text>
275
- </Animated.View>
276
- )}
277
- </View>
278
- );
279
- }
280
- );
281
-
282
- // ─── Styles ──────────────────────────────────────────────────────────────────
283
-
284
- const styles = StyleSheet.create({
285
- // Layout
286
- container: {
287
- height: BANNER_HEIGHT,
288
- width: '100%',
289
- overflow: 'hidden',
290
- position: 'relative',
291
- },
292
- imageContainer: {
293
- ...StyleSheet.absoluteFill,
294
- zIndex: 0,
295
- },
296
- gradient: {
297
- ...StyleSheet.absoluteFill,
298
- zIndex: 1,
299
- },
300
-
301
- button: {
302
- position: 'static',
303
- left: scale(0),
304
- },
305
- // Header
306
- header: {
307
- position: 'absolute',
308
- top: 0,
309
- left: 0,
310
- right: 0,
311
- zIndex: 15,
312
- flexDirection: 'row',
313
- alignItems: 'center',
314
- paddingHorizontal: scale(8),
315
- paddingTop: verticalScale(8),
316
- },
317
- headerLeft: {
318
- flex: 1,
319
- alignItems: 'center',
320
- gap: scale(7),
321
- flexDirection: 'row',
322
- },
323
-
324
- headerRight: {
325
- flex: 1,
326
- alignItems: 'flex-end',
327
- },
328
- liveBadgeInline: {
329
- position: 'relative',
330
- top: 0,
331
- left: 0,
332
- },
333
-
334
- // Center (Play button)
335
- centeredContent: {
336
- ...StyleSheet.absoluteFill,
337
- justifyContent: 'center',
338
- alignItems: 'center',
339
- zIndex: 4,
340
- pointerEvents: 'box-none',
341
- },
342
-
343
- // Footer (Trailer button)
344
- trailerButtonWrapper: {
345
- ...StyleSheet.absoluteFill,
346
- justifyContent: 'flex-end',
347
- alignItems: 'center',
348
- bottom: verticalScale(10),
349
- zIndex: 4,
350
- pointerEvents: 'box-none',
351
- },
352
-
353
- // Badges & Icons
354
- badge: {
355
- position: 'absolute',
356
- bottom: verticalScale(20),
357
- left: scale(10),
358
- paddingHorizontal: scale(8),
359
- paddingVertical: scale(4),
360
- borderRadius: scale(8),
361
- zIndex: 2,
362
- },
363
- badgeText: {
364
- fontWeight: '600',
365
- },
366
- rentOrBuyIcon: {
367
- position: 'absolute',
368
- bottom: verticalScale(20),
369
- left: scale(10),
370
- zIndex: 2,
371
- },
372
-
373
- // Skeleton
374
- skeletonContainer: {
375
- ...StyleSheet.absoluteFill,
376
- justifyContent: 'center',
377
- alignItems: 'center',
378
- zIndex: 2,
379
- },
380
- skeletonPlayWrapper: {
381
- width: '100%',
382
- height: '100%',
383
- justifyContent: 'center',
384
- alignItems: 'center',
385
- },
386
- skeletonPlayCircle: {
387
- width: SKELETON_CIRCLE_SIZE,
388
- height: SKELETON_CIRCLE_SIZE,
389
- borderRadius: SKELETON_CIRCLE_SIZE / 2,
390
- },
391
- skeletonTrailerBtn: {
392
- width: scale(110),
393
- height: verticalScale(25),
394
- borderRadius: scale(14),
395
- },
396
- roundBtnSkeletonItem: {
397
- width: BACK_BTN_SIZE,
398
- height: BACK_BTN_SIZE,
399
- borderRadius: BACK_BTN_SIZE / 2,
400
- },
401
-
402
- // Error
403
- errorContainer: {
404
- ...StyleSheet.absoluteFill,
405
- justifyContent: 'center',
406
- alignItems: 'center',
407
- zIndex: 1,
408
- },
409
- errorText: {
410
- fontSize: RFValue(15),
411
- textAlign: 'center',
412
- },
413
- });