@zezosoft/zezo-ott-react-native-ui-kit 1.1.1 → 1.1.3

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 (437) hide show
  1. package/lib/module/Styles/globalStyles.js +0 -5
  2. package/lib/module/Styles/globalStyles.js.map +1 -1
  3. package/lib/module/components/Auth/AuthProvider/AuthProvider.js +64 -40
  4. package/lib/module/components/Auth/AuthProvider/AuthProvider.js.map +1 -1
  5. package/lib/module/components/Auth/ForgotPassword/ForgotPassword.js +5 -2
  6. package/lib/module/components/Auth/ForgotPassword/ForgotPassword.js.map +1 -1
  7. package/lib/module/components/Auth/Login/LoginWithEmail.js +17 -11
  8. package/lib/module/components/Auth/Login/LoginWithEmail.js.map +1 -1
  9. package/lib/module/components/Auth/Login/LoginWithPhone.js +12 -6
  10. package/lib/module/components/Auth/Login/LoginWithPhone.js.map +1 -1
  11. package/lib/module/components/Auth/OTP/OTP.js +7 -4
  12. package/lib/module/components/Auth/OTP/OTP.js.map +1 -1
  13. package/lib/module/components/Auth/QrLogin/QrLogin.js +357 -144
  14. package/lib/module/components/Auth/QrLogin/QrLogin.js.map +1 -1
  15. package/lib/module/components/Auth/QrLogin/components/QrViewArea.js +227 -110
  16. package/lib/module/components/Auth/QrLogin/components/QrViewArea.js.map +1 -1
  17. package/lib/module/components/Auth/SignUp/SignUp.js +19 -13
  18. package/lib/module/components/Auth/SignUp/SignUp.js.map +1 -1
  19. package/lib/module/components/Auth/SplashScreen/SplashScreen.js +54 -36
  20. package/lib/module/components/Auth/SplashScreen/SplashScreen.js.map +1 -1
  21. package/lib/module/components/Auth/SplashScreen/components/SplashImage/SplashImage.js +29 -11
  22. package/lib/module/components/Auth/SplashScreen/components/SplashImage/SplashImage.js.map +1 -1
  23. package/lib/module/components/Auth/SplashScreen/components/SplashLottie/SplashLottie.js +13 -7
  24. package/lib/module/components/Auth/SplashScreen/components/SplashLottie/SplashLottie.js.map +1 -1
  25. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js +33 -21
  26. package/lib/module/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.js.map +1 -1
  27. package/lib/module/components/BackgroundLayout/BackgroundLayout.js +26 -20
  28. package/lib/module/components/BackgroundLayout/BackgroundLayout.js.map +1 -1
  29. package/lib/module/components/BlogView/BlogView.js +36 -20
  30. package/lib/module/components/BlogView/BlogView.js.map +1 -1
  31. package/lib/module/components/Button/BackBtn.js +24 -20
  32. package/lib/module/components/Button/BackBtn.js.map +1 -1
  33. package/lib/module/components/Button/PrimaryBtn.js +19 -13
  34. package/lib/module/components/Button/PrimaryBtn.js.map +1 -1
  35. package/lib/module/components/Button/SecondaryBtn.js +19 -13
  36. package/lib/module/components/Button/SecondaryBtn.js.map +1 -1
  37. package/lib/module/components/Button/TextButton.js +19 -13
  38. package/lib/module/components/Button/TextButton.js.map +1 -1
  39. package/lib/module/components/Content/Card/Category/Category.js +151 -46
  40. package/lib/module/components/Content/Card/Category/Category.js.map +1 -1
  41. package/lib/module/components/Content/Card/NowWatching/NowWatching.js +237 -108
  42. package/lib/module/components/Content/Card/NowWatching/NowWatching.js.map +1 -1
  43. package/lib/module/components/Content/Card/Sliders/Styles/One.js +200 -133
  44. package/lib/module/components/Content/Card/Sliders/Styles/One.js.map +1 -1
  45. package/lib/module/components/Content/Card/Sliders/Styles/Two.js +192 -84
  46. package/lib/module/components/Content/Card/Sliders/Styles/Two.js.map +1 -1
  47. package/lib/module/components/Content/Card/Styles/Five.js +131 -48
  48. package/lib/module/components/Content/Card/Styles/Five.js.map +1 -1
  49. package/lib/module/components/Content/Card/Styles/Four.js +126 -59
  50. package/lib/module/components/Content/Card/Styles/Four.js.map +1 -1
  51. package/lib/module/components/Content/Card/Styles/One.js +125 -50
  52. package/lib/module/components/Content/Card/Styles/One.js.map +1 -1
  53. package/lib/module/components/Content/Card/Styles/RotateInOut.js +143 -65
  54. package/lib/module/components/Content/Card/Styles/RotateInOut.js.map +1 -1
  55. package/lib/module/components/Content/Card/Styles/Six.js +207 -115
  56. package/lib/module/components/Content/Card/Styles/Six.js.map +1 -1
  57. package/lib/module/components/Content/Card/Styles/Three.js +134 -79
  58. package/lib/module/components/Content/Card/Styles/Three.js.map +1 -1
  59. package/lib/module/components/Content/Card/Styles/TopTen.js +186 -171
  60. package/lib/module/components/Content/Card/Styles/TopTen.js.map +1 -1
  61. package/lib/module/components/Content/Card/Styles/Two.js +144 -64
  62. package/lib/module/components/Content/Card/Styles/Two.js.map +1 -1
  63. package/lib/module/components/Content/Card/components/AdsPoster.js +162 -0
  64. package/lib/module/components/Content/Card/components/AdsPoster.js.map +1 -0
  65. package/lib/module/components/Content/Card/components/CardPoster.js +139 -93
  66. package/lib/module/components/Content/Card/components/CardPoster.js.map +1 -1
  67. package/lib/module/components/Content/Card/components/RentOrBuyIcon.js +18 -17
  68. package/lib/module/components/Content/Card/components/RentOrBuyIcon.js.map +1 -1
  69. package/lib/module/components/Content/Card/components/ThumbnailCard.js +78 -28
  70. package/lib/module/components/Content/Card/components/ThumbnailCard.js.map +1 -1
  71. package/lib/module/components/Content/Card/components/index.js +4 -0
  72. package/lib/module/components/Content/Card/components/index.js.map +1 -0
  73. package/lib/module/components/Content/Content.js +99 -40
  74. package/lib/module/components/Content/Content.js.map +1 -1
  75. package/lib/module/components/Content/Sections.js +63 -34
  76. package/lib/module/components/Content/Sections.js.map +1 -1
  77. package/lib/module/components/ContentView/ContentView.js +70 -41
  78. package/lib/module/components/ContentView/ContentView.js.map +1 -1
  79. package/lib/module/components/ContentView/MoreContentList.js +74 -40
  80. package/lib/module/components/ContentView/MoreContentList.js.map +1 -1
  81. package/lib/module/components/ContentView/components/AboutSection.js +40 -19
  82. package/lib/module/components/ContentView/components/AboutSection.js.map +1 -1
  83. package/lib/module/components/ContentView/components/CastCard.js +6 -7
  84. package/lib/module/components/ContentView/components/CastCard.js.map +1 -1
  85. package/lib/module/components/ContentView/components/EpisodeCard.js +2 -2
  86. package/lib/module/components/ContentView/components/EpisodeCard.js.map +1 -1
  87. package/lib/module/components/ContentView/components/GenreTags.js +25 -13
  88. package/lib/module/components/ContentView/components/GenreTags.js.map +1 -1
  89. package/lib/module/components/ContentView/components/HeroBanner.js +39 -11
  90. package/lib/module/components/ContentView/components/HeroBanner.js.map +1 -1
  91. package/lib/module/components/ContentView/components/MiniInfo.js +84 -77
  92. package/lib/module/components/ContentView/components/MiniInfo.js.map +1 -1
  93. package/lib/module/components/ContentView/components/PlayButton.js +11 -7
  94. package/lib/module/components/ContentView/components/PlayButton.js.map +1 -1
  95. package/lib/module/components/ContentView/components/Title.js +12 -12
  96. package/lib/module/components/ContentView/components/Title.js.map +1 -1
  97. package/lib/module/components/ContentView/components/TrailerButton.js +12 -7
  98. package/lib/module/components/ContentView/components/TrailerButton.js.map +1 -1
  99. package/lib/module/components/Fallbacks/NoContentFallback.js +27 -22
  100. package/lib/module/components/Fallbacks/NoContentFallback.js.map +1 -1
  101. package/lib/module/components/Fallbacks/NotFoundFallback.js +6 -4
  102. package/lib/module/components/Fallbacks/NotFoundFallback.js.map +1 -1
  103. package/lib/module/components/Headers/AppHeader.js +22 -13
  104. package/lib/module/components/Headers/AppHeader.js.map +1 -1
  105. package/lib/module/components/Headers/Three.js +6 -5
  106. package/lib/module/components/Headers/Three.js.map +1 -1
  107. package/lib/module/components/Headers/Two.js +19 -14
  108. package/lib/module/components/Headers/Two.js.map +1 -1
  109. package/lib/module/components/Input/InputOne.js +46 -31
  110. package/lib/module/components/Input/InputOne.js.map +1 -1
  111. package/lib/module/components/Loader/Loader.js +2 -2
  112. package/lib/module/components/Loader/Loader.js.map +1 -1
  113. package/lib/module/components/Logo/Logo.js +17 -14
  114. package/lib/module/components/Logo/Logo.js.map +1 -1
  115. package/lib/module/components/Search/One.js +2 -1
  116. package/lib/module/components/Search/One.js.map +1 -1
  117. package/lib/module/components/Search/components/SearchCard.js +15 -19
  118. package/lib/module/components/Search/components/SearchCard.js.map +1 -1
  119. package/lib/module/components/Settings/AppSettings.js +97 -62
  120. package/lib/module/components/Settings/AppSettings.js.map +1 -1
  121. package/lib/module/components/Subscription/SubOne.js +313 -254
  122. package/lib/module/components/Subscription/SubOne.js.map +1 -1
  123. package/lib/module/components/Text/Text.js +15 -12
  124. package/lib/module/components/Text/Text.js.map +1 -1
  125. package/lib/module/components/User/DeviceSessions/DeviceSessions.js +25 -23
  126. package/lib/module/components/User/DeviceSessions/DeviceSessions.js.map +1 -1
  127. package/lib/module/components/User/ProfileUpdate/ProfileUpdate.js +23 -18
  128. package/lib/module/components/User/ProfileUpdate/ProfileUpdate.js.map +1 -1
  129. package/lib/module/components/User/PurchaseHistory/PurchaseHistory.js +38 -24
  130. package/lib/module/components/User/PurchaseHistory/PurchaseHistory.js.map +1 -1
  131. package/lib/module/components/User/WatchHistory/WatchHistory.js +21 -14
  132. package/lib/module/components/User/WatchHistory/WatchHistory.js.map +1 -1
  133. package/lib/module/components/User/WatchLater/WatchLater.js +30 -21
  134. package/lib/module/components/User/WatchLater/WatchLater.js.map +1 -1
  135. package/lib/module/components/User/components/UserAvatar.js +38 -19
  136. package/lib/module/components/User/components/UserAvatar.js.map +1 -1
  137. package/lib/module/components/User/components/UserSection.js +37 -17
  138. package/lib/module/components/User/components/UserSection.js.map +1 -1
  139. package/lib/module/components/View/View.js +7 -4
  140. package/lib/module/components/View/View.js.map +1 -1
  141. package/lib/module/components/index.js +0 -1
  142. package/lib/module/components/index.js.map +1 -1
  143. package/lib/module/constants/dummySections.js +44 -4
  144. package/lib/module/constants/dummySections.js.map +1 -1
  145. package/lib/module/hooks/Images/index.js +5 -0
  146. package/lib/module/hooks/Images/index.js.map +1 -0
  147. package/lib/module/hooks/Images/useImageLoader.js +168 -0
  148. package/lib/module/hooks/Images/useImageLoader.js.map +1 -0
  149. package/lib/module/hooks/Images/useImageValidation.js +36 -0
  150. package/lib/module/hooks/Images/useImageValidation.js.map +1 -0
  151. package/lib/module/hooks/index.js +20 -0
  152. package/lib/module/hooks/index.js.map +1 -0
  153. package/lib/module/hooks/useAdTracking.js +270 -0
  154. package/lib/module/hooks/useAdTracking.js.map +1 -0
  155. package/lib/module/hooks/useCards.js +164 -0
  156. package/lib/module/hooks/useCards.js.map +1 -0
  157. package/lib/module/hooks/useDebounce.js +25 -6
  158. package/lib/module/hooks/useDebounce.js.map +1 -1
  159. package/lib/module/hooks/useKeyboard.js +7 -4
  160. package/lib/module/hooks/useKeyboard.js.map +1 -1
  161. package/lib/module/hooks/useNavigationMode.js +10 -4
  162. package/lib/module/hooks/useNavigationMode.js.map +1 -1
  163. package/lib/module/hooks/usePaginatedSection.js +12 -7
  164. package/lib/module/hooks/usePaginatedSection.js.map +1 -1
  165. package/lib/module/hooks/usePrevious.js +30 -0
  166. package/lib/module/hooks/usePrevious.js.map +1 -0
  167. package/lib/module/hooks/useSafeCallback.js +33 -0
  168. package/lib/module/hooks/useSafeCallback.js.map +1 -0
  169. package/lib/module/hooks/useSkeletonItems.js +33 -0
  170. package/lib/module/hooks/useSkeletonItems.js.map +1 -0
  171. package/lib/module/hooks/useSplashCache.js +2 -1
  172. package/lib/module/hooks/useSplashCache.js.map +1 -1
  173. package/lib/module/hooks/useThemeColors.js +33 -0
  174. package/lib/module/hooks/useThemeColors.js.map +1 -0
  175. package/lib/module/theme/ThemeProvider.js +17 -11
  176. package/lib/module/theme/ThemeProvider.js.map +1 -1
  177. package/lib/module/theme/hook/useInternalTheme.js +18 -11
  178. package/lib/module/theme/hook/useInternalTheme.js.map +1 -1
  179. package/lib/module/theme/hook/useThemeStatusBar.js +10 -4
  180. package/lib/module/theme/hook/useThemeStatusBar.js.map +1 -1
  181. package/lib/typescript/src/Styles/globalStyles.d.ts +0 -5
  182. package/lib/typescript/src/Styles/globalStyles.d.ts.map +1 -1
  183. package/lib/typescript/src/components/Auth/AuthProvider/AuthProvider.d.ts.map +1 -1
  184. package/lib/typescript/src/components/Auth/ForgotPassword/ForgotPassword.d.ts.map +1 -1
  185. package/lib/typescript/src/components/Auth/Login/LoginWithEmail.d.ts.map +1 -1
  186. package/lib/typescript/src/components/Auth/Login/LoginWithPhone.d.ts.map +1 -1
  187. package/lib/typescript/src/components/Auth/OTP/OTP.d.ts.map +1 -1
  188. package/lib/typescript/src/components/Auth/QrLogin/QrLogin.d.ts +2 -15
  189. package/lib/typescript/src/components/Auth/QrLogin/QrLogin.d.ts.map +1 -1
  190. package/lib/typescript/src/components/Auth/QrLogin/components/QrViewArea.d.ts +0 -1
  191. package/lib/typescript/src/components/Auth/QrLogin/components/QrViewArea.d.ts.map +1 -1
  192. package/lib/typescript/src/components/Auth/SignUp/SignUp.d.ts.map +1 -1
  193. package/lib/typescript/src/components/Auth/SplashScreen/SplashScreen.d.ts.map +1 -1
  194. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashImage/SplashImage.d.ts.map +1 -1
  195. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashLottie/SplashLottie.d.ts.map +1 -1
  196. package/lib/typescript/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.d.ts.map +1 -1
  197. package/lib/typescript/src/components/Auth/index.d.ts.map +1 -1
  198. package/lib/typescript/src/components/BackgroundLayout/BackgroundLayout.d.ts +1 -1
  199. package/lib/typescript/src/components/BackgroundLayout/BackgroundLayout.d.ts.map +1 -1
  200. package/lib/typescript/src/components/BlogView/BlogView.d.ts +2 -1
  201. package/lib/typescript/src/components/BlogView/BlogView.d.ts.map +1 -1
  202. package/lib/typescript/src/components/Button/BackBtn.d.ts +2 -2
  203. package/lib/typescript/src/components/Button/BackBtn.d.ts.map +1 -1
  204. package/lib/typescript/src/components/Button/PrimaryBtn.d.ts +2 -1
  205. package/lib/typescript/src/components/Button/PrimaryBtn.d.ts.map +1 -1
  206. package/lib/typescript/src/components/Button/SecondaryBtn.d.ts +2 -1
  207. package/lib/typescript/src/components/Button/SecondaryBtn.d.ts.map +1 -1
  208. package/lib/typescript/src/components/Button/TextButton.d.ts +2 -2
  209. package/lib/typescript/src/components/Button/TextButton.d.ts.map +1 -1
  210. package/lib/typescript/src/components/Button/index.d.ts +2 -2
  211. package/lib/typescript/src/components/Content/Card/Category/Category.d.ts.map +1 -1
  212. package/lib/typescript/src/components/Content/Card/NowWatching/NowWatching.d.ts.map +1 -1
  213. package/lib/typescript/src/components/Content/Card/Sliders/Styles/One.d.ts.map +1 -1
  214. package/lib/typescript/src/components/Content/Card/Sliders/Styles/Two.d.ts.map +1 -1
  215. package/lib/typescript/src/components/Content/Card/Styles/Five.d.ts +13 -1
  216. package/lib/typescript/src/components/Content/Card/Styles/Five.d.ts.map +1 -1
  217. package/lib/typescript/src/components/Content/Card/Styles/Four.d.ts +13 -1
  218. package/lib/typescript/src/components/Content/Card/Styles/Four.d.ts.map +1 -1
  219. package/lib/typescript/src/components/Content/Card/Styles/One.d.ts +15 -3
  220. package/lib/typescript/src/components/Content/Card/Styles/One.d.ts.map +1 -1
  221. package/lib/typescript/src/components/Content/Card/Styles/RotateInOut.d.ts +13 -1
  222. package/lib/typescript/src/components/Content/Card/Styles/RotateInOut.d.ts.map +1 -1
  223. package/lib/typescript/src/components/Content/Card/Styles/Six.d.ts +1 -0
  224. package/lib/typescript/src/components/Content/Card/Styles/Six.d.ts.map +1 -1
  225. package/lib/typescript/src/components/Content/Card/Styles/Three.d.ts +13 -5
  226. package/lib/typescript/src/components/Content/Card/Styles/Three.d.ts.map +1 -1
  227. package/lib/typescript/src/components/Content/Card/Styles/TopTen.d.ts +1 -0
  228. package/lib/typescript/src/components/Content/Card/Styles/TopTen.d.ts.map +1 -1
  229. package/lib/typescript/src/components/Content/Card/Styles/Two.d.ts +13 -1
  230. package/lib/typescript/src/components/Content/Card/Styles/Two.d.ts.map +1 -1
  231. package/lib/typescript/src/components/Content/Card/components/AdsPoster.d.ts +26 -0
  232. package/lib/typescript/src/components/Content/Card/components/AdsPoster.d.ts.map +1 -0
  233. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts +3 -1
  234. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts.map +1 -1
  235. package/lib/typescript/src/components/Content/Card/components/RentOrBuyIcon.d.ts +2 -2
  236. package/lib/typescript/src/components/Content/Card/components/RentOrBuyIcon.d.ts.map +1 -1
  237. package/lib/typescript/src/components/Content/Card/components/ThumbnailCard.d.ts +2 -0
  238. package/lib/typescript/src/components/Content/Card/components/ThumbnailCard.d.ts.map +1 -1
  239. package/lib/typescript/src/components/Content/Card/components/index.d.ts +2 -0
  240. package/lib/typescript/src/components/Content/Card/components/index.d.ts.map +1 -0
  241. package/lib/typescript/src/components/Content/Card/index.d.ts +76 -6
  242. package/lib/typescript/src/components/Content/Card/index.d.ts.map +1 -1
  243. package/lib/typescript/src/components/Content/Content.d.ts +6 -3
  244. package/lib/typescript/src/components/Content/Content.d.ts.map +1 -1
  245. package/lib/typescript/src/components/Content/Sections.d.ts +22 -8
  246. package/lib/typescript/src/components/Content/Sections.d.ts.map +1 -1
  247. package/lib/typescript/src/components/ContentView/ContentView.d.ts +6 -1
  248. package/lib/typescript/src/components/ContentView/ContentView.d.ts.map +1 -1
  249. package/lib/typescript/src/components/ContentView/MoreContentList.d.ts.map +1 -1
  250. package/lib/typescript/src/components/ContentView/components/AboutSection.d.ts +2 -1
  251. package/lib/typescript/src/components/ContentView/components/AboutSection.d.ts.map +1 -1
  252. package/lib/typescript/src/components/ContentView/components/CastCard.d.ts +6 -1
  253. package/lib/typescript/src/components/ContentView/components/CastCard.d.ts.map +1 -1
  254. package/lib/typescript/src/components/ContentView/components/EpisodeCard.d.ts +2 -1
  255. package/lib/typescript/src/components/ContentView/components/EpisodeCard.d.ts.map +1 -1
  256. package/lib/typescript/src/components/ContentView/components/GenreTags.d.ts +1 -1
  257. package/lib/typescript/src/components/ContentView/components/GenreTags.d.ts.map +1 -1
  258. package/lib/typescript/src/components/ContentView/components/HeroBanner.d.ts +2 -1
  259. package/lib/typescript/src/components/ContentView/components/HeroBanner.d.ts.map +1 -1
  260. package/lib/typescript/src/components/ContentView/components/MiniInfo.d.ts +1 -1
  261. package/lib/typescript/src/components/ContentView/components/MiniInfo.d.ts.map +1 -1
  262. package/lib/typescript/src/components/ContentView/components/PlayButton.d.ts +2 -1
  263. package/lib/typescript/src/components/ContentView/components/PlayButton.d.ts.map +1 -1
  264. package/lib/typescript/src/components/ContentView/components/Title.d.ts +1 -1
  265. package/lib/typescript/src/components/ContentView/components/Title.d.ts.map +1 -1
  266. package/lib/typescript/src/components/ContentView/components/TrailerButton.d.ts +2 -1
  267. package/lib/typescript/src/components/ContentView/components/TrailerButton.d.ts.map +1 -1
  268. package/lib/typescript/src/components/Fallbacks/NoContentFallback.d.ts +2 -1
  269. package/lib/typescript/src/components/Fallbacks/NoContentFallback.d.ts.map +1 -1
  270. package/lib/typescript/src/components/Fallbacks/NotFoundFallback.d.ts +1 -1
  271. package/lib/typescript/src/components/Fallbacks/NotFoundFallback.d.ts.map +1 -1
  272. package/lib/typescript/src/components/Headers/AppHeader.d.ts +2 -2
  273. package/lib/typescript/src/components/Headers/AppHeader.d.ts.map +1 -1
  274. package/lib/typescript/src/components/Headers/Three.d.ts +2 -2
  275. package/lib/typescript/src/components/Headers/Three.d.ts.map +1 -1
  276. package/lib/typescript/src/components/Headers/Two.d.ts +2 -2
  277. package/lib/typescript/src/components/Headers/Two.d.ts.map +1 -1
  278. package/lib/typescript/src/components/Headers/index.d.ts +2 -2
  279. package/lib/typescript/src/components/Input/Input.d.ts +1 -1
  280. package/lib/typescript/src/components/Input/InputOne.d.ts +2 -2
  281. package/lib/typescript/src/components/Input/InputOne.d.ts.map +1 -1
  282. package/lib/typescript/src/components/Loader/Loader.d.ts.map +1 -1
  283. package/lib/typescript/src/components/Logo/Logo.d.ts +2 -1
  284. package/lib/typescript/src/components/Logo/Logo.d.ts.map +1 -1
  285. package/lib/typescript/src/components/Search/One.d.ts.map +1 -1
  286. package/lib/typescript/src/components/Search/components/SearchCard.d.ts +2 -5
  287. package/lib/typescript/src/components/Search/components/SearchCard.d.ts.map +1 -1
  288. package/lib/typescript/src/components/Search/index.d.ts +1 -1
  289. package/lib/typescript/src/components/Settings/AppSettings.d.ts +2 -2
  290. package/lib/typescript/src/components/Settings/AppSettings.d.ts.map +1 -1
  291. package/lib/typescript/src/components/Subscription/SubOne.d.ts.map +1 -1
  292. package/lib/typescript/src/components/Subscription/index.d.ts.map +1 -1
  293. package/lib/typescript/src/components/Text/Text.d.ts +2 -2
  294. package/lib/typescript/src/components/Text/Text.d.ts.map +1 -1
  295. package/lib/typescript/src/components/User/DeviceSessions/DeviceSessions.d.ts +1 -1
  296. package/lib/typescript/src/components/User/DeviceSessions/DeviceSessions.d.ts.map +1 -1
  297. package/lib/typescript/src/components/User/ProfileUpdate/ProfileUpdate.d.ts +1 -1
  298. package/lib/typescript/src/components/User/ProfileUpdate/ProfileUpdate.d.ts.map +1 -1
  299. package/lib/typescript/src/components/User/PurchaseHistory/PurchaseHistory.d.ts +1 -1
  300. package/lib/typescript/src/components/User/PurchaseHistory/PurchaseHistory.d.ts.map +1 -1
  301. package/lib/typescript/src/components/User/WatchHistory/WatchHistory.d.ts +1 -1
  302. package/lib/typescript/src/components/User/WatchHistory/WatchHistory.d.ts.map +1 -1
  303. package/lib/typescript/src/components/User/WatchLater/WatchLater.d.ts +1 -1
  304. package/lib/typescript/src/components/User/WatchLater/WatchLater.d.ts.map +1 -1
  305. package/lib/typescript/src/components/User/components/UserAvatar.d.ts +1 -1
  306. package/lib/typescript/src/components/User/components/UserAvatar.d.ts.map +1 -1
  307. package/lib/typescript/src/components/User/components/UserSection.d.ts +1 -1
  308. package/lib/typescript/src/components/User/components/UserSection.d.ts.map +1 -1
  309. package/lib/typescript/src/components/View/View.d.ts +2 -0
  310. package/lib/typescript/src/components/View/View.d.ts.map +1 -1
  311. package/lib/typescript/src/components/index.d.ts +0 -1
  312. package/lib/typescript/src/components/index.d.ts.map +1 -1
  313. package/lib/typescript/src/constants/dummySections.d.ts +5 -0
  314. package/lib/typescript/src/constants/dummySections.d.ts.map +1 -1
  315. package/lib/typescript/src/hooks/Images/index.d.ts +3 -0
  316. package/lib/typescript/src/hooks/Images/index.d.ts.map +1 -0
  317. package/lib/typescript/src/hooks/Images/useImageLoader.d.ts +36 -0
  318. package/lib/typescript/src/hooks/Images/useImageLoader.d.ts.map +1 -0
  319. package/lib/typescript/src/hooks/Images/useImageValidation.d.ts +17 -0
  320. package/lib/typescript/src/hooks/Images/useImageValidation.d.ts.map +1 -0
  321. package/lib/typescript/src/hooks/index.d.ts +17 -0
  322. package/lib/typescript/src/hooks/index.d.ts.map +1 -0
  323. package/lib/typescript/src/hooks/useAdTracking.d.ts +39 -0
  324. package/lib/typescript/src/hooks/useAdTracking.d.ts.map +1 -0
  325. package/lib/typescript/src/hooks/useCards.d.ts +36 -0
  326. package/lib/typescript/src/hooks/useCards.d.ts.map +1 -0
  327. package/lib/typescript/src/hooks/useDebounce.d.ts.map +1 -1
  328. package/lib/typescript/src/hooks/useKeyboard.d.ts.map +1 -1
  329. package/lib/typescript/src/hooks/useNavigationMode.d.ts.map +1 -1
  330. package/lib/typescript/src/hooks/usePaginatedSection.d.ts +12 -2
  331. package/lib/typescript/src/hooks/usePaginatedSection.d.ts.map +1 -1
  332. package/lib/typescript/src/hooks/usePrevious.d.ts +12 -0
  333. package/lib/typescript/src/hooks/usePrevious.d.ts.map +1 -0
  334. package/lib/typescript/src/hooks/useSafeCallback.d.ts +15 -0
  335. package/lib/typescript/src/hooks/useSafeCallback.d.ts.map +1 -0
  336. package/lib/typescript/src/hooks/useSkeletonItems.d.ts +11 -0
  337. package/lib/typescript/src/hooks/useSkeletonItems.d.ts.map +1 -0
  338. package/lib/typescript/src/hooks/useSplashCache.d.ts.map +1 -1
  339. package/lib/typescript/src/hooks/useThemeColors.d.ts +27 -0
  340. package/lib/typescript/src/hooks/useThemeColors.d.ts.map +1 -0
  341. package/lib/typescript/src/theme/ThemeProvider.d.ts.map +1 -1
  342. package/lib/typescript/src/theme/hook/useInternalTheme.d.ts.map +1 -1
  343. package/lib/typescript/src/theme/hook/useThemeStatusBar.d.ts.map +1 -1
  344. package/lib/typescript/src/types/sections/index.d.ts +7 -4
  345. package/lib/typescript/src/types/sections/index.d.ts.map +1 -1
  346. package/package.json +6 -3
  347. package/src/Styles/globalStyles.ts +0 -5
  348. package/src/components/Auth/AuthProvider/AuthProvider.tsx +288 -212
  349. package/src/components/Auth/ForgotPassword/ForgotPassword.tsx +11 -4
  350. package/src/components/Auth/Login/LoginWithEmail.tsx +266 -238
  351. package/src/components/Auth/Login/LoginWithPhone.tsx +18 -6
  352. package/src/components/Auth/OTP/OTP.tsx +21 -5
  353. package/src/components/Auth/QrLogin/QrLogin.tsx +477 -177
  354. package/src/components/Auth/QrLogin/components/QrViewArea.tsx +349 -139
  355. package/src/components/Auth/SignUp/SignUp.tsx +312 -293
  356. package/src/components/Auth/SplashScreen/SplashScreen.tsx +186 -131
  357. package/src/components/Auth/SplashScreen/components/SplashImage/SplashImage.tsx +32 -15
  358. package/src/components/Auth/SplashScreen/components/SplashLottie/SplashLottie.tsx +11 -5
  359. package/src/components/Auth/SplashScreen/components/SplashVideo/SplashVideo.tsx +34 -18
  360. package/src/components/BackgroundLayout/BackgroundLayout.tsx +43 -37
  361. package/src/components/BlogView/BlogView.tsx +66 -30
  362. package/src/components/Button/BackBtn.tsx +64 -34
  363. package/src/components/Button/PrimaryBtn.tsx +42 -25
  364. package/src/components/Button/SecondaryBtn.tsx +41 -25
  365. package/src/components/Button/TextButton.tsx +54 -32
  366. package/src/components/Content/Card/Category/Category.tsx +189 -64
  367. package/src/components/Content/Card/NowWatching/NowWatching.tsx +281 -136
  368. package/src/components/Content/Card/Sliders/Styles/One.tsx +270 -158
  369. package/src/components/Content/Card/Sliders/Styles/Two.tsx +239 -90
  370. package/src/components/Content/Card/Styles/Five.tsx +161 -62
  371. package/src/components/Content/Card/Styles/Four.tsx +164 -85
  372. package/src/components/Content/Card/Styles/One.tsx +161 -71
  373. package/src/components/Content/Card/Styles/RotateInOut.tsx +162 -67
  374. package/src/components/Content/Card/Styles/Six.tsx +242 -142
  375. package/src/components/Content/Card/Styles/Three.tsx +166 -133
  376. package/src/components/Content/Card/Styles/TopTen.tsx +230 -191
  377. package/src/components/Content/Card/Styles/Two.tsx +182 -79
  378. package/src/components/Content/Card/components/AdsPoster.tsx +202 -0
  379. package/src/components/Content/Card/components/CardPoster.tsx +166 -105
  380. package/src/components/Content/Card/components/RentOrBuyIcon.tsx +58 -38
  381. package/src/components/Content/Card/components/ThumbnailCard.tsx +122 -47
  382. package/src/components/Content/Card/components/index.ts +1 -0
  383. package/src/components/Content/Content.tsx +211 -106
  384. package/src/components/Content/Sections.tsx +148 -51
  385. package/src/components/ContentView/ContentView.tsx +194 -128
  386. package/src/components/ContentView/MoreContentList.tsx +215 -151
  387. package/src/components/ContentView/components/AboutSection.tsx +132 -93
  388. package/src/components/ContentView/components/CastCard.tsx +148 -138
  389. package/src/components/ContentView/components/EpisodeCard.tsx +160 -155
  390. package/src/components/ContentView/components/GenreTags.tsx +68 -53
  391. package/src/components/ContentView/components/HeroBanner.tsx +326 -284
  392. package/src/components/ContentView/components/MiniInfo.tsx +181 -159
  393. package/src/components/ContentView/components/PlayButton.tsx +27 -16
  394. package/src/components/ContentView/components/Title.tsx +89 -72
  395. package/src/components/ContentView/components/TrailerButton.tsx +35 -22
  396. package/src/components/Fallbacks/NoContentFallback.tsx +107 -103
  397. package/src/components/Fallbacks/NotFoundFallback.tsx +12 -4
  398. package/src/components/Headers/AppHeader.tsx +42 -26
  399. package/src/components/Headers/Three.tsx +12 -8
  400. package/src/components/Headers/Two.tsx +31 -10
  401. package/src/components/Input/InputOne.tsx +136 -108
  402. package/src/components/Loader/Loader.tsx +2 -2
  403. package/src/components/Logo/Logo.tsx +43 -27
  404. package/src/components/Search/One.tsx +2 -4
  405. package/src/components/Search/components/SearchCard.tsx +19 -13
  406. package/src/components/Settings/AppSettings.tsx +217 -128
  407. package/src/components/Subscription/SubOne.tsx +394 -317
  408. package/src/components/Text/Text.tsx +33 -22
  409. package/src/components/User/DeviceSessions/DeviceSessions.tsx +129 -102
  410. package/src/components/User/ProfileUpdate/ProfileUpdate.tsx +36 -17
  411. package/src/components/User/PurchaseHistory/PurchaseHistory.tsx +194 -140
  412. package/src/components/User/WatchHistory/WatchHistory.tsx +63 -36
  413. package/src/components/User/WatchLater/WatchLater.tsx +119 -81
  414. package/src/components/User/components/UserAvatar.tsx +49 -15
  415. package/src/components/User/components/UserSection.tsx +71 -37
  416. package/src/components/View/View.tsx +10 -2
  417. package/src/components/index.ts +0 -1
  418. package/src/constants/dummySections.ts +48 -1
  419. package/src/hooks/Images/index.ts +2 -0
  420. package/src/hooks/Images/useImageLoader.ts +206 -0
  421. package/src/hooks/Images/useImageValidation.ts +36 -0
  422. package/src/hooks/index.ts +17 -0
  423. package/src/hooks/useAdTracking.ts +349 -0
  424. package/src/hooks/useCards.ts +228 -0
  425. package/src/hooks/useDebounce.ts +25 -6
  426. package/src/hooks/useKeyboard.ts +12 -5
  427. package/src/hooks/useNavigationMode.ts +16 -5
  428. package/src/hooks/usePaginatedSection.ts +27 -8
  429. package/src/hooks/usePrevious.ts +28 -0
  430. package/src/hooks/useSafeCallback.ts +43 -0
  431. package/src/hooks/useSkeletonItems.ts +30 -0
  432. package/src/hooks/useSplashCache.ts +2 -1
  433. package/src/hooks/useThemeColors.ts +51 -0
  434. package/src/theme/ThemeProvider.tsx +25 -9
  435. package/src/theme/hook/useInternalTheme.ts +19 -13
  436. package/src/theme/hook/useThemeStatusBar.ts +14 -5
  437. package/src/types/sections/index.ts +7 -4
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Global Card Hook (No duplicates + single data key)
3
+ *
4
+ * Provides a unified interface for managing card data with:
5
+ * - Automatic deduplication
6
+ * - Skeleton loading states
7
+ * - Pagination support
8
+ * - Optimized performance
9
+ */
10
+
11
+ import { useMemo, useCallback } from 'react';
12
+ import type { IContentData } from '@zezosoft/zezo-ott-api-client';
13
+ import { usePaginatedSection } from './usePaginatedSection';
14
+ import type { IAdItem, MoreFetchData } from '../types';
15
+ import { dummyContentData } from '../constants/dummySections';
16
+
17
+ export type CardSource =
18
+ | { data: (IContentData | IAdItem)[] }
19
+ | (IContentData | IAdItem)[]
20
+ | null;
21
+
22
+ export type UseCardsOptions = {
23
+ sectionId: string;
24
+ data?: CardSource;
25
+ fetchMore?: MoreFetchData<IContentData>;
26
+ loading?: boolean;
27
+ initialSkeleton?: number;
28
+ pagingSkeleton?: number;
29
+ adsRender?: boolean; // If false, ads will be filtered out from listData
30
+ };
31
+
32
+ export type UseCardsReturn = {
33
+ listData: (IContentData | IAdItem)[]; // ✔ Mixed array of content and ads
34
+ pagination: {
35
+ hasNextPage: boolean;
36
+ nextPage: number | null;
37
+ } | null;
38
+ isPaging: boolean;
39
+ hasMore: boolean;
40
+ loadMore: (page: number | null) => Promise<void>;
41
+ isEmpty: boolean;
42
+ };
43
+
44
+ // -----------------------------------------------------------
45
+ // Constants
46
+ // -----------------------------------------------------------
47
+
48
+ const DEFAULT_INITIAL_SKELETON = 5;
49
+ const DEFAULT_PAGING_SKELETON = 3;
50
+
51
+ // -----------------------------------------------------------
52
+ // Helpers
53
+ // -----------------------------------------------------------
54
+
55
+ /**
56
+ * Normalizes different data source formats into a single array
57
+ */
58
+ const normalize = (src: CardSource): (IContentData | IAdItem)[] => {
59
+ if (!src) return [];
60
+ if (Array.isArray(src)) return src;
61
+ return src.data ?? [];
62
+ };
63
+
64
+ /**
65
+ * Removes duplicate items by _id using Map for O(n) performance
66
+ * Preserves order of first occurrence
67
+ * Handles both IContentData and IAdItem types
68
+ */
69
+ const uniqueById = (
70
+ list: (IContentData | IAdItem)[]
71
+ ): (IContentData | IAdItem)[] => {
72
+ if (list.length === 0) return [];
73
+
74
+ const seen = new Map<string, IContentData | IAdItem>();
75
+ const result: (IContentData | IAdItem)[] = [];
76
+
77
+ for (const item of list) {
78
+ // Handle ads - check for type property and use appropriate ID field
79
+ if ('type' in item && item.type === 'ads') {
80
+ const adItem = item as IAdItem;
81
+ // Ads might have _id (from IServeAd) or use mediaUrl as identifier
82
+ let id: string;
83
+ if ('_id' in adItem && adItem._id) {
84
+ id = String(adItem._id);
85
+ } else if ('mediaUrl' in adItem && adItem.mediaUrl) {
86
+ id = `ad-${adItem.mediaUrl}`;
87
+ } else {
88
+ id = `ad-${Math.random()}`;
89
+ }
90
+
91
+ if (!seen.has(id)) {
92
+ seen.set(id, adItem);
93
+ result.push(adItem);
94
+ }
95
+ continue;
96
+ }
97
+
98
+ // Handle content items
99
+ const contentItem = item as IContentData;
100
+ if (!contentItem?._id) continue; // Skip items without valid IDs
101
+
102
+ const id = String(contentItem._id);
103
+ if (!seen.has(id)) {
104
+ seen.set(id, contentItem);
105
+ result.push(contentItem);
106
+ }
107
+ }
108
+
109
+ return result;
110
+ };
111
+
112
+ /**
113
+ * Creates skeleton items for loading states
114
+ * Memoized by count to avoid unnecessary recreations
115
+ * Returns IContentData[] for skeleton loading (ads don't need skeletons)
116
+ */
117
+ const createSkeletonItems = (count: number, prefix: string): IContentData[] => {
118
+ if (count <= 0) return [];
119
+ return Array.from({ length: count }, (_, i) =>
120
+ dummyContentData(`${prefix}-${i}`)
121
+ );
122
+ };
123
+
124
+ // -----------------------------------------------------------
125
+ // Hook
126
+ // -----------------------------------------------------------
127
+
128
+ export function useCards({
129
+ sectionId,
130
+ data,
131
+ fetchMore,
132
+ loading = false,
133
+ initialSkeleton = DEFAULT_INITIAL_SKELETON,
134
+ pagingSkeleton = DEFAULT_PAGING_SKELETON,
135
+ adsRender = false,
136
+ }: UseCardsOptions): UseCardsReturn {
137
+ // Normalize input data
138
+ const baseItems = useMemo(() => normalize(data ?? { data: [] }), [data]);
139
+
140
+ // Use pagination hook for data management
141
+ const {
142
+ data: list,
143
+ pagination,
144
+ loadMoreData,
145
+ isPaginating,
146
+ hasMore,
147
+ } = usePaginatedSection<IContentData | IAdItem>(
148
+ sectionId,
149
+ fetchMore,
150
+ baseItems,
151
+ loading
152
+ );
153
+
154
+ // Apply deduplication to the list (handles both content and ads)
155
+ const uniqueList = useMemo(
156
+ () => uniqueById(list as (IContentData | IAdItem)[]),
157
+ [list]
158
+ );
159
+
160
+ // Memoize skeleton items - only recreate when count changes
161
+ const initialSkeletonItems = useMemo(
162
+ () => createSkeletonItems(initialSkeleton, 'sk'),
163
+ [initialSkeleton]
164
+ );
165
+
166
+ const pagingSkeletonItems = useMemo(
167
+ () => createSkeletonItems(pagingSkeleton, 'pagination-skeleton'),
168
+ [pagingSkeleton]
169
+ );
170
+
171
+ // Filter ads if adsRender is false
172
+ const filteredList = useMemo(() => {
173
+ if (adsRender) return uniqueList;
174
+ return uniqueList.filter(
175
+ (item): item is IContentData => item.type !== 'ads'
176
+ );
177
+ }, [uniqueList, adsRender]);
178
+
179
+ // Final data array for UI rendering
180
+ // Handles loading states and pagination skeletons
181
+ // Returns mixed array of IContentData | IAdItem (or only IContentData if adsRender is false)
182
+ const items = useMemo(() => {
183
+ // Show initial skeleton during initial load
184
+ if (loading) return initialSkeletonItems as (IContentData | IAdItem)[];
185
+
186
+ // Show data with pagination skeleton when loading more
187
+ if (isPaginating && filteredList.length > 0) {
188
+ return [
189
+ ...filteredList,
190
+ ...(pagingSkeletonItems as (IContentData | IAdItem)[]),
191
+ ];
192
+ }
193
+
194
+ // Return filtered list (with or without ads based on adsRender)
195
+ return filteredList;
196
+ }, [
197
+ loading,
198
+ isPaginating,
199
+ filteredList,
200
+ initialSkeletonItems,
201
+ pagingSkeletonItems,
202
+ ]);
203
+
204
+ // Determine if section is empty (only when not loading and no data)
205
+ const isEmpty = useMemo(
206
+ () => !loading && filteredList.length === 0,
207
+ [loading, filteredList.length]
208
+ );
209
+
210
+ // Memoize loadMore callback to prevent unnecessary re-renders
211
+ const handleLoadMore = useCallback(
212
+ async (page: number | null) => {
213
+ if (page && hasMore && !isPaginating) {
214
+ await loadMoreData(page);
215
+ }
216
+ },
217
+ [loadMoreData, hasMore, isPaginating]
218
+ );
219
+
220
+ return {
221
+ listData: items,
222
+ pagination,
223
+ isPaging: isPaginating,
224
+ hasMore,
225
+ loadMore: handleLoadMore,
226
+ isEmpty,
227
+ };
228
+ }
@@ -1,16 +1,35 @@
1
- import React from 'react';
1
+ import { useCallback, useRef, useEffect } from 'react';
2
2
 
