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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (276) hide show
  1. package/README.md +40 -36
  2. package/lib/module/components/Content/Card/components/AdsPoster.js +40 -55
  3. package/lib/module/components/Content/Card/components/AdsPoster.js.map +1 -1
  4. package/lib/module/components/Content/Card/components/CardPoster.js +81 -107
  5. package/lib/module/components/Content/Card/components/CardPoster.js.map +1 -1
  6. package/lib/module/components/Content/Card/components/ThumbnailCard.js +48 -70
  7. package/lib/module/components/Content/Card/components/ThumbnailCard.js.map +1 -1
  8. package/lib/module/components/Search/components/SearchCard.js +2 -2
  9. package/lib/module/components/Search/components/SearchCard.js.map +1 -1
  10. package/lib/typescript/src/components/Content/Card/components/AdsPoster.d.ts +1 -1
  11. package/lib/typescript/src/components/Content/Card/components/AdsPoster.d.ts.map +1 -1
  12. package/lib/typescript/src/components/Content/Card/components/CardPoster.d.ts.map +1 -1
  13. package/lib/typescript/src/components/Content/Card/components/ThumbnailCard.d.ts +1 -1
  14. package/lib/typescript/src/components/Content/Card/components/ThumbnailCard.d.ts.map +1 -1
  15. package/lib/typescript/src/components/Search/components/SearchCard.d.ts.map +1 -1
  16. package/package.json +1 -3
  17. package/lib/module/utils/colorUtils.js +0 -68
  18. package/lib/module/utils/colorUtils.js.map +0 -1
  19. package/lib/typescript/src/utils/colorUtils.d.ts +0 -19
  20. package/lib/typescript/src/utils/colorUtils.d.ts.map +0 -1
  21. package/src/assets/animations/135037-payment-processing-error.json +0 -1347
  22. package/src/assets/animations/7227-vui-animation.json +0 -3377
  23. package/src/assets/animations/Failed.json +0 -2103
  24. package/src/assets/animations/Pending.json +0 -522
  25. package/src/assets/animations/Successful.json +0 -2289
  26. package/src/assets/animations/heart.json +0 -788
  27. package/src/assets/animations/succesfull-payment.json +0 -2379
  28. package/src/assets/animations/voice-icon.json +0 -542
  29. package/src/assets/img/back.png +0 -0
  30. package/src/assets/img/bottom-panel.png +0 -0
  31. package/src/assets/img/camera.png +0 -0
  32. package/src/assets/img/camera2.png +0 -0
  33. package/src/assets/img/home.png +0 -0
  34. package/src/assets/img/lock.png +0 -0
  35. package/src/assets/img/play.png +0 -0
  36. package/src/assets/img/profile.jpg +0 -0
  37. package/src/assets/img/qr-code.png +0 -0
  38. package/src/assets/img/shadow.png +0 -0
  39. package/src/assets/img/shadow2.png +0 -0
  40. package/src/assets/img/user.png +0 -0
  41. package/src/assets/svg/Account.svg +0 -4
  42. package/src/assets/svg/Favourite.svg +0 -14
  43. package/src/assets/svg/Upcoming.svg +0 -4
  44. package/src/assets/svg/content-error.svg +0 -28
  45. package/src/assets/svg/download.svg +0 -3
  46. package/src/assets/svg/eye-off.svg +0 -10
  47. package/src/assets/svg/favorites.svg +0 -3
  48. package/src/assets/svg/h.svg +0 -4
  49. package/src/assets/svg/home.svg +0 -5
  50. package/src/assets/svg/home1.svg +0 -3
  51. package/src/assets/svg/menu-bar.svg +0 -4
  52. package/src/assets/svg/my-space.svg +0 -14
  53. package/src/assets/svg/play-icon-with-bg.svg +0 -5
  54. package/src/assets/svg/profile.svg +0 -4
  55. package/src/assets/svg/search.svg +0 -5
  56. package/src/assets/svg/search1.svg +0 -4
  57. package/src/assets/svg/server-error.svg +0 -139
  58. package/src/components/Account/Account.tsx +0 -354
  59. package/src/components/Account/index.ts +0 -6
  60. package/src/components/Alert/AlertDialog.tsx +0 -253
  61. package/src/components/Alert/UAAlert.tsx +0 -176
  62. package/src/components/Alert/index.ts +0 -7
  63. package/src/components/Auth/AuthProvider/AuthProvider.tsx +0 -412
  64. package/src/components/Auth/One/ForgotPassword/ForgotPassword.tsx +0 -333
  65. package/src/components/Auth/One/Login/LoginWithEmail.tsx +0 -449
  66. package/src/components/Auth/One/Login/LoginWithPhone.tsx +0 -309
  67. package/src/components/Auth/One/OTP/OTP.tsx +0 -539
  68. package/src/components/Auth/One/QrLogin/QrLogin.tsx +0 -329
  69. package/src/components/Auth/One/QrLogin/components/index.ts +0 -8
  70. package/src/components/Auth/One/QrLogin/components/qr-scanner-fallback.tsx +0 -158
  71. package/src/components/Auth/One/QrLogin/components/qr-scanner-frame.tsx +0 -207
  72. package/src/components/Auth/One/QrLogin/components/qr-scanner-header.tsx +0 -65
  73. package/src/components/Auth/One/QrLogin/components/qr-scanner-intro.tsx +0 -255
  74. package/src/components/Auth/One/QrLogin/components/qr-scanner-overlay.tsx +0 -291
  75. package/src/components/Auth/One/SignUp/SignUp.tsx +0 -470
  76. package/src/components/Auth/One/SplashScreen/SplashScreen.tsx +0 -229
  77. package/src/components/Auth/One/SplashScreen/components/SplashImage/SplashImage.tsx +0 -92
  78. package/src/components/Auth/One/SplashScreen/components/SplashLottie/SplashLottie.tsx +0 -129
  79. package/src/components/Auth/One/SplashScreen/components/SplashVideo/SplashVideo.tsx +0 -172
  80. package/src/components/Auth/One/SplashScreen/utils/splashUtils.ts +0 -23
  81. package/src/components/Auth/One/index.ts +0 -24
  82. package/src/components/Auth/Two/AuthHeader/AuthHeader.tsx +0 -130
  83. package/src/components/Auth/Two/ForgotPassword/ForgotPassword.tsx +0 -331
  84. package/src/components/Auth/Two/Login/EmailOrPhoneLogin.tsx +0 -612
  85. package/src/components/Auth/Two/OTP/OTP.tsx +0 -504
  86. package/src/components/Auth/Two/SignUp/SignUp.tsx +0 -439
  87. package/src/components/Auth/Two/index.ts +0 -20
  88. package/src/components/Auth/index.ts +0 -16
  89. package/src/components/BackgroundLayout/One/One.tsx +0 -184
  90. package/src/components/BackgroundLayout/Two/Two.tsx +0 -65
  91. package/src/components/BackgroundLayout/index.ts +0 -14
  92. package/src/components/BlogView/BlogView.tsx +0 -282
  93. package/src/components/BlogView/index.ts +0 -8
  94. package/src/components/BlurView/BlurView.tsx +0 -199
  95. package/src/components/BlurView/index.ts +0 -7
  96. package/src/components/BottomSheet/BottomSheet.tsx +0 -204
  97. package/src/components/BottomSheet/BottomSheetOne.tsx +0 -223
  98. package/src/components/BottomSheet/index.ts +0 -9
  99. package/src/components/Button/BackBtn.tsx +0 -149
  100. package/src/components/Button/MenuBtn.tsx +0 -220
  101. package/src/components/Button/PrimaryBtn.tsx +0 -123
  102. package/src/components/Button/SecondaryBtn.tsx +0 -123
  103. package/src/components/Button/TextButton.tsx +0 -150
  104. package/src/components/Button/index.ts +0 -18
  105. package/src/components/Button/types.ts +0 -33
  106. package/src/components/Content/Card/Category/Category.tsx +0 -436
  107. package/src/components/Content/Card/Category/CategroyTwo.tsx +0 -429
  108. package/src/components/Content/Card/NowWatching/NowWatching.tsx +0 -607
  109. package/src/components/Content/Card/Sliders/Styles/One.tsx +0 -490
  110. package/src/components/Content/Card/Sliders/Styles/Three.tsx +0 -1017
  111. package/src/components/Content/Card/Sliders/Styles/Two.tsx +0 -395
  112. package/src/components/Content/Card/Sliders/index.ts +0 -18
  113. package/src/components/Content/Card/Styles/Five.tsx +0 -367
  114. package/src/components/Content/Card/Styles/Four.tsx +0 -366
  115. package/src/components/Content/Card/Styles/One.tsx +0 -372
  116. package/src/components/Content/Card/Styles/RotateInOut.tsx +0 -413
  117. package/src/components/Content/Card/Styles/Six.tsx +0 -378
  118. package/src/components/Content/Card/Styles/Three.tsx +0 -312
  119. package/src/components/Content/Card/Styles/TopTen.tsx +0 -402
  120. package/src/components/Content/Card/Styles/Two.tsx +0 -404
  121. package/src/components/Content/Card/components/AdsPoster.tsx +0 -207
  122. package/src/components/Content/Card/components/CardPoster.tsx +0 -377
  123. package/src/components/Content/Card/components/LiveBadge.tsx +0 -125
  124. package/src/components/Content/Card/components/NavigateToMore.tsx +0 -97
  125. package/src/components/Content/Card/components/RentOrBuyIcon.tsx +0 -134
  126. package/src/components/Content/Card/components/ShowAllButton.tsx +0 -92
  127. package/src/components/Content/Card/components/ThumbnailCard.tsx +0 -219
  128. package/src/components/Content/Card/components/index.ts +0 -12
  129. package/src/components/Content/Card/index.ts +0 -31
  130. package/src/components/Content/Content.tsx +0 -338
  131. package/src/components/Content/Sections.tsx +0 -239
  132. package/src/components/Content/types.ts +0 -180
  133. package/src/components/ContentView/MoreContentList.tsx +0 -330
  134. package/src/components/ContentView/One/ContentViewOne.tsx +0 -251
  135. package/src/components/ContentView/One/components/CastCard.tsx +0 -266
  136. package/src/components/ContentView/One/components/HeroBanner.tsx +0 -413
  137. package/src/components/ContentView/One/components/MiniInfo.tsx +0 -343
  138. package/src/components/ContentView/One/components/Title.tsx +0 -149
  139. package/src/components/ContentView/Two/ContentViewTwo.tsx +0 -332
  140. package/src/components/ContentView/Two/components/Details.tsx +0 -196
  141. package/src/components/ContentView/Two/components/HeroBanner.tsx +0 -267
  142. package/src/components/ContentView/Two/components/LikeShareActions.tsx +0 -125
  143. package/src/components/ContentView/Two/components/MoreLikeThisContentList .tsx +0 -308
  144. package/src/components/ContentView/Two/components/PlayOrTrailer.tsx +0 -162
  145. package/src/components/ContentView/Two/components/SectionTabs.tsx +0 -181
  146. package/src/components/ContentView/Two/components/Title.tsx +0 -229
  147. package/src/components/ContentView/Two/components/index.ts +0 -12
  148. package/src/components/ContentView/index.ts +0 -13
  149. package/src/components/ContentView/shared/AboutSection.tsx +0 -226
  150. package/src/components/ContentView/shared/EpisodeCard.tsx +0 -600
  151. package/src/components/ContentView/shared/GenreTags.tsx +0 -189
  152. package/src/components/ContentView/shared/PlayButton.tsx +0 -52
  153. package/src/components/ContentView/shared/TrailerButton.tsx +0 -76
  154. package/src/components/Fallbacks/NoContentFallback.tsx +0 -175
  155. package/src/components/Fallbacks/NotFoundFallback.tsx +0 -94
  156. package/src/components/Fallbacks/index.ts +0 -7
  157. package/src/components/Headers/AppHeader.tsx +0 -151
  158. package/src/components/Headers/Four.tsx +0 -84
  159. package/src/components/Headers/One.tsx +0 -115
  160. package/src/components/Headers/Three.tsx +0 -137
  161. package/src/components/Headers/Two.tsx +0 -101
  162. package/src/components/Headers/index.ts +0 -34
  163. package/src/components/Input/Input.ts +0 -18
  164. package/src/components/Input/InputOne.tsx +0 -265
  165. package/src/components/Input/InputThree.tsx +0 -205
  166. package/src/components/Input/InputTwo.tsx +0 -217
  167. package/src/components/Input/PhoneInput/One/One.tsx +0 -415
  168. package/src/components/Input/PhoneInput/Two/Two.tsx +0 -406
  169. package/src/components/Input/PhoneInput/index.ts +0 -14
  170. package/src/components/Keyboard/HideKeyboard.tsx +0 -91
  171. package/src/components/Loader/Loader.tsx +0 -49
  172. package/src/components/Logo/Logo.tsx +0 -150
  173. package/src/components/NewRelease/NewReleaseSheet.tsx +0 -260
  174. package/src/components/NewRelease/index.ts +0 -6
  175. package/src/components/Reels/ReelsSeries/MediaControls/BottomControls.tsx +0 -226
  176. package/src/components/Reels/ReelsSeries/MediaControls/MediaControlsProvider.tsx +0 -324
  177. package/src/components/Reels/ReelsSeries/MediaControls/MiddleControls.tsx +0 -201
  178. package/src/components/Reels/ReelsSeries/MediaControls/RightControls.tsx +0 -100
  179. package/src/components/Reels/ReelsSeries/MediaControls/TopControls.tsx +0 -168
  180. package/src/components/Reels/ReelsSeries/Model/DetailsModal.tsx +0 -207
  181. package/src/components/Reels/ReelsSeries/Model/SettingModal.tsx +0 -151
  182. package/src/components/Reels/ReelsSeries/Model/UnlockModal.tsx +0 -159
  183. package/src/components/Reels/ReelsSeries/ReelsSeries.tsx +0 -278
  184. package/src/components/Reels/ReelsSeries/ReelsSeriesItem.tsx +0 -569
  185. package/src/components/Reels/ReelsSeries/components/AnimatedThreeLines.tsx +0 -189
  186. package/src/components/Reels/ReelsSeries/components/Episodes.tsx +0 -159
  187. package/src/components/Reels/ReelsSeries/components/GradientOverlay.tsx +0 -46
  188. package/src/components/Reels/ReelsSeries/components/Like.tsx +0 -45
  189. package/src/components/Reels/ReelsSeries/components/RotatingLoader.tsx +0 -84
  190. package/src/components/Reels/ReelsSeries/components/Synopsis.tsx +0 -338
  191. package/src/components/Reels/ReelsSeries/components/VideoControls/QualityControl.tsx +0 -185
  192. package/src/components/Reels/ReelsSeries/components/VideoControls/SpeedControl.tsx +0 -77
  193. package/src/components/Reels/ReelsSeries/components/VideoControls/index.ts +0 -7
  194. package/src/components/Reels/ReelsSeries/types.ts +0 -78
  195. package/src/components/Reels/ReelsSeries/useReelsWatchProgress.ts +0 -90
  196. package/src/components/Reels/ReelsSeries/utils/quality.ts +0 -72
  197. package/src/components/Reels/index.ts +0 -9
  198. package/src/components/Reels/utils/Controls/gestureUtils.ts +0 -46
  199. package/src/components/Reels/utils/Controls/index.ts +0 -9
  200. package/src/components/Reels/utils/Controls/overlayUtils.ts +0 -40
  201. package/src/components/Reels/utils/Controls/videoControlsConstants.ts +0 -30
  202. package/src/components/Reels/utils/Controls/videoRef.ts +0 -9
  203. package/src/components/Reels/utils/index.ts +0 -6
  204. package/src/components/Reels/utils/timeoutUtils.ts +0 -34
  205. package/src/components/Search/One.tsx +0 -262
  206. package/src/components/Search/components/RecentSearchesSection.tsx +0 -181
  207. package/src/components/Search/components/SearchCard.tsx +0 -285
  208. package/src/components/Search/index.ts +0 -16
  209. package/src/components/Settings/AppSettings.tsx +0 -442
  210. package/src/components/Settings/index.ts +0 -6
  211. package/src/components/Subscription/SubOne.tsx +0 -423
  212. package/src/components/Subscription/components/SubsDetailsModal.tsx +0 -347
  213. package/src/components/Subscription/components/SubscriptionCard.tsx +0 -342
  214. package/src/components/Subscription/index.ts +0 -12
  215. package/src/components/TabBar/One.tsx +0 -145
  216. package/src/components/TabBar/Three.tsx +0 -162
  217. package/src/components/TabBar/Two.tsx +0 -179
  218. package/src/components/TabBar/index.ts +0 -20
  219. package/src/components/Text/Text.tsx +0 -90
  220. package/src/components/Text/index.ts +0 -6
  221. package/src/components/User/DeviceSessions/DeviceSessions.tsx +0 -468
  222. package/src/components/User/ProfileUpdate/ProfileUpdate.tsx +0 -293
  223. package/src/components/User/PurchaseHistory/PurchaseHistory.tsx +0 -504
  224. package/src/components/User/WatchHistory/WatchHistory.tsx +0 -214
  225. package/src/components/User/WatchLater/WatchLater.tsx +0 -400
  226. package/src/components/User/components/UserAvatar.tsx +0 -121
  227. package/src/components/User/components/UserSection.tsx +0 -218
  228. package/src/components/User/index.ts +0 -18
  229. package/src/components/View/View.tsx +0 -38
  230. package/src/components/View/index.ts +0 -6
  231. package/src/components/common/AppStatusBar.tsx +0 -57
  232. package/src/components/common/index.ts +0 -1
  233. package/src/components/index.ts +0 -30
  234. package/src/components/layout/SafeAreaWrapper.tsx +0 -50
  235. package/src/components/layout/index.ts +0 -6
  236. package/src/constants/dummySections.ts +0 -103
  237. package/src/hooks/Images/index.ts +0 -6
  238. package/src/hooks/Images/useImageLoader.ts +0 -209
  239. package/src/hooks/index.ts +0 -16
  240. package/src/hooks/useAdTracking.ts +0 -354
  241. package/src/hooks/useCards.ts +0 -247
  242. package/src/hooks/useDebounce.ts +0 -40
  243. package/src/hooks/useKeyboard.ts +0 -43
  244. package/src/hooks/useNavigationMode.ts +0 -48
  245. package/src/hooks/usePaginatedSection.ts +0 -108
  246. package/src/hooks/usePrevious.ts +0 -28
  247. package/src/hooks/useSafeCallback.ts +0 -29
  248. package/src/hooks/useSkeletonItems.ts +0 -30
  249. package/src/hooks/useSplashCache.ts +0 -245
  250. package/src/index.tsx +0 -9
  251. package/src/store/RecentSearchesStore.ts +0 -72
  252. package/src/store/splashStore.ts +0 -86
  253. package/src/store/storage.ts +0 -29
  254. package/src/theme/ThemeContext.ts +0 -19
  255. package/src/theme/ThemeProvider.tsx +0 -87
  256. package/src/theme/hooks/index.ts +0 -6
  257. package/src/theme/hooks/useTheme.ts +0 -118
  258. package/src/theme/index.ts +0 -8
  259. package/src/theme/store/theme.ts +0 -50
  260. package/src/theme/themes.ts +0 -262
  261. package/src/theme/utils/cleanColors.ts +0 -71
  262. package/src/theme/utils/toRgba.ts +0 -150
  263. package/src/types/content/content-view.types.ts +0 -209
  264. package/src/types/hook/index.ts +0 -6
  265. package/src/types/hook/usePaginatedSection.ts +0 -20
  266. package/src/types/index.ts +0 -10
  267. package/src/types/navigation.ts +0 -17
  268. package/src/types/sections/index.ts +0 -87
  269. package/src/types/user.ts +0 -18
  270. package/src/utils/Display.ts +0 -15
  271. package/src/utils/Formater.ts +0 -33
  272. package/src/utils/SizeMatters.ts +0 -8
  273. package/src/utils/Spacing.ts +0 -27
  274. package/src/utils/colorUtils.ts +0 -70
  275. package/src/utils/imageValidation.ts +0 -36
  276. package/src/utils/interaction.ts +0 -19
