@zezosoft/zezo-ott-react-native-ui-kit 1.0.3 → 1.0.5

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 (265) hide show
  1. package/README.md +1 -1
  2. package/lib/module/assets/animations/Failed.json +2103 -0
  3. package/lib/module/assets/animations/Pending.json +522 -0
  4. package/lib/module/assets/animations/Successful.json +2289 -0
  5. package/lib/module/assets/animations/heart.json +788 -0
  6. package/lib/module/components/Alert/AlertDialog.js +208 -0
  7. package/lib/module/components/Alert/AlertDialog.js.map +1 -0
  8. package/lib/module/components/Alert/index.js +1 -0
  9. package/lib/module/components/Alert/index.js.map +1 -1
  10. package/lib/module/components/Auth/AuthProvider/AuthProvider.js +270 -0
  11. package/lib/module/components/Auth/AuthProvider/AuthProvider.js.map +1 -0
  12. package/lib/module/components/Auth/QrLogin/QrLogin.js +267 -0
  13. package/lib/module/components/Auth/QrLogin/QrLogin.js.map +1 -0
  14. package/lib/module/components/Auth/QrLogin/components/QrViewArea.js +178 -0
  15. package/lib/module/components/Auth/QrLogin/components/QrViewArea.js.map +1 -0
  16. package/lib/module/components/Auth/SplashScreen/SplashScreen.js +63 -65
  17. package/lib/module/components/Auth/SplashScreen/SplashScreen.js.map +1 -1
  18. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js +82 -41
  19. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js.map +1 -1
  20. package/lib/module/components/Auth/index.js +5 -1
  21. package/lib/module/components/Auth/index.js.map +1 -1
  22. package/lib/module/components/BackgroundLayout/BackgroundLayout.js +3 -3
  23. package/lib/module/components/BackgroundLayout/BackgroundLayout.js.map +1 -1
  24. package/lib/module/components/Button/SecondaryBtn.js +91 -0
  25. package/lib/module/components/Button/SecondaryBtn.js.map +1 -0
  26. package/lib/module/components/Button/index.js +2 -0
  27. package/lib/module/components/Button/index.js.map +1 -1
  28. package/lib/module/components/Content/Card/NowWatching/NowWatching.js +6 -3
  29. package/lib/module/components/Content/Card/NowWatching/NowWatching.js.map +1 -1
  30. package/lib/module/components/Content/Card/Sliders/Styles/One.js +4 -1
  31. package/lib/module/components/Content/Card/Sliders/Styles/One.js.map +1 -1
  32. package/lib/module/components/Content/Card/Sliders/Styles/Two.js +4 -1
  33. package/lib/module/components/Content/Card/Sliders/Styles/Two.js.map +1 -1
  34. package/lib/module/components/Content/Card/Styles/Five.js +1 -0
  35. package/lib/module/components/Content/Card/Styles/Five.js.map +1 -1
  36. package/lib/module/components/Content/Card/Styles/Four.js +1 -0
  37. package/lib/module/components/Content/Card/Styles/Four.js.map +1 -1
  38. package/lib/module/components/Content/Card/Styles/One.js +7 -3
  39. package/lib/module/components/Content/Card/Styles/One.js.map +1 -1
  40. package/lib/module/components/Content/Card/Styles/RotateInOut.js +1 -0
  41. package/lib/module/components/Content/Card/Styles/RotateInOut.js.map +1 -1
  42. package/lib/module/components/Content/Card/Styles/Six.js +4 -1
  43. package/lib/module/components/Content/Card/Styles/Six.js.map +1 -1
  44. package/lib/module/components/Content/Card/Styles/Three.js +1 -0
  45. package/lib/module/components/Content/Card/Styles/Three.js.map +1 -1
  46. package/lib/module/components/Content/Card/Styles/TopTen.js +1 -0
  47. package/lib/module/components/Content/Card/Styles/TopTen.js.map +1 -1
  48. package/lib/module/components/Content/Card/Styles/Two.js +1 -0
  49. package/lib/module/components/Content/Card/Styles/Two.js.map +1 -1
  50. package/lib/module/components/Content/Card/components/CardPoster.js +12 -28
  51. package/lib/module/components/Content/Card/components/CardPoster.js.map +1 -1
  52. package/lib/module/components/Content/Card/components/RentOrBuyIcon.js +116 -0
  53. package/lib/module/components/Content/Card/components/RentOrBuyIcon.js.map +1 -0
  54. package/lib/module/components/Content/Card/components/ThumbnailCard.js +1 -2
  55. package/lib/module/components/Content/Card/components/ThumbnailCard.js.map +1 -1
  56. package/lib/module/components/ContentView/ContentView.js +1 -0
  57. package/lib/module/components/ContentView/ContentView.js.map +1 -1
  58. package/lib/module/components/ContentView/MoreContentList.js +1 -0
  59. package/lib/module/components/ContentView/MoreContentList.js.map +1 -1
  60. package/lib/module/components/ContentView/components/EpisodeCard.js +6 -10
  61. package/lib/module/components/ContentView/components/EpisodeCard.js.map +1 -1
  62. package/lib/module/components/ContentView/components/HeroBanner.js +17 -5
  63. package/lib/module/components/ContentView/components/HeroBanner.js.map +1 -1
  64. package/lib/module/components/Headers/AppHeader.js +1 -1
  65. package/lib/module/components/Headers/AppHeader.js.map +1 -1
  66. package/lib/module/components/Headers/One.js +1 -1
  67. package/lib/module/components/Headers/One.js.map +1 -1
  68. package/lib/module/components/Headers/Two.js +1 -1
  69. package/lib/module/components/Headers/Two.js.map +1 -1
  70. package/lib/module/components/Logo/Logo.js +5 -5
  71. package/lib/module/components/Logo/Logo.js.map +1 -1
  72. package/lib/module/components/Reels/ReelsSeries/Model/Episodes.js +110 -0
  73. package/lib/module/components/Reels/ReelsSeries/Model/Episodes.js.map +1 -0
  74. package/lib/module/components/Reels/ReelsSeries/Model/Synopsis.js +212 -0
  75. package/lib/module/components/Reels/ReelsSeries/Model/Synopsis.js.map +1 -0
  76. package/lib/module/components/Reels/ReelsSeries/ReelSeriesDetailsModal.js +182 -0
  77. package/lib/module/components/Reels/ReelsSeries/ReelSeriesDetailsModal.js.map +1 -0
  78. package/lib/module/components/Reels/ReelsSeries/ReelSeriesOverlay.js +203 -0
  79. package/lib/module/components/Reels/ReelsSeries/ReelSeriesOverlay.js.map +1 -0
  80. package/lib/module/components/Reels/ReelsSeries/ReelsSeries.js +121 -0
  81. package/lib/module/components/Reels/ReelsSeries/ReelsSeries.js.map +1 -0
  82. package/lib/module/components/Reels/ReelsSeries/ReelsSeriesItem.js +290 -0
  83. package/lib/module/components/Reels/ReelsSeries/ReelsSeriesItem.js.map +1 -0
  84. package/lib/module/components/Reels/ReelsSeries/types.js +2 -0
  85. package/lib/module/components/Reels/ReelsSeries/types.js.map +1 -0
  86. package/lib/module/components/Reels/index.js +11 -0
  87. package/lib/module/components/Reels/index.js.map +1 -0
  88. package/lib/module/components/Subscription/SubOne.js +2 -2
  89. package/lib/module/components/Subscription/SubOne.js.map +1 -1
  90. package/lib/module/components/User/DeviceSessions/DeviceSessions.js +8 -0
  91. package/lib/module/components/User/DeviceSessions/DeviceSessions.js.map +1 -1
  92. package/lib/module/components/User/ProfileUpdate/ProfileUpdate.js +255 -0
  93. package/lib/module/components/User/ProfileUpdate/ProfileUpdate.js.map +1 -0
  94. package/lib/module/components/User/WatchHistory/WatchHistory.js +1 -0
  95. package/lib/module/components/User/WatchHistory/WatchHistory.js.map +1 -1
  96. package/lib/module/components/User/WatchLater/WatchLater.js +1 -0
  97. package/lib/module/components/User/WatchLater/WatchLater.js.map +1 -1
  98. package/lib/module/components/User/components/UserAvatar.js +35 -8
  99. package/lib/module/components/User/components/UserAvatar.js.map +1 -1
  100. package/lib/module/components/User/components/UserSection.js +8 -13
  101. package/lib/module/components/User/components/UserSection.js.map +1 -1
  102. package/lib/module/components/User/index.js +2 -1
  103. package/lib/module/components/User/index.js.map +1 -1
  104. package/lib/module/components/index.js +1 -0
  105. package/lib/module/components/index.js.map +1 -1
  106. package/lib/module/hooks/useSplashCache.js +117 -0
  107. package/lib/module/hooks/useSplashCache.js.map +1 -0
  108. package/lib/module/store/RecentSearchesStore.js +0 -1
  109. package/lib/module/store/RecentSearchesStore.js.map +1 -1
  110. package/lib/module/theme/ThemeProvider.js +13 -10
  111. package/lib/module/theme/ThemeProvider.js.map +1 -1
  112. package/lib/module/theme/themes.js +2 -0
  113. package/lib/module/theme/themes.js.map +1 -1
  114. package/lib/module/utils/Formater.js +17 -0
  115. package/lib/module/utils/Formater.js.map +1 -0
  116. package/lib/typescript/src/components/Alert/AlertDialog.d.ts +18 -0
  117. package/lib/typescript/src/components/Alert/AlertDialog.d.ts.map +1 -0
  118. package/lib/typescript/src/components/Alert/index.d.ts +1 -0
  119. package/lib/typescript/src/components/Alert/index.d.ts.map +1 -1
  120. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts +35 -0
  121. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts.map +1 -0
  122. package/lib/typescript/src/components/Auth/QrLogin/QrLogin.d.ts +32 -0
  123. package/lib/typescript/src/components/Auth/QrLogin/QrLogin.d.ts.map +1 -0
  124. package/lib/typescript/src/components/Auth/QrLogin/components/QrViewArea.d.ts +15 -0
  125. package/lib/typescript/src/components/Auth/QrLogin/components/QrViewArea.d.ts.map +1 -0
  126. package/lib/typescript/src/components/Auth/SplashScreen/SplashScreen.d.ts +4 -3
  127. package/lib/typescript/src/components/Auth/SplashScreen/SplashScreen.d.ts.map +1 -1
  128. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.d.ts +1 -1
  129. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.d.ts.map +1 -1
  130. package/lib/typescript/src/components/Auth/index.d.ts +3 -0
  131. package/lib/typescript/src/components/Auth/index.d.ts.map +1 -1
  132. package/lib/typescript/src/components/BackgroundLayout/BackgroundLayout.d.ts.map +1 -1
  133. package/lib/typescript/src/components/Button/SecondaryBtn.d.ts +21 -0
  134. package/lib/typescript/src/components/Button/SecondaryBtn.d.ts.map +1 -0
  135. package/lib/typescript/src/components/Button/index.d.ts +11 -0
  136. package/lib/typescript/src/components/Button/index.d.ts.map +1 -1
  137. package/lib/typescript/src/components/Content/Card/NowWatching/NowWatching.d.ts.map +1 -1
  138. package/lib/typescript/src/components/Content/Card/Sliders/Styles/One.d.ts.map +1 -1
  139. package/lib/typescript/src/components/Content/Card/Sliders/Styles/Two.d.ts.map +1 -1
  140. package/lib/typescript/src/components/Content/Card/Styles/Five.d.ts.map +1 -1
  141. package/lib/typescript/src/components/Content/Card/Styles/Four.d.ts.map +1 -1
  142. package/lib/typescript/src/components/Content/Card/Styles/One.d.ts.map +1 -1
  143. package/lib/typescript/src/components/Content/Card/Styles/RotateInOut.d.ts.map +1 -1
  144. package/lib/typescript/src/components/Content/Card/Styles/Six.d.ts.map +1 -1
  145. package/lib/typescript/src/components/Content/Card/Styles/Three.d.ts.map +1 -1
  146. package/lib/typescript/src/components/Content/Card/Styles/TopTen.d.ts.map +1 -1
  147. package/lib/typescript/src/components/Content/Card/Styles/Two.d.ts.map +1 -1
  148. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts +4 -2
  149. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts.map +1 -1
  150. package/lib/typescript/src/components/Content/Card/components/RentOrBuyIcon.d.ts +14 -0
  151. package/lib/typescript/src/components/Content/Card/components/RentOrBuyIcon.d.ts.map +1 -0
  152. package/lib/typescript/src/components/ContentView/ContentView.d.ts.map +1 -1
  153. package/lib/typescript/src/components/ContentView/MoreContentList.d.ts.map +1 -1
  154. package/lib/typescript/src/components/ContentView/components/EpisodeCard.d.ts.map +1 -1
  155. package/lib/typescript/src/components/ContentView/components/HeroBanner.d.ts +1 -1
  156. package/lib/typescript/src/components/ContentView/components/HeroBanner.d.ts.map +1 -1
  157. package/lib/typescript/src/components/Logo/Logo.d.ts.map +1 -1
  158. package/lib/typescript/src/components/Reels/ReelsSeries/Model/Episodes.d.ts +12 -0
  159. package/lib/typescript/src/components/Reels/ReelsSeries/Model/Episodes.d.ts.map +1 -0
  160. package/lib/typescript/src/components/Reels/ReelsSeries/Model/Synopsis.d.ts +9 -0
  161. package/lib/typescript/src/components/Reels/ReelsSeries/Model/Synopsis.d.ts.map +1 -0
  162. package/lib/typescript/src/components/Reels/ReelsSeries/ReelSeriesDetailsModal.d.ts +13 -0
  163. package/lib/typescript/src/components/Reels/ReelsSeries/ReelSeriesDetailsModal.d.ts.map +1 -0
  164. package/lib/typescript/src/components/Reels/ReelsSeries/ReelSeriesOverlay.d.ts +18 -0
  165. package/lib/typescript/src/components/Reels/ReelsSeries/ReelSeriesOverlay.d.ts.map +1 -0
  166. package/lib/typescript/src/components/Reels/ReelsSeries/ReelsSeries.d.ts +15 -0
  167. package/lib/typescript/src/components/Reels/ReelsSeries/ReelsSeries.d.ts.map +1 -0
  168. package/lib/typescript/src/components/Reels/ReelsSeries/ReelsSeriesItem.d.ts +18 -0
  169. package/lib/typescript/src/components/Reels/ReelsSeries/ReelsSeriesItem.d.ts.map +1 -0
  170. package/lib/typescript/src/components/Reels/ReelsSeries/types.d.ts +24 -0
  171. package/lib/typescript/src/components/Reels/ReelsSeries/types.d.ts.map +1 -0
  172. package/lib/typescript/src/components/Reels/index.d.ts +8 -0
  173. package/lib/typescript/src/components/Reels/index.d.ts.map +1 -0
  174. package/lib/typescript/src/components/Subscription/SubOne.d.ts.map +1 -1
  175. package/lib/typescript/src/components/User/DeviceSessions/DeviceSessions.d.ts +1 -0
  176. package/lib/typescript/src/components/User/DeviceSessions/DeviceSessions.d.ts.map +1 -1
  177. package/lib/typescript/src/components/User/ProfileUpdate/ProfileUpdate.d.ts +27 -0
  178. package/lib/typescript/src/components/User/ProfileUpdate/ProfileUpdate.d.ts.map +1 -0
  179. package/lib/typescript/src/components/User/WatchHistory/WatchHistory.d.ts.map +1 -1
  180. package/lib/typescript/src/components/User/WatchLater/WatchLater.d.ts.map +1 -1
  181. package/lib/typescript/src/components/User/components/UserAvatar.d.ts +4 -0
  182. package/lib/typescript/src/components/User/components/UserAvatar.d.ts.map +1 -1
  183. package/lib/typescript/src/components/User/components/UserSection.d.ts.map +1 -1
  184. package/lib/typescript/src/components/User/index.d.ts +2 -1
  185. package/lib/typescript/src/components/User/index.d.ts.map +1 -1
  186. package/lib/typescript/src/components/index.d.ts +1 -0
  187. package/lib/typescript/src/components/index.d.ts.map +1 -1
  188. package/lib/typescript/src/hooks/useSplashCache.d.ts +22 -0
  189. package/lib/typescript/src/hooks/useSplashCache.d.ts.map +1 -0
  190. package/lib/typescript/src/store/RecentSearchesStore.d.ts.map +1 -1
  191. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  192. package/lib/typescript/src/theme/themes.d.ts +1 -0
  193. package/lib/typescript/src/theme/themes.d.ts.map +1 -1
  194. package/lib/typescript/src/types/content/content-view.types.d.ts +1 -0
  195. package/lib/typescript/src/types/content/content-view.types.d.ts.map +1 -1
  196. package/lib/typescript/src/utils/Formater.d.ts +2 -0
  197. package/lib/typescript/src/utils/Formater.d.ts.map +1 -0
  198. package/package.json +13 -5
  199. package/src/assets/animations/Failed.json +2103 -0
  200. package/src/assets/animations/Pending.json +522 -0
  201. package/src/assets/animations/Successful.json +2289 -0
  202. package/src/assets/animations/heart.json +788 -0
  203. package/src/components/Alert/AlertDialog.tsx +247 -0
  204. package/src/components/Alert/index.ts +1 -0
  205. package/src/components/Auth/AuthProvider/AuthProvider.tsx +344 -0
  206. package/src/components/Auth/QrLogin/QrLogin.tsx +306 -0
  207. package/src/components/Auth/QrLogin/components/QrViewArea.tsx +213 -0
  208. package/src/components/Auth/SplashScreen/SplashScreen.tsx +89 -80
  209. package/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.tsx +90 -40
  210. package/src/components/Auth/index.ts +4 -0
  211. package/src/components/BackgroundLayout/BackgroundLayout.tsx +3 -3
  212. package/src/components/Button/SecondaryBtn.tsx +116 -0
  213. package/src/components/Button/index.ts +2 -0
  214. package/src/components/Content/Card/NowWatching/NowWatching.tsx +4 -0
  215. package/src/components/Content/Card/Sliders/Styles/One.tsx +2 -0
  216. package/src/components/Content/Card/Sliders/Styles/Two.tsx +2 -0
  217. package/src/components/Content/Card/Styles/Five.tsx +1 -0
  218. package/src/components/Content/Card/Styles/Four.tsx +1 -0
  219. package/src/components/Content/Card/Styles/One.tsx +7 -1
  220. package/src/components/Content/Card/Styles/RotateInOut.tsx +1 -0
  221. package/src/components/Content/Card/Styles/Six.tsx +2 -0
  222. package/src/components/Content/Card/Styles/Three.tsx +1 -0
  223. package/src/components/Content/Card/Styles/TopTen.tsx +1 -0
  224. package/src/components/Content/Card/Styles/Two.tsx +1 -0
  225. package/src/components/Content/Card/components/CardPoster.tsx +23 -51
  226. package/src/components/Content/Card/components/RentOrBuyIcon.tsx +109 -0
  227. package/src/components/Content/Card/components/ThumbnailCard.tsx +1 -2
  228. package/src/components/ContentView/ContentView.tsx +1 -0
  229. package/src/components/ContentView/MoreContentList.tsx +1 -0
  230. package/src/components/ContentView/components/EpisodeCard.tsx +4 -9
  231. package/src/components/ContentView/components/HeroBanner.tsx +16 -0
  232. package/src/components/Headers/AppHeader.tsx +1 -1
  233. package/src/components/Headers/One.tsx +1 -1
  234. package/src/components/Headers/Two.tsx +1 -1
  235. package/src/components/Logo/Logo.tsx +5 -7
  236. package/src/components/Reels/ReelsSeries/Model/Episodes.tsx +133 -0
  237. package/src/components/Reels/ReelsSeries/Model/Synopsis.tsx +242 -0
  238. package/src/components/Reels/ReelsSeries/ReelSeriesDetailsModal.tsx +209 -0
  239. package/src/components/Reels/ReelsSeries/ReelSeriesOverlay.tsx +185 -0
  240. package/src/components/Reels/ReelsSeries/ReelsSeries.tsx +163 -0
  241. package/src/components/Reels/ReelsSeries/ReelsSeriesItem.tsx +333 -0
  242. package/src/components/Reels/ReelsSeries/types.ts +27 -0
  243. package/src/components/Reels/index.ts +8 -0
  244. package/src/components/Subscription/SubOne.tsx +4 -2
  245. package/src/components/User/DeviceSessions/DeviceSessions.tsx +11 -0
  246. package/src/components/User/ProfileUpdate/ProfileUpdate.tsx +263 -0
  247. package/src/components/User/WatchHistory/WatchHistory.tsx +1 -0
  248. package/src/components/User/WatchLater/WatchLater.tsx +1 -0
  249. package/src/components/User/components/UserAvatar.tsx +36 -3
  250. package/src/components/User/components/UserSection.tsx +10 -13
  251. package/src/components/User/index.ts +3 -1
  252. package/src/components/index.ts +1 -0
  253. package/src/hooks/useSplashCache.ts +166 -0
  254. package/src/store/RecentSearchesStore.ts +0 -1
  255. package/src/theme/ThemeProvider.tsx +12 -9
  256. package/src/theme/themes.ts +3 -0
  257. package/src/types/content/content-view.types.ts +1 -0
  258. package/src/utils/Formater.ts +14 -0
  259. package/lib/module/hooks/useInitSplashCacheSync.js +0 -116
  260. package/lib/module/hooks/useInitSplashCacheSync.js.map +0 -1
  261. package/lib/typescript/src/hooks/useInitSplashCacheSync.d.ts +0 -22
  262. package/lib/typescript/src/hooks/useInitSplashCacheSync.d.ts.map +0 -1
  263. package/src/hooks/useInitSplashCacheSync.ts +0 -174
  264. /package/lib/module/assets/{img → svg}/h.svg +0 -0
  265. /package/src/assets/{img → svg}/h.svg +0 -0