3
3
  export const useDebounce = (
4
4
  callback: (value: string) => void,
5
5
  delay: number
6
6
  ) => {
7
- const timeoutRef = React.useRef<NodeJS.Timeout | null>(null);
7
+ const timeoutRef = useRef<NodeJS.Timeout | null>(null);
8
+ const callbackRef = useRef(callback);
8
9
 
9
- return React.useCallback(
10
+ // Update callback ref when it changes
11
+ useEffect(() => {
12
+ callbackRef.current = callback;
13
+ }, [callback]);
14
+
15
+ // Cleanup on unmount
16
+ useEffect(() => {
17
+ return () => {
18
+ if (timeoutRef.current) {
19
+ clearTimeout(timeoutRef.current);
20
+ }
21
+ };
22
+ }, []);
23
+
24
+ return useCallback(
10
25
  (value: string) => {
11
- if (timeoutRef.current) clearTimeout(timeoutRef.current);
12
- timeoutRef.current = setTimeout(() => callback(value), delay);
26
+ if (timeoutRef.current) {
27
+ clearTimeout(timeoutRef.current);
28
+ }
29
+ timeoutRef.current = setTimeout(() => {
30
+ callbackRef.current(value);
31
+ }, delay);
13
32
  },
14
- [callback, delay]
33
+ [delay]
15
34
  );
16
35
  };
@@ -3,7 +3,7 @@
3
3
  * @lastModified Sat 14 Jun 2025 at 03:01 PM
4
4
  */
5
5
 
6
- import { useEffect, useState } from 'react';
6
+ import { useEffect, useState, useCallback, useMemo } from 'react';
7
7
  import { Keyboard, Platform } from 'react-native';
8
8
 
9
9
  export const useKeyboard = () => {
@@ -29,8 +29,15 @@ export const useKeyboard = () => {
29
29
  };
30
30
  }, []);
