@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
@@ -2,7 +2,13 @@
2
2
  * @author Ashok Desai
3
3
  * @lastModified oct 02 Oct 2025 at 10:30 AM
4
4
  */
5
- import React, { useState, useRef } from 'react';
5
+ import React, {
6
+ useState,
7
+ useRef,
8
+ useMemo,
9
+ useCallback,
10
+ useEffect,
11
+ } from 'react';
6
12
  import {
7
13
  View,
8
14
  StyleSheet,
@@ -10,8 +16,10 @@ import {
10
16
  TouchableOpacity,
11
17
  ActivityIndicator,
12
18
  } from 'react-native';
19
+ import type { ViewStyle, TextStyle } from 'react-native';
13
20
  import { scale } from 'react-native-size-matters';
14
21
  import { RFValue } from 'react-native-responsive-fontsize';
22
+ import { useSafeAreaInsets } from 'react-native-safe-area-context';
15
23
  import { Text } from '../../Text';
16
24
  import AppHeader from '../../Headers/AppHeader';
17
25
  import { useInternalTheme } from '../../../theme/hook/useInternalTheme';
@@ -22,226 +30,516 @@ import {
22
30
  useCameraDevice,
23
31
  useCameraPermission,
24
32
  useCodeScanner,
25
- type Code as BaseCode,
33
+ type Code,
26
34
  } from 'react-native-vision-camera';
27
35
  import QrViewArea from './components/QrViewArea';
28
36
  import { AppStatusBar } from '../../common/AppStatusBar';
29
37
 
30
38
  const { width: SCREEN_W, height: SCREEN_H } = Dimensions.get('window');
31
- const HEADER_HEIGHT = 25;
32
39
 
33
- export interface Code extends BaseCode {
34
- bounds?: {
35
- origin: { x: number; y: number };
36
- size: { width: number; height: number };
37
- };
38
- }
40
+ // ==================== Constants ====================
41
+ const SCAN_DELAY_MS = 1000;
42
+ const RESET_DELAY_MS = 2000;
43
+ const CAMERA_TYPE = 'back' as const;
44
+ const CARD_WIDTH_OFFSET = 40;
45
+ const CARD_MIN_HEIGHT_RATIO = 2.5;
46
+ const ICON_SIZES = {
47
+ camera: 50,
48
+ qrCode: 180,
49
+ button: 22,
50
+ } as const;
51
+ const STROKE_WIDTHS = {
52
+ icon: 1.6,
53
+ button: 2,
54
+ } as const;
39
55
 
56
+ // ==================== Types ====================
40
57
  export type QrLoginProps = {
41
58
  title?: string;
42
59
  description?: string;
43
60
  scanButtonText?: string;
44
61
  onBackPress?: () => void;
45
62
  onScanSuccess?: (value: string) => void;
63
+ onScanError?: (error: string) => void;
64
+ allowMultipleScans?: boolean;
46
65
  theme?: ThemeOverride;
47
- cameraType?: 'back' | 'front';
48
- layout?: 'one' | 'two';
49
66
  };
50
67
 
68
+ // ==================== Default Values ====================
51
69
  const DEFAULTS = {
52
70
  title: 'QR Login',
53
71
  description: 'Please move your camera over the QR Code',
54
72
  scanButtonText: 'Scan QR Code',
55
- cameraType: 'back' as const,
73
+ cameraType: CAMERA_TYPE,
74
+ } as const;
75
+
76
+ // ==================== Helper Functions ====================
77
+ /**
78
+ * Extracts error message from error object
79
+ */
80
+ const getErrorMessage = (error: unknown, defaultMessage: string): string => {
81
+ return error instanceof Error ? error.message : defaultMessage;
56
82
  };
57
83
 
58
- export const QrLogin: React.FC<QrLoginProps> = ({
59
- title = DEFAULTS.title,
60
- description = DEFAULTS.description,
61
- scanButtonText = DEFAULTS.scanButtonText,
62
- onBackPress,
63
- onScanSuccess,
64
- theme,
65
- cameraType = DEFAULTS.cameraType,
66
- layout = 'one',
67
- }) => {
68
- const { theme: appliedTheme } = useInternalTheme(theme);
69
- const { colors } = appliedTheme;
70
-
71
- const [scanActive, setScanActive] = useState(false);
72
- const [requesting, setRequesting] = useState(false);
84
+ /**
85
+ * Creates style with background color
86
+ */
87
+ const createBackgroundStyle = (
88
+ baseStyle: ViewStyle,
89
+ backgroundColor: string
90
+ ): ViewStyle[] => [baseStyle, { backgroundColor }];
73
91
 
74
- const device = useCameraDevice(cameraType);
75
- const { hasPermission, requestPermission } = useCameraPermission();
92
+ /**
93
+ * Creates text style with color
94
+ */
95
+ const createTextStyle = (baseStyle: TextStyle, color: string): TextStyle[] => [
96
+ baseStyle,
97
+ { color },
98
+ ];
76
99
 
100
+ // ==================== Custom Hooks ====================
101
+ /**
102
+ * Hook to manage QR scan state and timers
103
+ */
104
+ const useQrScanState = () => {
77
105
  const scanTimer = useRef<NodeJS.Timeout | null>(null);
106
+ const resetTimer = useRef<NodeJS.Timeout | null>(null);
78
107
  const lastValueRef = useRef<string | null>(null);
79
108
  const isScanning = useRef(false);
80
109
 
81
- // ---- Check if QR inside scan box ----
82
- const isCodeInsideBox = (code: Code): boolean => {
83
- if (!code.bounds) return true;
84
- const { origin, size } = code.bounds;
85
- if (!origin || !size) return true;
86
-
87
- const defaultBoxW = Math.min(SCREEN_W * 0.7, 320);
88
- const boxW = defaultBoxW * 0.9;
89
- const boxH = boxW;
90
- const availableHeight = SCREEN_H - HEADER_HEIGHT;
91
- const boxTop = Math.floor(
92
- HEADER_HEIGHT + (availableHeight - boxH) / 2 - scale(40)
93
- );
94
- const sideOverlayWidth = Math.floor((SCREEN_W - boxW) / 2);
110
+ const resetScanState = useCallback(() => {
111
+ if (scanTimer.current) {
112
+ clearTimeout(scanTimer.current);
113
+ scanTimer.current = null;
114
+ }
115
+ if (resetTimer.current) {
116
+ clearTimeout(resetTimer.current);
117
+ resetTimer.current = null;
118
+ }
119
+ isScanning.current = false;
120
+ lastValueRef.current = null;
121
+ }, []);
95
122
 
96
- return (
97
- origin.x >= sideOverlayWidth &&
98
- origin.y >= boxTop &&
99
- origin.x + size.width <= sideOverlayWidth + boxW &&
100
- origin.y + size.height <= boxTop + boxH
101
- );
123
+ useEffect(() => {
124
+ return () => {
125
+ resetScanState();
126
+ };
127
+ }, [resetScanState]);
128
+
129
+ return {
130
+ scanTimer,
131
+ resetTimer,
132
+ lastValueRef,
133
+ isScanning,
134
+ resetScanState,
102
135
  };
136
+ };
103
137
 
104
- // ---- Code Scanner ----
105
- const codeScanner = useCodeScanner({
106
- codeTypes: ['qr'],
107
- onCodeScanned: (codes) => {
108
- if (isScanning.current) return;
109
- for (const c of codes) {
110
- const code = c as Code;
111
- const value = code?.value;
112
- if (!value || !isCodeInsideBox(code)) continue;
113
-
114
- if (lastValueRef.current === value) return;
115
- lastValueRef.current = value;
116
-
117
- if (scanTimer.current) clearTimeout(scanTimer.current);
118
-
119
- scanTimer.current = setTimeout(() => {
120
- isScanning.current = true;
121
- setScanActive(false);
122
- onScanSuccess?.(value);
123
-
124
- setTimeout(() => {
125
- isScanning.current = false;
126
- lastValueRef.current = null;
127
- }, 1000);
128
- }, 1000);
129
-
130
- break;
131
- }
132
- },
133
- });
138
+ /**
139
+ * Hook to handle camera permission request
140
+ */
141
+ const useCameraPermissionHandler = (
142
+ hasPermission: boolean,
143
+ requestPermission: () => Promise<boolean>,
144
+ onError?: (error: string) => void
145
+ ) => {
146
+ const [requesting, setRequesting] = useState(false);
147
+
148
+ const requestCameraPermission = useCallback(async (): Promise<boolean> => {
149
+ if (hasPermission) return true;
134
150
 
135
- const startScan = async () => {
136
- if (!hasPermission) {
137
- setRequesting(true);
151
+ setRequesting(true);
152
+ try {
138
153
  const granted = await requestPermission();
139
154
  setRequesting(false);
140
- if (!granted) return;
155
+
156
+ if (!granted) {
157
+ onError?.('Camera permission denied');
158
+ return false;
159
+ }
160
+ return true;
161
+ } catch (error) {
162
+ setRequesting(false);
163
+ const errorMessage = getErrorMessage(
164
+ error,
165
+ 'Camera permission request failed'
166
+ );
167
+ console.warn('Camera permission request failed:', error);
168
+ onError?.(errorMessage);
169
+ return false;
141
170
  }
142
- setScanActive(true);
143
- };
171
+ }, [hasPermission, requestPermission, onError]);
172
+
173
+ return { requesting, requestCameraPermission };
174
+ };
175
+
176
+ // ==================== Sub-Components ====================
177
+ /**
178
+ * Camera view component when scanning is active
179
+ */
180
+ const CameraView: React.FC<{
181
+ device: ReturnType<typeof useCameraDevice>;
182
+ codeScanner: ReturnType<typeof useCodeScanner>;
183
+ theme?: ThemeOverride;
184
+ }> = React.memo(({ device, codeScanner, theme }) => {
185
+ if (!device) {
186
+ return null;
187
+ }
144
188
 
145
189
  return (
146
- <View style={[styles.container, { backgroundColor: colors.background }]}>
147
- <AppStatusBar theme={theme} />
148
-
149
- <View style={[styles.headerWrapper, { height: HEADER_HEIGHT }]}>
150
- <AppHeader
151
- title={title}
152
- onBackPress={onBackPress}
153
- theme={theme}
154
- titleAlign="left"
190
+ <>
191
+ <Camera
192
+ style={StyleSheet.absoluteFill}
193
+ device={device}
194
+ isActive={true}
195
+ codeScanner={codeScanner}
196
+ enableFpsGraph={false}
197
+ />
198
+ <QrViewArea theme={theme} />
199
+ </>
200
+ );
201
+ });
202
+
203
+ CameraView.displayName = 'CameraView';
204
+
205
+ /**
206
+ * No camera available view
207
+ */
208
+ const NoCameraView: React.FC<{
209
+ textStyle: TextStyle;
210
+ containerStyle: ViewStyle[];
211
+ }> = React.memo(({ textStyle, containerStyle }) => (
212
+ <View style={containerStyle}>
213
+ <Text style={textStyle}>No camera available</Text>
214
+ </View>
215
+ ));
216
+
217
+ NoCameraView.displayName = 'NoCameraView';
218
+
219
+ /**
220
+ * Initial scan screen with QR code preview
221
+ */
222
+ const ScanPreviewScreen: React.FC<{
223
+ description: string;
224
+ scanButtonText: string;
225
+ requesting: boolean;
226
+ onStartScan: () => void;
227
+ colors: {
228
+ button: string;
229
+ textPrimary: string;
230
+ primary: string;
231
+ skeletonBaseColor: string;
232
+ };
233
+ styles: {
234
+ descText: TextStyle[];
235
+ qrBox: ViewStyle[];
236
+ scanBtn: ViewStyle[];
237
+ scanText: TextStyle[];
238
+ iconMargin: ViewStyle;
239
+ buttonIconMargin: ViewStyle;
240
+ loaderMargin: ViewStyle;
241
+ };
242
+ }> = React.memo(
243
+ ({
244
+ description,
245
+ scanButtonText,
246
+ requesting,
247
+ onStartScan,
248
+ colors,
249
+ styles: componentStyles,
250
+ }) => (
251
+ <View style={styles.content}>
252
+ <View style={styles.card}>
253
+ <CameraIcon
254
+ size={scale(ICON_SIZES.camera)}
255
+ color={colors.button}
256
+ strokeWidth={STROKE_WIDTHS.icon}
257
+ style={componentStyles.iconMargin}
155
258
  />
259
+
260
+ <Text style={componentStyles.descText}>{description}</Text>
261
+
262
+ <View style={componentStyles.qrBox}>
263
+ <QrCode
264
+ size={scale(ICON_SIZES.qrCode)}
265
+ color={colors.button}
266
+ strokeWidth={STROKE_WIDTHS.icon}
267
+ />
268
+ </View>
269
+
270
+ <TouchableOpacity
271
+ style={componentStyles.scanBtn}
272
+ onPress={onStartScan}
273
+ activeOpacity={0.85}
274
+ >
275
+ <CameraIcon
276
+ size={scale(ICON_SIZES.button)}
277
+ color={colors.button}
278
+ strokeWidth={STROKE_WIDTHS.button}
279
+ style={componentStyles.buttonIconMargin}
280
+ />
281
+ <Text style={componentStyles.scanText}>{scanButtonText}</Text>
282
+ </TouchableOpacity>
283
+
284
+ {requesting && (
285
+ <ActivityIndicator
286
+ style={componentStyles.loaderMargin}
287
+ color={colors.primary}
288
+ />
289
+ )}
156
290
  </View>
291
+ </View>
292
+ )
293
+ );
294
+
295
+ ScanPreviewScreen.displayName = 'ScanPreviewScreen';
296
+
297
+ // ==================== Main Component ====================
298
+ export const QrLogin: React.FC<QrLoginProps> = React.memo(
299
+ ({
300
+ title = DEFAULTS.title,
301
+ description = DEFAULTS.description,
302
+ scanButtonText = DEFAULTS.scanButtonText,
303
+ onBackPress,
304
+ onScanSuccess,
305
+ onScanError,
306
+ allowMultipleScans = true,
307
+ theme,
308
+ }) => {
309
+ const { theme: appliedTheme } = useInternalTheme(theme);
310
+ const { colors } = appliedTheme;
311
+ const { top: statusBarHeight } = useSafeAreaInsets();
312
+
313
+ const [scanActive, setScanActive] = useState(false);
314
+
315
+ const device = useCameraDevice(DEFAULTS.cameraType);
316
+ const { hasPermission, requestPermission } = useCameraPermission();
157
317
 
158
- <View style={styles.cameraWrapper}>
159
- {scanActive ? (
160
- device ? (
161
- <>
162
- <Camera
163
- style={StyleSheet.absoluteFill}
318
+ // QR scan state management
319
+ const { scanTimer, resetTimer, lastValueRef, isScanning, resetScanState } =
320
+ useQrScanState();
321
+
322
+ // Camera permission handler
323
+ const { requesting, requestCameraPermission } = useCameraPermissionHandler(
324
+ hasPermission,
325
+ requestPermission,
326
+ onScanError
327
+ );
328
+
329
+ // Stop scanning
330
+ const stopScan = useCallback(() => {
331
+ resetScanState();
332
+ setScanActive(false);
333
+ }, [resetScanState]);
334
+
335
+ // Handle back press
336
+ const handleBackPress = useCallback(() => {
337
+ if (scanActive) {
338
+ stopScan();
339
+ }
340
+ onBackPress?.();
341
+ }, [scanActive, stopScan, onBackPress]);
342
+
343
+ // Handle code scanned
344
+ const handleCodeScanned = useCallback(
345
+ (codes: Code[]) => {
346
+ if (isScanning.current || codes.length === 0) return;
347
+
348
+ for (const code of codes) {
349
+ const value = code?.value;
350
+ if (!value) continue;
351
+
352
+ // Prevent duplicate scans
353
+ if (!allowMultipleScans && lastValueRef.current === value) return;
354
+
355
+ // Clear pending scan timer
356
+ if (scanTimer.current) {
357
+ clearTimeout(scanTimer.current);
358
+ scanTimer.current = null;
359
+ }
360
+
361
+ lastValueRef.current = value;
362
+
363
+ // Trigger success callback after delay
364
+ scanTimer.current = setTimeout(() => {
365
+ isScanning.current = true;
366
+ try {
367
+ onScanSuccess?.(value);
368
+ } catch (error) {
369
+ const errorMessage = getErrorMessage(
370
+ error,
371
+ 'Unknown error occurred'
372
+ );
373
+ onScanError?.(errorMessage);
374
+ console.error('QR scan success callback error:', error);
375
+ }
376
+
377
+ // Reset scan state after delay for re-scanning
378
+ if (allowMultipleScans) {
379
+ resetTimer.current = setTimeout(() => {
380
+ resetScanState();
381
+ }, RESET_DELAY_MS);
382
+ }
383
+ }, SCAN_DELAY_MS);
384
+
385
+ break;
386
+ }
387
+ },
388
+ [
389
+ onScanSuccess,
390
+ onScanError,
391
+ allowMultipleScans,
392
+ resetScanState,
393
+ isScanning,
394
+ lastValueRef,
395
+ resetTimer,
396
+ scanTimer,
397
+ ]
398
+ );
399
+
400
+ // Code scanner
401
+ const codeScanner = useCodeScanner({
402
+ codeTypes: ['qr'],
403
+ onCodeScanned: handleCodeScanned,
404
+ });
405
+
406
+ // Start scan
407
+ const startScan = useCallback(async () => {
408
+ resetScanState();
409
+
410
+ const hasPermissionGranted = await requestCameraPermission();
411
+ if (!hasPermissionGranted) return;
412
+
413
+ if (!device) {
414
+ onScanError?.('No camera device available');
415
+ return;
416
+ }
417
+
418
+ setScanActive(true);
419
+ }, [device, resetScanState, requestCameraPermission, onScanError]);
420
+
421
+ // Memoized styles
422
+ const containerStyle = useMemo(
423
+ () => createBackgroundStyle(styles.container, colors.background),
424
+ [colors.background]
425
+ );
426
+
427
+ const headerWrapperStyle = useMemo(
428
+ () => [
429
+ styles.headerWrapper,
430
+ {
431
+ height: statusBarHeight,
432
+ backgroundColor: colors.background,
433
+ },
434
+ ],
435
+ [colors.background, statusBarHeight]
436
+ );
437
+
438
+ const centerStyle = useMemo(
439
+ () => createBackgroundStyle(styles.center, colors.background),
440
+ [colors.background]
441
+ );
442
+
443
+ const descTextStyle = useMemo(
444
+ () => createTextStyle(styles.descText, colors.textPrimary),
445
+ [colors.textPrimary]
446
+ );
447
+
448
+ const qrBoxStyle = useMemo(
449
+ () => [
450
+ styles.qrBox,
451
+ {
452
+ borderColor: colors.primary,
453
+ backgroundColor: colors.skeletonBaseColor,
454
+ },
455
+ ],
456
+ [colors.primary, colors.skeletonBaseColor]
457
+ );
458
+
459
+ const scanBtnStyle = useMemo(
460
+ () => [styles.scanBtn, { borderColor: colors.button }],
461
+ [colors.button]
462
+ );
463
+
464
+ const scanTextStyle = useMemo(
465
+ () => createTextStyle(styles.scanText, colors.button),
466
+ [colors.button]
467
+ );
468
+
469
+ const noCameraTextStyle = useMemo(
470
+ () => ({ color: colors.textPrimary, fontSize: RFValue(16) }),
471
+ [colors.textPrimary]
472
+ );
473
+
474
+ const cameraWrapperStyle = useMemo(
475
+ () => [
476
+ styles.cameraWrapper,
477
+ {
478
+ top: statusBarHeight,
479
+ },
480
+ ],
481
+ [statusBarHeight]
482
+ );
483
+
484
+ const componentStyles = useMemo(
485
+ () => ({
486
+ descText: descTextStyle,
487
+ qrBox: qrBoxStyle,
488
+ scanBtn: scanBtnStyle,
489
+ scanText: scanTextStyle,
490
+ iconMargin: styles.iconMargin,
491
+ buttonIconMargin: styles.buttonIconMargin,
492
+ loaderMargin: styles.loaderMargin,
493
+ }),
494
+ [descTextStyle, qrBoxStyle, scanBtnStyle, scanTextStyle]
495
+ );
496
+
497
+ return (
498
+ <View style={containerStyle}>
499
+ <AppStatusBar theme={theme} />
500
+
501
+ <View style={headerWrapperStyle}>
502
+ <AppHeader
503
+ title={title}
504
+ onBackPress={handleBackPress}
505
+ theme={theme}
506
+ titleAlign="left"
507
+ />
508
+ </View>
509
+
510
+ <View style={cameraWrapperStyle}>
511
+ {scanActive ? (
512
+ device ? (
513
+ <CameraView
164
514
  device={device}
165
- isActive={true}
166
515
  codeScanner={codeScanner}
167
- />
168
- <QrViewArea
169
516
  theme={theme}
170
- layout={layout}
171
- headerHeight={HEADER_HEIGHT}
172
517
  />
173
- </>
174
- ) : (
175
- <View
176
- style={[styles.center, { backgroundColor: colors.background }]}
177
- >
178
- <Text
179
- style={{ color: colors.textPrimary, fontSize: RFValue(16) }}
180
- >
181
- No camera available
182
- </Text>
183
- </View>
184
- )
185
- ) : (
186
- <View style={styles.content}>
187
- <View style={styles.card}>
188
- <CameraIcon
189
- size={scale(50)}
190
- color={colors.button}
191
- strokeWidth={1.6}
192
- style={{ marginBottom: scale(12) }}
518
+ ) : (
519
+ <NoCameraView
520
+ textStyle={noCameraTextStyle}
521
+ containerStyle={centerStyle}
193
522
  />
194
-
195
- <Text style={[styles.descText, { color: colors.textPrimary }]}>
196
- {description}
197
- </Text>
198
-
199
- <View
200
- style={[
201
- styles.qrBox,
202
- {
203
- borderColor: colors.primary,
204
- backgroundColor: colors.skeletonBaseColor,
205
- },
206
- ]}
207
- >
208
- <QrCode
209
- size={scale(180)}
210
- color={colors.button}
211
- strokeWidth={1.6}
212
- />
213
- </View>
214
-
215
- <TouchableOpacity
216
- style={[styles.scanBtn, { borderColor: colors.button }]}
217
- onPress={startScan}
218
- activeOpacity={0.85}
219
- >
220
- <CameraIcon
221
- size={scale(22)}
222
- color={colors.button}
223
- strokeWidth={2}
224
- style={{ marginRight: 10 }}
225
- />
226
- <Text style={[styles.scanText, { color: colors.button }]}>
227
- {scanButtonText}
228
- </Text>
229
- </TouchableOpacity>
230
-
231
- {requesting && (
232
- <ActivityIndicator
233
- style={{ marginTop: scale(12) }}
234
- color={colors.primary}
235
- />
236
- )}
237
- </View>
238
- </View>
239
- )}
523
+ )
524
+ ) : (
525
+ <ScanPreviewScreen
526
+ description={description}
527
+ scanButtonText={scanButtonText}
528
+ requesting={requesting}
529
+ onStartScan={startScan}
530
+ colors={colors}
531
+ styles={componentStyles}
532
+ />
533
+ )}
534
+ </View>
240
535
  </View>
241
- </View>
242
- );
243
- };
536
+ );
537
+ }
538
+ );
539
+
540
+ QrLogin.displayName = 'QrLogin';
244
541
 
542
+ // ==================== Styles ====================
245
543
  const styles = StyleSheet.create({
246
544
  container: { flex: 1 },
247
545
  headerWrapper: {
@@ -254,7 +552,6 @@ const styles = StyleSheet.create({
254
552
  },
255
553
  cameraWrapper: {
256
554
  flex: 1,
257
- top: HEADER_HEIGHT,
258
555
  },
259
556
  center: {
260
557
  flex: 1,
@@ -269,8 +566,8 @@ const styles = StyleSheet.create({
269
566
  marginBottom: scale(50),
270
567
  },
271
568
  card: {
272
- width: SCREEN_W - scale(40),
273
- minHeight: SCREEN_H / 2.5,
569
+ width: SCREEN_W - scale(CARD_WIDTH_OFFSET),
570
+ minHeight: SCREEN_H / CARD_MIN_HEIGHT_RATIO,
274
571
  alignItems: 'center',
275
572
  padding: scale(20),
276
573
  },
@@ -297,6 +594,9 @@ const styles = StyleSheet.create({
297
594
  marginTop: scale(20),
298
595
  },
299
596
  scanText: { fontWeight: '600', fontSize: RFValue(14) },
597
+ iconMargin: { marginBottom: scale(12) },
598
+ buttonIconMargin: { marginRight: 10 },
599
+ loaderMargin: { marginTop: scale(12) },
300
600
  });
301
601
 
302
602
  export default QrLogin;