import { useTranslation } from 'react-i18next'; import { Box, Button, Stack, Typography } from '@mui/material'; import { Edit2 } from 'iconsax-react'; import DigitInput from '@/components/DigitsInput'; import { useEffect, useState } from 'react'; import { AuthenticationCard } from '../AuthenticationCard'; import type { ConfirmSmsOtpRequest } from '../../types/userTypes'; import { confirmSmsOtp, sendSmsOtp } from '../../api/authorizationAPI'; import type { CountryCode } from '@/types/commonTypes'; import { Icon, useToast } from '@rkheftan/harmony-ui'; import { useApi } from '@/hooks/useApi'; interface VerifyPhoneNumberProps { value: string; countryCode: CountryCode; onEditValue: () => void; onPhoneNumberVerified: () => void; } export function VerifyPhoneNumber({ value, countryCode, onEditValue, onPhoneNumberVerified, }: VerifyPhoneNumberProps) { const [otpCode, setOtpCode] = useState(''); const [otpDigitInvalid, setOtpDigitInvalid] = useState(false); const [isStatusSuccess, setIsStatusSuccess] = useState(); const { t } = useTranslation('authentication'); const [resendTimer, setResendTimer] = useState(120); const [canResend, setCanResend] = useState(false); const toast = useToast(); const { loading: smsResendLoading, execute: smsResendCall } = useApi(sendSmsOtp); const { loading: confirmSmsOtpLoading, execute: confirmSmsOtpCall } = useApi(confirmSmsOtp); useEffect(() => { let interval: NodeJS.Timeout; if (resendTimer > 0) { interval = setInterval(() => { setResendTimer((prev) => prev - 1); }, 1000); } else { setCanResend(true); } return () => clearInterval(interval); }, [resendTimer]); const handleResendOTPCode = async () => { await smsResendCall({ phoneNumber: countryCode + value }); setResendTimer(120); setCanResend(false); }; const formatTime = (seconds: number) => { const min = Math.floor(seconds / 60); const sec = seconds % 60; return `${min}:${sec.toString().padStart(2, '0')}`; }; const handleVerifyOTP = async () => { if (!otpCode || otpCode.length < 4) { setOtpDigitInvalid(true); } else { setOtpDigitInvalid(false); const confirmSmsOtpRequest: ConfirmSmsOtpRequest = { otpCode: otpCode, phoneNumber: countryCode + value, }; const res = await confirmSmsOtpCall(confirmSmsOtpRequest); if (!res) return; if (res.success) { setIsStatusSuccess(true); toast({ message: t('verify.youHaveSuccessfullyLoggedIn'), severity: 'success', }); onPhoneNumberVerified(); } else { setIsStatusSuccess(false); toast({ message: res.message ?? t('verify.theVerificationCodeIsIncorrect'), severity: 'error', }); } } }; return ( {t('verify.verify')} {t( 'verify.a4DigitVerificationCodeHasBeenSentToYourBobileNumberPleaseEnterIt', )} setOtpCode(value)} /> {t('verify.resendCodeIn')} {!canResend && `${formatTime(resendTimer)} ${t('verify.moreMinute')}`} {canResend && ( )} ); }