@@ -1,504 +0,0 @@
1
- /**
2
- * @author Naresh Dhamu
3
- * @LastModified Mon 13 Jul 2026 at 10:13 AM
4
- */
5
-
6
- import React, {
7
- memo,
8
- useMemo,
9
- useState,
10
- useCallback,
11
- useEffect,
12
- useRef,
13
- } from 'react';
14
- import {
15
- View,
16
- type ViewStyle,
17
- type TextStyle,
18
- type KeyboardTypeOptions,
19
- type StyleProp,
20
- StyleSheet,
21
- Platform,
22
- } from 'react-native';
23
- import {
24
- CodeField,
25
- Cursor,
26
- useBlurOnFulfill,
27
- useClearByFocusCell,
28
- } from 'react-native-confirmation-code-field';
29
- import { scale, verticalScale } from 'react-native-size-matters';
30
-
31
- import HideKeyboard from '../../../Keyboard/HideKeyboard';
32
- import { useKeyboard } from '../../../../hooks/useKeyboard';
33
- import BackBtn from '../../../Button/BackBtn';
34
- import { useTheme } from '../../../../theme';
35
- import { Button } from '../../../Button';
36
- import Display from '../../../../utils/Display';
37
- import { Text } from '../../../Text';
38
- import type { ThemeOverride } from '../../../../theme/themes';
39
- import { RFValue } from 'react-native-responsive-fontsize';
40
- import { MessageSquare } from 'lucide-react-native';
41
- import { BackgroundLayout } from '../../../BackgroundLayout';
42
-
43
- type OTPProps = {
44
- title?: string;
45
- countryCode?: string;
46
- onSubmit?: (values: { otp: string }) => Promise<void> | void;
47
- onTopBackBtnPress?: () => void;
48
- containerStyle?: StyleProp<ViewStyle>;
49
- titleStyle?: StyleProp<TextStyle>;
50
- formStyle?: StyleProp<ViewStyle>;
51
- backBtnStyle?: StyleProp<ViewStyle>;
52
- loading?: boolean;
53
- theme?: ThemeOverride;
54
- otpDigitCount?: number;
55
- keyboardType?: KeyboardTypeOptions;
56
- phoneNumber?: string;
57
- enableAutoFill?: boolean;
58
- autoSubmitOnFill?: boolean;
59
- text?: {
60
- otpLabel?: string;
61
- otpPlaceholder?: string;
62
- loadingSubmitBtnText?: string;
63
- submitButton?: string;
64
- otpSentText?: string;
65
- resendOtpText?: string;
66
- resendOtpCountdownText?: string;
67
- };
68
- // Resend
69
- onResendOtp?: () => void;
70
- resendDisabledTime?: number;
71
-
72
- // Render Props
73
- renderSubmitButton?: (props: {
74
- onPress: () => void;
75
- disabled: boolean;
76
- loading: boolean;
77
- }) => React.ReactNode;
78
- renderBackButton?: (props: { onPress: () => void }) => React.ReactNode;
79
- renderOtpInput?: (props: {
80
- value: string;
81
- onChange: (value: string) => void;
82
- isFocused: boolean[];
83
- }) => React.ReactNode;
84
-
85
- // Style Overrides
86
- cellStyle?: StyleProp<TextStyle>;
87
- focusCellStyle?: StyleProp<TextStyle>;
88
- };
89
-
90
- const DEFAULT_TEXT = {
91
- otpLabel: 'Enter OTP',
92
- otpPlaceholder: '••••',
93
- submitButton: 'Verify OTP',
94
- loadingSubmitBtnText: 'Verifying...',
95
- otpSentText: 'A OTP has been sent to',
96
- resendOtpText: 'Resend OTP',
97
- resendOtpCountdownText: 'Resend OTP in',
98
- };
99
-
100
- const AUTO_SUBMIT_DELAY_MS = 300;
101
- const RESEND_COUNTDOWN_INTERVAL_MS = 1000;
102
-
103
- const OTP: React.FC<OTPProps> = ({
104
- title,
105
- onSubmit,
106
- onTopBackBtnPress,
107
- containerStyle,
108
- titleStyle,
109
- formStyle,
110
- backBtnStyle,
111
- loading = false,
112
- theme: overrideTheme,
113
- otpDigitCount = 4,
114
- keyboardType = 'number-pad',
115
- phoneNumber,
116
- countryCode = '91',
117
- enableAutoFill = true,
118
- autoSubmitOnFill = true,
119
- text = DEFAULT_TEXT,
120
- onResendOtp,
121
- resendDisabledTime = 30,
122
- renderSubmitButton,
123
- renderBackButton,
124
- renderOtpInput,
125
- cellStyle,
126
- focusCellStyle,
127
- }) => {
128
- const { theme: resolvedTheme } = useTheme(overrideTheme);
129
- const { isKeyboardOpen } = useKeyboard();
130
- const [otp, setOtp] = useState('');
131
- const [isSubmitting, setIsSubmitting] = useState(false);
132
- const [resendTimer, setResendTimer] = useState(resendDisabledTime);
133
- const hasAutoSubmittedRef = useRef(false);
134
- const autoSubmitTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
135
- const lastAutoSubmittedOtpRef = useRef<string>('');
136
- const handleSubmitRef = useRef<() => Promise<void>>(() => Promise.resolve());
137
-
138
- const ref = useBlurOnFulfill({ value: otp, cellCount: otpDigitCount });
139
- const [codeFieldProps, getCellOnLayoutHandler] = useClearByFocusCell({
140
- value: otp,
141
- setValue: setOtp,
142
- });
143
-
144
- const setOtpDigitsOnly = useCallback((value: string) => {
145
- setOtp(value.replace(/\D/g, ''));
146
- }, []);
147
-
148
- const isFocusedArray = useMemo(
149
- () => Array.from({ length: otpDigitCount }, (_, i) => otp.length === i),
150
- [otp.length, otpDigitCount]
151
- );
152
-
153
- const styles = useMemo(
154
- () =>
155
- StyleSheet.create({
156
- container: {
157
- flex: 1,
158
- width: '100%',
159
- paddingHorizontal: scale(16),
160
- justifyContent: 'center',
161
- alignItems: 'center',
162
- },
163
- topBackBtnWrapper: {
164
- position: 'absolute',
165
- top: verticalScale(5),
166
- left: scale(10),
167
- right: scale(16),
168
- zIndex: 10,
169
- },
170
- headerTitle: {
171
- fontSize: RFValue(18),
172
- fontWeight: '400',
173
- marginLeft: scale(10),
174
- color: resolvedTheme.colors.textPrimary,
175
- },
176
-
177
- centerContent: {
178
- flex: 1,
179
- width: '100%',
180
- maxWidth: scale(400),
181
- alignItems: 'center',
182
- justifyContent: 'center',
183
- gap: verticalScale(4),
184
- },
185
- form: {
186
- width: '100%',
187
- gap: verticalScale(20),
188
- alignItems: 'center',
189
- marginTop: verticalScale(24),
190
- marginBottom: isKeyboardOpen ? verticalScale(20) : 0,
191
- },
192
- codeFieldRoot: {
193
- width: Display.setWidth(80),
194
- marginTop: scale(10),
195
- },
196
- cell: {
197
- width: scale(55),
198
- height: scale(55),
199
- fontSize: RFValue(26),
200
- fontWeight: '500',
201
- paddingTop: Platform.OS === 'ios' ? scale(9) : scale(7),
202
- borderWidth: scale(0.5),
203
- borderRadius: scale(8),
204
- justifyContent: 'center',
205
- alignItems: 'center',
206
- textAlign: 'center',
207
- alignSelf: 'center',
208
- overflow: 'hidden',
209
- color: resolvedTheme.colors.textPrimary,
210
- borderColor: resolvedTheme.colors.textPrimary,
211
- },
212
- focusCell: {
213
- borderColor: resolvedTheme.colors.primary,
214
- backgroundColor: resolvedTheme.colors.border,
215
- },
216
- otpInfoRow: {
217
- flexDirection: 'row',
218
- alignItems: 'center',
219
- justifyContent: 'center',
220
- marginTop: verticalScale(12),
221
- flexWrap: 'wrap',
222
- },
223
- otpInfoText: {
224
- fontSize: RFValue(12),
225
- color: resolvedTheme.colors.onSurfaceVariant,
226
- flexShrink: 0,
227
- },
228
- otpPhone: {
229
- fontSize: RFValue(13),
230
- fontWeight: '500',
231
- marginLeft: scale(4),
232
- color: resolvedTheme.colors.textPrimary,
233
- flexShrink: 0,
234
- },
235
- resendRow: {
236
- flexDirection: 'row',
237
- alignItems: 'center',
238
- gap: scale(6),
239
- },
240
- resendSection: {
241
- alignItems: 'center',
242
- marginTop: verticalScale(10),
243
- },
244
- resendText: {
245
- fontSize: RFValue(12),
246
- },
247
- resendTextDisabled: {
248
- color: resolvedTheme.colors.onSurfaceVariant,
249
- },
250
- resendTextActive: {
251
- color: resolvedTheme.colors.textPrimary,
252
- },
253
- submitButtonTitle: {
254
- fontSize: RFValue(13),
255
- },
256
- }),
257
- [
258
- isKeyboardOpen,
259
- resolvedTheme.colors.border,
260
- resolvedTheme.colors.onSurfaceVariant,
261
- resolvedTheme.colors.primary,
262
- resolvedTheme.colors.textPrimary,
263
- ]
264
- );
265
-
266
- useEffect(() => {
267
- if (resendTimer <= 0) return;
268
- const timer = setInterval(
269
- () => setResendTimer((prev) => prev - 1),
270
- RESEND_COUNTDOWN_INTERVAL_MS
271
- );
272
- return () => clearInterval(timer);
273
- }, [resendTimer]);
274
-
275
- const handleSubmit = useCallback(async () => {
276
- if (!onSubmit || otp.length !== otpDigitCount) return;
277
- setIsSubmitting(true);
278
- try {
279
- await onSubmit({ otp });
280
- } catch (error) {
281
- console.error('OTP submission error:', error);
282
- } finally {
283
- setIsSubmitting(false);
284
- }
285
- }, [onSubmit, otp, otpDigitCount]);
286
-
287
- handleSubmitRef.current = handleSubmit;
288
-
289
- useEffect(() => {
290
- if (autoSubmitTimerRef.current) {
291
- clearTimeout(autoSubmitTimerRef.current);
292
- autoSubmitTimerRef.current = null;
293
- }
294
-
295
- if (otp.length !== otpDigitCount) {
296
- hasAutoSubmittedRef.current = false;
297
- lastAutoSubmittedOtpRef.current = '';
298
- return undefined;
299
- }
300
-
301
- if (lastAutoSubmittedOtpRef.current === otp) return undefined;
302
-
303
- if (
304
- !autoSubmitOnFill ||
305
- hasAutoSubmittedRef.current ||
306
- isSubmitting ||
307
- loading ||
308
- !onSubmit
309
- ) {
310
- return undefined;
311
- }
312
-
313
- hasAutoSubmittedRef.current = true;
314
- lastAutoSubmittedOtpRef.current = otp;
315
-
316
- autoSubmitTimerRef.current = setTimeout(() => {
317
- if (otp.length === otpDigitCount && !isSubmitting && !loading) {
318
- handleSubmitRef.current();
319
- } else {
320
- hasAutoSubmittedRef.current = false;
321
- lastAutoSubmittedOtpRef.current = '';
322
- }
323
- autoSubmitTimerRef.current = null;
324
- }, AUTO_SUBMIT_DELAY_MS);
325
-
326
- return () => {
327
- if (autoSubmitTimerRef.current) {
328
- clearTimeout(autoSubmitTimerRef.current);
329
- autoSubmitTimerRef.current = null;
330
- }
331
- };
332
- }, [otp, otpDigitCount, autoSubmitOnFill, isSubmitting, loading, onSubmit]);
333
-
334
- const handleResendOtp = useCallback(() => {
335
- if (onResendOtp) {
336
- onResendOtp();
337
- setResendTimer(resendDisabledTime);
338
- }
339
- }, [onResendOtp, resendDisabledTime]);
340
-
341
- const isLoading = useMemo(
342
- () => loading || isSubmitting,
343
- [loading, isSubmitting]
344
- );
345
- const isSubmitDisabled = useMemo(
346
- () => otp.length !== otpDigitCount || isLoading,
347
- [otp.length, otpDigitCount, isLoading]
348
- );
349
- const shouldRender = useMemo(
350
- () =>
351
- (condition?: boolean | unknown): boolean =>
352
- typeof condition === 'function' || !!condition,
353
- []
354
- );
355
-
356
- const renderCell = useCallback(
357
- ({
358
- index,
359
- symbol,
360
- isFocused,
361
- }: {
362
- index: number;
363
- symbol: string;
364
- isFocused: boolean;
365
- }) => (
366
- <Text
367
- key={index}
368
- style={[
369
- styles.cell,
370
- cellStyle,
371
- isFocused && styles.focusCell,
372
- isFocused && focusCellStyle,
373
- ]}
374
- onLayout={getCellOnLayoutHandler(index)}
375
- >
376
- {symbol || (isFocused ? <Cursor /> : null)}
377
- </Text>
378
- ),
379
- [styles, cellStyle, focusCellStyle, getCellOnLayoutHandler]
380
- );
381
-
382
- const noop = useCallback(() => {}, []);
383
-
384
- return (
385
- <BackgroundLayout.Two>
386
- <View style={[styles.container, containerStyle]}>
387
- {shouldRender(renderBackButton || onTopBackBtnPress) && (
388
- <View style={styles.topBackBtnWrapper}>
389
- {renderBackButton ? (
390
- renderBackButton({
391
- onPress: onTopBackBtnPress ?? noop,
392
- })
393
- ) : (
394
- <BackBtn
395
- theme={overrideTheme}
396
- style={backBtnStyle}
397
- onPress={onTopBackBtnPress}
398
- textStyle={[styles.headerTitle, titleStyle]}
399
- label={title ?? DEFAULT_TEXT.otpLabel}
400
- />
401
- )}
402
- </View>
403
- )}
404
- <HideKeyboard>
405
- <View style={styles.centerContent}>
406
- {phoneNumber && (
407
- <View style={styles.otpInfoRow}>
408
- <Text style={styles.otpInfoText}>A OTP has been sent to</Text>
409
- <Text style={styles.otpPhone}>
410
- +{countryCode} {phoneNumber.replace(/\D/g, '')}
411
- </Text>
412
- </View>
413
- )}
414
-
415
- <View style={[styles.form, formStyle]}>
416
- {renderOtpInput ? (
417
- renderOtpInput({
418
- value: otp,
419
- onChange: setOtpDigitsOnly,
420
- isFocused: isFocusedArray,
421
- })
422
- ) : (
423
- <CodeField
424
- ref={ref}
425
- {...codeFieldProps}
426
- value={otp}
427
- onChangeText={setOtpDigitsOnly}
428
- cellCount={otpDigitCount}
429
- rootStyle={styles.codeFieldRoot}
430
- keyboardType={keyboardType}
431
- textContentType={enableAutoFill ? 'oneTimeCode' : 'none'}
432
- autoComplete={
433
- enableAutoFill
434
- ? Platform.OS === 'android'
435
- ? 'sms-otp'
436
- : 'off'
437
- : 'off'
438
- }
439
- renderCell={renderCell}
440
- />
441
- )}
442
-
443
- {renderSubmitButton ? (
444
- renderSubmitButton({
445
- onPress: handleSubmit,
446
- disabled: isSubmitDisabled,
447
- loading: isLoading,
448
- })
449
- ) : (
450
- <Button.Primary
451
- title={text?.submitButton ?? DEFAULT_TEXT.submitButton}
452
- theme={overrideTheme}
453
- onPress={handleSubmit}
454
- loadingText={
455
- text?.loadingSubmitBtnText ??
456
- DEFAULT_TEXT.loadingSubmitBtnText
457
- }
458
- titleStyle={styles.submitButtonTitle}
459
- disabled={isSubmitDisabled}
460
- loading={isLoading}
461
- />
462
- )}
463
-
464
- {/* Resend OTP Section */}
465
-
466
- {!isKeyboardOpen && (
467
- <View style={styles.resendSection}>
468
- <Button.TextButton
469
- title={
470
- resendTimer > 0
471
- ? `${text?.resendOtpCountdownText ?? DEFAULT_TEXT.resendOtpCountdownText} ${resendTimer}s`
472
- : (text?.resendOtpText ?? DEFAULT_TEXT.resendOtpText)
473
- }
474
- onPress={handleResendOtp}
475
- disabled={resendTimer > 0}
476
- color={
477
- resendTimer > 0
478
- ? resolvedTheme.colors.onSurfaceVariant
479
- : resolvedTheme.colors.textPrimary
480
- }
481
- leftIcon={
482
- <MessageSquare
483
- size={scale(14)}
484
- color={
485
- resendTimer > 0
486
- ? resolvedTheme.colors.onSurfaceVariant
487
- : resolvedTheme.colors.textPrimary
488
- }
489
- />
490
- }
491
- style={{ fontSize: RFValue(12), marginLeft: scale(6) }}
492
- bold
493
- />
494
- </View>
495
- )}
496
- </View>
497
- </View>
498
- </HideKeyboard>
499
- </View>
500
- </BackgroundLayout.Two>
501
- );
502
- };
503
-
504
- export default memo(OTP);