31
31
 
32
- return {
33
- isKeyboardOpen,
34
- hideKeyboard: () => Keyboard.dismiss(),
35
- };
32
+ const hideKeyboard = useCallback(() => {
33
+ Keyboard.dismiss();
34
+ }, []);
35
+
36
+ return useMemo(
37
+ () => ({
38
+ isKeyboardOpen,
39
+ hideKeyboard,
40
+ }),
41
+ [isKeyboardOpen, hideKeyboard]
42
+ );
36
43
  };
@@ -3,7 +3,7 @@
3
3
  * @lastModified Thu 06 Nov 2025 at 11:52 AM
4
4
  */
5
5
 
6
- import { useEffect, useState } from 'react';
6
+ import { useEffect, useState, useMemo } from 'react';
7
7
  import NavigationMode from 'react-native-navigation-mode';
8
8
 
9
9
  /**
@@ -16,20 +16,31 @@ export const useNavigationMode = () => {
16
16
  const [isThreeButtonNav, setIsThreeButtonNav] = useState(false);
17
17
 
18
18
  useEffect(() => {
19
+ let mounted = true;
20
+
19
21
  (async () => {
20
22
  try {
21
23
  const navMode = (await NavigationMode.getNavigationMode()) as any;
22
24
  const isThreeButton =
23
25
  navMode?.navigationMode === 'THREE_BUTTON' ||
24
26
  navMode?.mode === 'THREE_BUTTON';
25
- setIsThreeButtonNav(isThreeButton);
27
+ if (mounted) {
28
+ setIsThreeButtonNav(isThreeButton);
29
+ }
26
30
  } catch (err) {
27
31
  console.log('Navigation mode detect error:', err);
28
32
  }
29
33
  })();
34
+
35
+ return () => {
36
+ mounted = false;
37
+ };
30
38
  }, []);
31
39
 
32
- return {
33
- isGestureNav: !isThreeButtonNav,
34
- };
40
+ return useMemo(
41
+ () => ({
42
+ isGestureNav: !isThreeButtonNav,
43
+ }),
44
+ [isThreeButtonNav]
45
+ );
35
46
  };
@@ -3,7 +3,21 @@
3
3
  * @lastModified Wed 25 Jun 2025 at 12:00 PM
4
4
  */
