@zezosoft/zezo-ott-react-native-ui-kit 1.1.5 → 1.1.7

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