@@ -130,6 +130,7 @@ const MovieCard: React.FC<MovieCardProps> = ({
130
130
  ({ item, index }: ListRenderItemInfo<IContentData>) => {
131
131
  return (
132
132
  <TouchableOpacity
133
+ key={item._id}
133
134
  style={[styles.item, itemStyle]}
134
135
  onPress={() => handleItemPress(item)}
135
136
  activeOpacity={0.8}
@@ -138,6 +139,8 @@ const MovieCard: React.FC<MovieCardProps> = ({
138
139
  renderItemImage({ item, index })
139
140
  ) : (
140
141
  <CardPoster
142
+ key={item._id}
143
+ content_offering_type={item.content_offering_type}
141
144
  posterUri={item.poster}
142
145
  theme={appliedTheme}
143
146
  borderRadius={borderRadius}
@@ -233,7 +236,7 @@ const MovieCard: React.FC<MovieCardProps> = ({
233
236
  ref={flatListRef}
234
237
  data={data}
235
238
  horizontal
236
- keyExtractor={(item, index) => `${item._id}-${index}`}
239
+ keyExtractor={(item, index) => (item._id ? item._id : `item-${index}`)}
237
240
  renderItem={renderItem}
238
241
  showsHorizontalScrollIndicator={false}
239
242
  contentContainerStyle={styles.listContent}
@@ -273,6 +276,9 @@ const getStyles = (
273
276
  borderRadius: radius,
274
277
  backgroundColor: theme.colors.surfaceVariant,
275
278
  },
279
+ imageWrapper: {
280
+ position: 'relative',
281
+ },
276
282
  navigateToMoreContainer: {
277
283
  paddingHorizontal: moderateScale(10),
278
284
  marginBottom: verticalScale(8),
@@ -229,6 +229,7 @@ const RotateCarousel: React.FC<Props> = ({
229
229
  renderItemImage({ item, index })
230
230
  ) : (
231
231
  <CardPoster
232
+ content_offering_type={item.content_offering_type}
232
233
  posterUri={item.poster}
233
234
  theme={appliedTheme}
234
235
  borderRadius={borderRadius}
@@ -33,6 +33,7 @@ import type {
33
33
  MoreFetchData,
34
34
  } from '../../../../types';
35
35
  import { RFValue } from 'react-native-responsive-fontsize';
36
+ import RentOrBuyIcon from '../components/RentOrBuyIcon';
36
37
  const DEFAULT_ITEM_WIDTH = moderateScale(160);
37
38
  const DEFAULT_BORDER_RADIUS = moderateScale(5);
38
39
  const DEFAULT_SKELETON_COUNT = 3;
@@ -123,6 +124,7 @@ const MovieCardSix: React.FC<MovieCardSixProps> = ({
123
124
  onPress={() => handleItemPress(item)}
124
125
  activeOpacity={0.8}
125
126
  >
127
+ <RentOrBuyIcon content_offering_type={item.content_offering_type} />
126
128
  <ThumbnailCard
127
129
  thumbnailUri={item.thumbnail}
128
130
  theme={appliedTheme}
@@ -230,6 +230,7 @@ const MovieCardThree: React.FC<Props> = ({
230
230
  renderItemImage({ item, index })
231
231
  ) : (
232
232
  <CardPoster
233
+ content_offering_type={item.content_offering_type}
233
234
  posterUri={item.poster}
234
235
  theme={appliedTheme}
235
236
  borderRadius={borderRadius}
@@ -132,6 +132,7 @@ const TopTenCard: React.FC<TopTenCardProps> = ({
132
132
  style={styles.imageOverlay}
133
133
  >
134
134
  <CardPoster
135
+ content_offering_type={item.content_offering_type}
135
136
  posterUri={item.poster}
136
137
  isLoading={isLoading}
137
138
  borderRadius={borderRadius}
@@ -144,6 +144,7 @@ const MovieCardTwo: React.FC<MovieCardTwoProps> = ({
144
144
  renderItemImage({ item, index })
145
145
  ) : (
146
146
  <CardPoster
147
+ content_offering_type={item.content_offering_type}
147
148
  posterUri={item.poster}
148
149
  theme={appliedTheme}
149
150
  borderRadius={borderRadius}
@@ -1,29 +1,30 @@
1
1
  import React, { useState, useEffect, useMemo } from 'react';
2
2
  import { View, StyleSheet, type StyleProp, type ViewStyle } from 'react-native';
3
- import type {
4
- ImageStyle as FastImageStyle,
5
- ImageStyle,
6
- ResizeMode,
3
+ import FastImage, {
4
+ type ResizeMode,
5
+ type ImageStyle,
7
6
  } from 'react-native-fast-image';
8
- import FastImage from 'react-native-fast-image';
9
7
  import SkeletonPlaceholder from 'react-native-skeleton-placeholder';
10
8
  import { scale } from 'react-native-size-matters';
11
9
  import { Text } from '../../../Text';
12
10
  import { ImageOff } from 'lucide-react-native';
13
11
  import type { ITheme } from '../../../../theme/themes';
14
- import { RFValue } from 'react-native-responsive-fontsize';
12
+ import type { IContentData } from '../../../../types';
13
+ import RentOrBuyIcon from './RentOrBuyIcon';
15
14
 
16
15
  export type CardPosterProps = {
16
+ content_offering_type?: IContentData['content_offering_type'];
17
17
  posterUri: string;
18
18
  theme: ITheme;
19
19
  isLoading?: boolean;
20
20
  borderRadius?: number;
21
21
  posterWrapperStyle?: StyleProp<ViewStyle>;
22
- imageStyle?: FastImageStyle;
22
+ imageStyle?: ImageStyle;
23
23
  resizeMode?: ResizeMode;
24
24
  };
25
25
 
26
26
  const CardPoster: React.FC<CardPosterProps> = ({
27
+ content_offering_type,
27
28
  posterUri,
28
29
  theme,
29
30
  isLoading = false,
@@ -37,7 +38,6 @@ const CardPoster: React.FC<CardPosterProps> = ({
37
38
 
38
39
  const hasValidPoster = useMemo(() => {
39
40
  if (!posterUri || typeof posterUri !== 'string') return false;
40
-
41
41
  const cleaned = posterUri.trim();
42
42
  return (
43
43
  (cleaned.startsWith('http://') || cleaned.startsWith('https://')) &&
@@ -75,21 +75,21 @@ const CardPoster: React.FC<CardPosterProps> = ({
75
75
  <View
76
76
  style={[
77
77
  styles.posterWrapper,
78
- styles.defaultPosterWrapper,
79
- {
80
- borderRadius,
81
- backgroundColor: theme.colors.background,
82
- shadowColor: theme.colors.shadow,
83
- },
78
+ { borderRadius, backgroundColor: theme.colors.background },
84
79
  posterWrapperStyle,
85
80
  ]}
86
81
  >
82
+ {!showSkeleton && content_offering_type && (
83
+ <RentOrBuyIcon
84
+ key={posterUri}
85
+ content_offering_type={content_offering_type}
86
+ />
87
+ )}
87
88
  {showSkeleton && (
88
89
  <View style={[styles.skeletonWrapper, { borderRadius }]}>
89
90
  <SkeletonPlaceholder
90
91
  backgroundColor={theme.colors.skeletonBaseColor}
91
92
  highlightColor={theme.colors.skeletonHighlightColor}
92
- speed={1000}
93
93
  >
94
94
  <SkeletonPlaceholder.Item
95
95
  style={[styles.skeleton, { borderRadius }]}
@@ -97,7 +97,6 @@ const CardPoster: React.FC<CardPosterProps> = ({
97
97
  </SkeletonPlaceholder>
98
98
  </View>
99
99
  )}
100
-
101
100
  {hasValidPoster && (
102
101
  <FastImage
103
102
  source={{
@@ -112,24 +111,16 @@ const CardPoster: React.FC<CardPosterProps> = ({
112
111
  ]}
113
112
  resizeMode={resizeMode}
114
113
  onLoadStart={() => {
115
- if (hasValidPoster) {
116
- setImageLoading(true);
117
- setImageError(false);
118
- } else {
119
- setImageLoading(false);
120
- setImageError(true);
121
- }
122
- }}
123
- onLoad={() => {
124
- setImageLoading(false);
114
+ setImageLoading(true);
115
+ setImageError(false);
125
116
  }}
117
+ onLoad={() => setImageLoading(false)}
126
118
  onError={() => {
127
119
  setImageLoading(false);
128
120
  setImageError(true);
129
121
  }}
130
122
  />
131
123
  )}
132
-
133
124
  {!showSkeleton && (!hasValidPoster || imageError) && (
134
125
  <View
135
126
  style={[
@@ -144,9 +135,7 @@ const CardPoster: React.FC<CardPosterProps> = ({
144
135
  <View
145
136
  style={[
146
137
  styles.fallback,
147
- {
148
- backgroundColor: theme.colors.errorContainer,
149
- },
138
+ { backgroundColor: theme.colors.errorContainer },
150
139
  ]}
151
140
  >
152
141
  <ImageOff size={scale(18)} color={theme.colors.error} />
@@ -169,30 +158,16 @@ const styles = StyleSheet.create({
169
158
  overflow: 'hidden',
170
159
  position: 'relative',
171
160
  },
172
- defaultPosterWrapper: {
173
- shadowOffset: { width: 0, height: 2 },
174
- shadowOpacity: 0.1,
175
- shadowRadius: 3,
176
- elevation: 2,
177
- },
178
161
  skeletonWrapper: {
179
162
  position: 'absolute',
180
163
  top: 0,
181
164
  left: 0,
182
165
  width: '100%',
183
166
  aspectRatio: 2 / 3,
184
- overflow: 'hidden',
185
- },
186
- skeleton: {
187
- width: '100%',
188
- aspectRatio: 2 / 3,
189
- },
190
- visible: {
191
- opacity: 1,
192
- },
193
- hidden: {
194
- opacity: 0,
195
167
  },
168
+ skeleton: { width: '100%', aspectRatio: 2 / 3 },
169
+ visible: { opacity: 1 },
170
+ hidden: { opacity: 0 },
196
171
  fallbackWrapper: {
197
172
  position: 'absolute',
198
173
  top: 0,
@@ -212,8 +187,5 @@ const styles = StyleSheet.create({
212
187
  alignItems: 'center',
213
188
  justifyContent: 'center',
214
189
  },
215
- fallbackText: {
216
- marginTop: scale(4),
217
- fontSize: RFValue(9),
218
- },
190
+ fallbackText: { marginTop: scale(4), fontSize: 10 },
219
191
  });
@@ -0,0 +1,109 @@
1
+ import React from 'react';
2
+ import { View, StyleSheet, type StyleProp, type ViewStyle } from 'react-native';
3
+ import Svg, { Path } from 'react-native-svg';
4
+ import { scale } from 'react-native-size-matters';
5
+ import type { IContentData } from '../../../../types';
6
+ import type { ITheme } from '../../../../theme/themes';
7
+
8
+ interface RentOrBuyIconProps {
9
+ theme?: ITheme;
10
+ content_offering_type: IContentData['content_offering_type'];
11
+ position?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
12
+ style?: StyleProp<ViewStyle>;
13
+ size?: number;
14
+ }
15
+
16
+ const PremiumIcon: React.FC<{ fillColor: string }> = ({ fillColor }) => (
17
+ <Svg viewBox="0 0 1024 1024" width="100%" height="100%">
18
+ <Path
19
+ transform="translate(507,81)"
20
+ d="M0 0l19 1 15 3 15 6 11 6 13 10 11 11 9 13 8 15 5 17 2 14v15l-3 17-5 15-7 14-9 12-9 10-15 11-16 8-10 4h-3l13 49 12 36 9 24 14 30 9 17 13 21 10 13 11 13 7 8 11 9 10 8 12 7 16 7 21 5h28l16-4 15-5 22-12 12-9 10-8 10-9 9-9 2-3h2l2-4 8-9 13-18 7-10 9-15 11-19 13-27 5-13-5-2-13-12-7-8-7-11-6-15-2-11v-22l5-19 8-15 11-13 10-9 14-8 15-5 14-2h10l14 2 15 5 12 7 11 9 9 10 8 13 5 12 3 7v37l-2 2-4 11-7 13-9 11-7 7-16 10-16 6-10 2-4 16-10 53-11 57-22 115-14 73-11 56-7 37-3 4h-719l-3-9-14-72-23-120-17-88-23-120-1-2-14-3-12-5-10-6-11-9-11-13-9-17-4-12v-35h2l2-9 8-16 4-6 9-10 10-9 15-8 17-5 19-1 15 2 15 5 15 9 13 12 10 14 5 11 4 13 1 6v18l-3 16-7 16-6 9-11 13-13 9 4 10 17 35 10 17 12 19 13 17 8 10 14 15 11 11 14 11 13 9 21 11 19 6 10 2h27l25-6 17-9 9-5 13-11 8-7 5-5 9-10 13-17 13-22 9-16 13-28 8-21 12-35 11-41 3-13-19-8-12-7-10-8-13-13-10-15-7-16-4-15-1-8v-18l3-18 6-16 8-15 9-11 7-8 13-10 12-7 16-6 15-3z"
21
+ fill={fillColor}
22
+ />
23
+ <Path
24
+ transform="translate(785,818)"
25
+ d="M0 0l64 1 15 4 13 8 9 8 9 13 5 13 2 15-2 16-5 12-6 10-9 10-11 7-12 5-10 2h-672l-15-4-12-7-10-9-9-13-5-13-2-11v-9l3-15 8-16 11-12 10-7 11-5 10-2z"
26
+ fill={fillColor}
27
+ />
28
+ </Svg>
29
+ );
30
+
31
+ const BuyOrRentIcon: React.FC<{ fillColor: string }> = ({ fillColor }) => (
32
+ <Svg fill="none" viewBox="5 5 18 18" width="100%" height="100%">
33
+ <Path
34
+ fill={fillColor}
35
+ fillRule="evenodd"
36
+ clipRule="evenodd"
37
+ d="M9.834 9.835H11.2c0-.108-.002-.215-.003-.319-.014-1.424-.024-2.412 2.734-2.412 2.504 0 2.732.453 2.732 2.73l1.365.001c0-3.871-.91-4.099-4.097-4.099h-.21c-3.225-.002-3.709-.002-3.887 4.1zm-.153-.001H7.712a1.976 1.976 0 00-1.976 1.976v6.064a4.252 4.252 0 004.252 4.252h7.886a4.252 4.252 0 004.252-4.252V11.81a1.976 1.976 0 00-1.976-1.976H18.18a.153.153 0 00-.153.153v3.716a.683.683 0 01-1.365 0V9.987a.153.153 0 00-.153-.153h-5.158a.153.153 0 00-.152.153v3.716a.683.683 0 01-1.366 0V9.987a.153.153 0 00-.153-.153z"
38
+ />
39
+ </Svg>
40
+ );
41
+
42
+ const RentOrBuyIcon: React.FC<RentOrBuyIconProps> = ({
43
+ theme,
44
+ content_offering_type,
45
+ style,
46
+ position = 'topLeft',
47
+ size = 22,
48
+ }) => {
49
+ if (!content_offering_type) return null;
50
+
51
+ const typeUpper = content_offering_type.toUpperCase();
52
+ if (!['PREMIUM', 'BUY_OR_RENT'].includes(typeUpper)) return null;
53
+
54
+ const fillColor = theme?.colors.primary || '#CA091E';
55
+
56
+ const positionStyle: ViewStyle = (() => {
57
+ switch (position) {
58
+ case 'topLeft':
59
+ return { top: 6, left: 6 };
60
+ case 'topRight':
61
+ return { top: 6, right: 6 };
62
+ case 'bottomLeft':
63
+ return { bottom: 6, left: 6 };
64
+ case 'bottomRight':
65
+ return { bottom: 6, right: 6 };
66
+ default:
67
+ return { top: 6, left: 6 };
68
+ }
69
+ })();
70
+
71
+ const IconComponent = typeUpper === 'PREMIUM' ? PremiumIcon : BuyOrRentIcon;
72
+
73
+ return (
74
+ <View
75
+ style={[
76
+ styles.container,
77
+ { width: size, height: size },
78
+ style || positionStyle,
79
+ ]}
80
+ >
81
+ <View style={styles.iconWrapper}>
82
+ <IconComponent fillColor={fillColor} />
83
+ </View>
84
+ </View>
85
+ );
86
+ };
87
+
88
+ export default RentOrBuyIcon;
89
+
90
+ const styles = StyleSheet.create({
91
+ container: {
92
+ position: 'absolute',
93
+ zIndex: 10,
94
+ },
95
+ iconWrapper: {
96
+ flex: 1,
97
+ justifyContent: 'center',
98
+ alignItems: 'center',
99
+ backgroundColor: 'white',
100
+ padding: scale(3),
101
+ borderRadius: 40,
102
+ shadowColor: '#000',
103
+ shadowOffset: { width: 0, height: 1 },
104
+ shadowOpacity: 0.2,
105
+ shadowRadius: 2,
106
+ overflow: 'hidden',
107
+ elevation: 3,
108
+ },
109
+ });
@@ -31,7 +31,7 @@ export const ThumbnailCard: React.FC<ThumbnailCardProps> = ({
31
31
  thumbnailUri = '',
32
32
  theme,
33
33
  isLoading = false,
34
- borderRadius = scale(6),
34
+ borderRadius = 0,
35
35
  wrapperStyle,
36
36
  imageStyle,
37
37
  resizeMode = FastImage.resizeMode.cover,
@@ -149,7 +149,6 @@ const styles = StyleSheet.create({
149
149
  left: 0,
150
150
  width: '100%',
151
151
  aspectRatio: 16 / 9,
152
- borderWidth: scale(1),
153
152
  alignItems: 'center',
154
153
  justifyContent: 'center',
155
154
  },
@@ -46,6 +46,7 @@ export const ContentView = ({
46
46
  title={content?.name}
47
47
  theme={appliedTheme}
48
48
  isLoading={isLoading}
49
+ content_offering_type={content?.content_offering_type}
49
50
  onPressPlay={({ is_trailer }) =>
50
51
  events?.onPlay?.({
51
52
  id: content._id,
@@ -83,6 +83,7 @@ const MoreContentList: React.FC<Props> = ({
83
83
  activeOpacity={0.7}
84
84
  >
85
85
  <CardPoster
86
+ content_offering_type={item.content_offering_type}
86
87
  posterUri={item.poster}
87
88
  borderRadius={5}
88
89
  isLoading={false}
@@ -14,6 +14,7 @@ import type { IContentEpisodes, IContentSeasons } from '../../../types';
14
14
  import type { ITheme } from '../../../theme/themes';
15
15
  import { ThumbnailCard } from '../../Content/Card/components/ThumbnailCard';
16
16
  import { RFValue } from 'react-native-responsive-fontsize';
17
+ import RentOrBuyIcon from '../../Content/Card/components/RentOrBuyIcon';
17
18
 
18
19
  // Constants
19
20
  const SKELETON_COUNT = 3;
@@ -200,19 +201,13 @@ const EpisodeCardItem = memo(
200
201
  >
201
202
  <View style={[styles.cardContent, isVerticalMode && styles.cardGrid]}>
202
203
  <View style={thumbnailStyle}>
203
- <FastImage
204
- source={{
205
- uri: episode.thumbnail,
206
- priority: FastImage.priority.high,
207
- }}
208
- style={styles.thumbnail}
209
- resizeMode={FastImage.resizeMode.cover}
210
- fallback
204
+ <RentOrBuyIcon
205
+ content_offering_type={episode.content_offering_type}
211
206
  />
212
207
  <ThumbnailCard
213
208
  thumbnailUri={episode.thumbnail}
214
209
  theme={theme}
215
- wrapperStyle={styles.thumbnail}
210
+ // wrapperStyle={styles.thumbnail}
216
211
  resizeMode={FastImage.resizeMode.cover}
217
212
  />
218
213
  </View>
@@ -16,6 +16,7 @@ import BackBtn from '../../Button/BackBtn';
16
16
  import MenuBtn from '../../Button/MenuBtn';
17
17
  import type { HeroBannerProps } from '../../../types/content/content-view.types';
18
18
  import { RFValue } from 'react-native-responsive-fontsize';
19
+ import RentOrBuyIcon from '../../Content/Card/components/RentOrBuyIcon';
19
20
 
20
21
  const SKELETON_CIRCLE_SIZE = scale(50);
21
22
  const BANNER_HEIGHT = verticalScale(200);
@@ -33,6 +34,7 @@ export const HeroBanner = ({
33
34
  renderButtons,
34
35
  renderSkeletons,
35
36
  menuActions,
37
+ content_offering_type,
36
38
  }: HeroBannerProps) => {
37
39
  const [hasImageLoaded, setHasImageLoaded] = useState(false);
38
40
  const [imageLoadError, setImageLoadError] = useState(false);
@@ -56,6 +58,12 @@ export const HeroBanner = ({
56
58
  position: 'relative',
57
59
  backgroundColor: theme.colors.backgroundDisabled,
58
60
  },
61
+ rentOrBuyIcon: {
62
+ position: 'absolute',
63
+ bottom: verticalScale(20),
64
+ zIndex: 4,
65
+ left: scale(10),
66
+ },
59
67
  centeredContent: {
60
68
  ...StyleSheet.absoluteFillObject,
61
69
  justifyContent: 'center',
@@ -189,6 +197,14 @@ export const HeroBanner = ({
189
197
  {/* Background Image */}
190
198
  {!isLoading && (
191
199
  <View style={styles.imageContainer}>
200
+ {content_offering_type && (
201
+ <RentOrBuyIcon
202
+ size={30}
203
+ style={styles.rentOrBuyIcon}
204
+ content_offering_type={content_offering_type}
205
+ />
206
+ )}
207
+
192
208
  <FastImage
193
209
  style={StyleSheet.absoluteFillObject}
194
210
  source={{
@@ -81,7 +81,7 @@ const AppHeader: React.FC<AppHeaderProps> = ({
81
81
  </View>
82
82
 
83
83
  {/* Right icon */}
84
- {rightIcon ? (
84
+ {rightIcon && onRightPress ? (
85
85
  <TouchableOpacity
86
86
  onPress={onRightPress}
87
87
  activeOpacity={0.7}
@@ -38,7 +38,7 @@ const HeaderOne: React.FC<HeaderOneProps> = ({
38
38
 
39
39
  const iconColor = appliedTheme.colors?.onSurface;
40
40
  const rippleColor = appliedTheme.colors.surfaceVariant + '33';
41
- const pressedBackgroundColor = appliedTheme.colors.backdrop;
41
+ const pressedBackgroundColor = appliedTheme.colors.surfaceVariant;
42
42
 
43
43
  const MemoMenuIcon = useMemo(
44
44
  () => <MenuIcon width={scale(28)} height={scale(28)} color={iconColor} />,
@@ -27,7 +27,7 @@ const HeaderTwo: React.FC<HeaderTwoProps> = ({
27
27
  const { theme: appliedTheme } = useTheme(theme);
28
28
 
29
29
  const rippleColor = appliedTheme.colors.surfaceVariant + '33';
30
- const pressedBackgroundColor = appliedTheme.colors.backdrop;
30
+ const pressedBackgroundColor = appliedTheme.colors.surfaceVariant;
31
31
 
32
32
  return (
33
33
  <View style={styles.headerContainer}>
@@ -12,7 +12,7 @@ import {
12
12
  } from 'react-native';
13
13
  import { moderateScale } from 'react-native-size-matters';
14
14
  import SkeletonPlaceholder from 'react-native-skeleton-placeholder';
15
- import { useInitSplashCacheSync } from '../../hooks/useInitSplashCacheSync';
15
+ import { useSplashCache } from '../../hooks/useSplashCache';
16
16
  import { useTheme } from '../../theme/hook/useTheme';
17
17
  import type { AppTheme } from '../../theme/themes';
18
18
 
@@ -44,16 +44,14 @@ export const Logo: React.FC<ILogoProps> = ({
44
44
  const { theme: appliedTheme } = useTheme(theme);
45
45
 
46
46
  const {
47
- data: { localPathLogo },
47
+ data: { logoPath },
48
48
  isLoading: isSplashLoading,
49
- } = useInitSplashCacheSync({
49
+ } = useSplashCache({
50
50
  logoUrl: logoUri,
51
51
  });
52
- const finalSource = localPathLogo
52
+ const finalSource = logoPath
53
53
  ? {
54
- uri: localPathLogo.startsWith('file://')
55
- ? localPathLogo
56
- : `file://${localPathLogo}`,
54
+ uri: logoPath.startsWith('file://') ? logoPath : `file://${logoPath}`,
57
55
  }
58
56
  : logoUri
59
57
  ? { uri: logoUri }
@@ -0,0 +1,133 @@
1
+ import React from 'react';
2
+ import {
3
+ View,
4
+ Text,
5
+ FlatList,
6
+ StyleSheet,
7
+ Dimensions,
8
+ TouchableOpacity,
9
+ } from 'react-native';
10
+ import { Lock, ChartNoAxesColumnIncreasing } from 'lucide-react-native';
11
+ import { moderateScale, verticalScale } from 'react-native-size-matters';
12
+ import { RFValue } from 'react-native-responsive-fontsize';
13
+ import type { ISeriesEpisode, ISeriesItem } from '../types';
14
+
15
+ const { height, width } = Dimensions.get('window');
16
+ const NUM_COLUMNS = 6;
17
+
18
+ interface EpisodesProps {
19
+ reel: ISeriesEpisode;
20
+ data: ISeriesItem;
21
+ currentReel: number;
22
+ onEpisodeSelect?: (index: number) => void;
23
+ totalReels?: number;
24
+ }
25
+
26
+ const Episodes: React.FC<EpisodesProps> = ({
27
+ data,
28
+ currentReel,
29
+ onEpisodeSelect,
30
+ totalReels = 0,
31
+ }) => {
32
+ const totalBoxes = Math.max(data.episodes?.length || 0, totalReels);
33
+ const EpisodeData = Array.from({ length: totalBoxes }, (_, i) => i + 1);
34
+
35
+ const renderItem = ({ item }: { item: number }) => {
36
+ const isAvailable = item <= (data.episodes.length ?? 0);
37
+ const isActive = item === currentReel + 1;
38
+
39
+ return (
40
+ <TouchableOpacity
41
+ key={`episode-${item}`}
42
+ onPress={() => isAvailable && onEpisodeSelect?.(item - 1)}
43
+ activeOpacity={0.8}
44
+ >
45
+ <View
46
+ style={[
47
+ styles.box,
48
+ {
49
+ backgroundColor: isActive
50
+ ? 'rgba(60,60,60,1)'
51
+ : 'rgba(34,34,34,1)',
52
+ },
53
+ ]}
54
+ >
55
+ <Text style={[styles.number, { color: 'white' }]}>{item}</Text>
56
+
57
+ {!isAvailable && (
58
+ <View
59
+ style={[
60
+ styles.lockContainer,
61
+ { backgroundColor: 'rgba(76,76,76,1)' },
62
+ ]}
63
+ >
64
+ <Lock color={'white'} size={moderateScale(11)} />
65
+ </View>
66
+ )}
67
+
68
+ {isActive && (
69
+ <ChartNoAxesColumnIncreasing
70
+ color={'white'}
71
+ size={moderateScale(16)}
72
+ style={styles.activeIcon}
73
+ />
74
+ )}
75
+ </View>
76
+ </TouchableOpacity>
77
+ );
78
+ };
79
+
80
+ return (
81
+ <FlatList
82
+ data={EpisodeData}
83
+ numColumns={NUM_COLUMNS}
84
+ keyExtractor={(item) => `episode-${item}`}
85
+ renderItem={renderItem}
86
+ contentContainerStyle={[{ paddingBottom: verticalScale(20) }]}
87
+ showsVerticalScrollIndicator={false}
88
+ scrollEnabled={true} // important for modal
89
+ removeClippedSubviews={true} // improves performance
90
+ windowSize={10} // virtualized window
91
+ initialNumToRender={NUM_COLUMNS * 2}
92
+ nestedScrollEnabled={true} // Allows scroll inside modal
93
+ />
94
+ );
95
+ };
96
+
97
+ export default Episodes;
98
+
99
+ const styles = StyleSheet.create({
100
+ box: {
101
+ width:
102
+ (width - moderateScale(8) * 2 - moderateScale(6) * NUM_COLUMNS) /
103
+ NUM_COLUMNS,
104
+ height: (height * 0.52) / 8,
105
+ borderRadius: moderateScale(10),
106
+ justifyContent: 'center',
107
+ alignItems: 'center',
108
+ marginVertical: moderateScale(2.5),
109
+ marginHorizontal: moderateScale(2.5),
110
+ position: 'relative',
111
+ },
112
+ number: {
113
+ fontSize: RFValue(15),
114
+ fontWeight: '600',
115
+ },
116
+ lockContainer: {
117
+ position: 'absolute',
118
+ top: 0,
119
+ right: 0,
120
+ width: moderateScale(18),
121
+ height: moderateScale(18),
122
+ borderRadius: moderateScale(7),
123
+ borderTopLeftRadius: 0,
124
+ borderBottomRightRadius: 0,
125
+ justifyContent: 'center',
126
+ alignItems: 'center',
127
+ },
128
+ activeIcon: {
129
+ position: 'absolute',
130
+ bottom: verticalScale(6),
131
+ left: moderateScale(6),
132
+ },
133
+ });