5
5
  import React, { useCallback, useState } from 'react';
6
- import type { MoreFetchData } from '../types';
6
+ import type { ISectionMeta } from '../types';
7
+
8
+ export type MoreFetchData<T> = ({
9
+ sectionId,
10
+ meta,
11
+ }: {
12
+ sectionId: string;
13
+ meta: {
14
+ hasNextPage: boolean;
15
+ nextPage: number;
16
+ };
17
+ }) => Promise<{
18
+ data: T[];
19
+ meta: ISectionMeta;
20
+ } | null>;
7
21
 
8
22
  export function usePaginatedSection<T>(
9
23
  sectionId: string,
@@ -19,20 +33,20 @@ export function usePaginatedSection<T>(
19
33
  hasNextPage: true,
20
34
  nextPage: 2,
21
35
  });
22
- const [loading, setLoading] = useState(false);
36
+ const [isPaginating, setIsPaginating] = useState(false);
23
37
 
24
38
  // Sync initial data on mount or loading complete
25
39
  React.useEffect(() => {
26
40
  if (!isLoading && initialData.length) {
27
41
  setData(initialData);
28
42
  }
29
- }, [isLoading, initialData]);
43
+ }, [isLoading, initialData.length, initialData]);
30
44
 
31
45
  const loadMoreData = useCallback(
32
46
  async (page: number | null) => {
33
- if (!page || loading || !pagination.hasNextPage || !fetchFn) return;
47
+ if (!page || isPaginating || !pagination.hasNextPage || !fetchFn) return;
34
48
 
35
- setLoading(true);
49
+ setIsPaginating(true);
36
50
  try {
37
51
  const res = await fetchFn({
38
52
  sectionId,
@@ -44,6 +58,11 @@ export function usePaginatedSection<T>(
44
58
 
45
59
  if (!res || !res.data || !res.meta?.pagination) {
46
60
  console.warn(`⚠️ Invalid response for section: ${sectionId}`, res);
61
+ // Stop further pagination attempts for this section
62
+ setPagination({
63
+ hasNextPage: false,
64
+ nextPage: null,
65
+ });
47
66
  return;
48
67
  }
49
68
 
@@ -66,16 +85,16 @@ export function usePaginatedSection<T>(
66
85
  } catch (err) {
67
86
  console.error(`❌ Error loading section [${sectionId}]:`, err);
68
87
  } finally {
69
- setLoading(false);
88
+ setIsPaginating(false);
70
89
  }
71
90
  },
72
- [loading, pagination.hasNextPage, fetchFn, sectionId]
91
+ [isPaginating, pagination.hasNextPage, fetchFn, sectionId]
73
92
  );
74
93
 
75
94
  return {
76
95
  data,
77
96
  pagination,
78
- loading,
97
+ isPaginating,
79
98
  hasMore: pagination.hasNextPage,
80
99
  loadMoreData,
81
100
  };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @author Naresh Dhamu
3
+ * @lastModified Optimized for performance
4
+ */
5
+
6
+ import { useRef } from 'react';
7
+
8
+ /**
9
+ * Hook to get the previous value of a prop or state
10
+ * Optimized to avoid useEffect overhead
11
+ * @param value - The value to track
12
+ * @returns The previous value
13
+ */
14
+ export function usePrevious<T>(value: T): T | undefined {
15
+ const ref = useRef<{ value: T; previous: T | undefined }>({
16
+ value,
17
+ previous: undefined,
18
+ });
19
+
20
+ // Update ref synchronously during render
21
+ const current = ref.current;
22
+ if (current.value !== value) {
23
+ current.previous = current.value;
24
+ current.value = value;
25
+ }
26
+
27
+ return current.previous;
28
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @author Naresh Dhamu
3
+ * @lastModified Optimized for performance
4
+ */
5
+
6
+ import { useCallback } from 'react';
7
+ import type { GestureResponderEvent } from 'react-native';
8
+
9
+ /**
10
+ * Creates a safe callback that checks if the function exists before calling
11
+ * Prevents unnecessary re-renders by memoizing the callback
12
+ */
13
+ export function useSafeCallback<T extends (...args: any[]) => any>(
14
+ callback: T | undefined,
15
+ deps: React.DependencyList = []
16
+ ): T {
17
+ return useCallback(
18
+ (...args: Parameters<T>) => {
19
+ callback?.(...args);
20
+ },
21
+ // eslint-disable-next-line react-hooks/exhaustive-deps
22
+ [callback, ...deps]
23
+ ) as T;
24
+ }
25
+
26
+ /**
27
+ * Creates a safe press handler that checks disabled state
28
+ */
29
+ export function useSafePressHandler(
30
+ onPress: ((event: GestureResponderEvent) => void) | undefined,
31
+ disabled: boolean = false,
32
+ deps: React.DependencyList = []
33
+ ) {
34
+ return useCallback(
35
+ (event: GestureResponderEvent) => {
36
+ if (!disabled && onPress) {
37
+ onPress(event);
38
+ }
39
+ },
40
+ // eslint-disable-next-line react-hooks/exhaustive-deps
41
+ [disabled, onPress, ...deps]
42
+ );
43
+ }
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @author Naresh Dhamu
3
+ * @lastModified Optimized for performance
4
+ */
5
+
6
+ import { useMemo, useRef } from 'react';
7
+
8
+ /**
9
+ * Hook to create skeleton items array
10
+ * Memoized to prevent unnecessary recreations
11
+ * Generator function is stored in ref to avoid dependency issues
12
+ */
13
+ export function useSkeletonItems<T = any>(
14
+ count: number,
15
+ generator?: (index: number) => T
16
+ ): T[] {
17
+ const generatorRef = useRef(generator);
18
+ generatorRef.current = generator;
19
+
20
+ return useMemo(() => {
21
+ if (count <= 0) return [];
22
+ if (generatorRef.current) {
23
+ return Array.from({ length: count }, (_, i) => generatorRef.current!(i));
24
+ }
25
+ return Array.from({ length: count }, (_, i) => ({
26
+ _id: `skeleton-${i}`,
27
+ isSkeleton: true,
28
+ })) as T[];
29
+ }, [count]);
30
+ }
@@ -150,7 +150,8 @@ export const useSplashCache = ({
150
150
  return () => {
151
151
  mounted = false;
152
152
  };
153
- }, [logoUrl, backgroundUrl, forceDownload, setLogo, setBackground]);
153
+ // eslint-disable-next-line react-hooks/exhaustive-deps
154
+ }, [logoUrl, backgroundUrl, forceDownload]);
154
155
 
155
156
  const logoPath = useSplashStore((s) => s.logo.localPath);
156
157
  const bgPath = useSplashStore((s) => s.backdrop.localPath);
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @author Naresh Dhamu
3
+ * @lastModified Optimized for performance
4
+ */
5
+
6
+ import { useMemo } from 'react';
7
+ import type { ITheme } from '../theme/themes';
8
+
9
+ /**
10
+ * Hook to extract and memoize theme colors
11
+ * Reduces repeated color extraction patterns
12
+ */
13
+ export function useThemeColors(theme: ITheme) {
14
+ const colors = theme.colors;
15
+ return useMemo(
16
+ () => ({
17
+ textPrimary: colors.textPrimary,
18
+ textSecondary: colors.textSecondary,
19
+ background: colors.background,
20
+ surface: colors.surface,
21
+ surfaceVariant: colors.surfaceVariant,
22
+ primary: colors.primary,
23
+ error: colors.error,
24
+ errorContainer: colors.errorContainer,
25
+ skeletonBaseColor: colors.skeletonBaseColor,
26
+ skeletonHighlightColor: colors.skeletonHighlightColor,
27
+ border: colors.border,
28
+ onBackground: colors.onBackground,
29
+ onPrimary: colors.onPrimary,
30
+ onSurface: colors.onSurface,
31
+ outline: colors.outline,
32
+ }),
33
+ [
34
+ colors.textPrimary,
35
+ colors.textSecondary,
36
+ colors.background,
37
+ colors.surface,
38
+ colors.surfaceVariant,
39
+ colors.primary,
40
+ colors.error,
41
+ colors.errorContainer,
42
+ colors.skeletonBaseColor,
43
+ colors.skeletonHighlightColor,
44
+ colors.border,
45
+ colors.onBackground,
46
+ colors.onPrimary,
47
+ colors.onSurface,
48
+ colors.outline,
49
+ ]
50
+ );
51
+ }
@@ -3,7 +3,12 @@
3
3
  * @lastModified Wed 22 Oct 2025 at 11:29 AM
4
4
  */
5
5
 
6
- import React, { createContext, useContext, type ReactNode } from 'react';
6
+ import React, {
7
+ createContext,
8
+ useContext,
9
+ useMemo,
10
+ type ReactNode,
11
+ } from 'react';
7
12
  import { StyleSheet, View } from 'react-native';
8
13
  import {
9
14
  SafeAreaProvider,
@@ -58,18 +63,29 @@ export const ZezoUIProvider: React.FC<ZezoUIProviderProps> = ({
58
63
  themeFull,
59
64
  } = useInternalTheme(overrideTheme, isDark);
60
65
 
66
+ // Memoize context value to prevent unnecessary re-renders
67
+ const contextValue = useMemo(
68
+ () => ({
69
+ theme: themeFull,
70
+ isDarkMode,
71
+ setTheme,
72
+ finalTheme,
73
+ }),
74
+ [themeFull, isDarkMode, setTheme, finalTheme]
75
+ );
76
+
77
+ // Memoize container style
78
+ const containerStyle = useMemo(
79
+ () => ({ flex: 1, backgroundColor: finalTheme.colors.background }),
80
+ [finalTheme.colors.background]
81
+ );
82
+
61
83
  return (
62
84
  <GestureHandlerRootView style={styles.container}>
63
85
  <SafeAreaProvider initialMetrics={initialWindowMetrics}>
64
- <ThemeContext.Provider
65
- value={{ theme: themeFull, isDarkMode, setTheme, finalTheme }}
66
- >
86
+ <ThemeContext.Provider value={contextValue}>
67
87
  <AppStatusBar theme={overrideTheme} />
68
- <View
69
- style={{ flex: 1, backgroundColor: finalTheme.colors.background }}
70
- >
71
- {children}
72
- </View>
88
+ <View style={containerStyle}>{children}</View>
73
89
  </ThemeContext.Provider>
74
90
  </SafeAreaProvider>
75
91
  </GestureHandlerRootView>