import { useRef, useState } from 'react'; import { AuthenticationCard } from '../AuthenticationCard'; import { Edit2, Eye, EyeSlash, TickCircle } from 'iconsax-react'; import { Box, Button, IconButton, Stack, TextField, Typography, } from '@mui/material'; import { useTranslation } from 'react-i18next'; import { containsNumber } from '@/utils/regexes/containsNumber'; import { containsSymbol } from '@/utils/regexes/containsSymbol'; import { least8Chars } from '@/utils/regexes/least8Chars'; import { hasUpperAndLowerLetter } from '@/utils/regexes/hasUpperAndLowerLetter'; import type { ResetPasswordRequest } from '../../types/userTypes'; import type { AuthType } from '../../types/authTypes'; import type { CountryCode } from '@/types/commonTypes'; import { resetPassword } from '../../api/authorizationAPI'; import { Icon, useToast } from '@rkheftan/harmony-ui'; import { useApi } from '@/hooks/useApi'; export interface ChangePasswordProps { onEditInfo: () => void; onPasswordChanged: () => void; forgetPasswordInfo: string; infoType: AuthType; countryCode: CountryCode; } export const ChangePassword = ({ onEditInfo, onPasswordChanged, forgetPasswordInfo, infoType, countryCode, }: ChangePasswordProps) => { const { t } = useTranslation('authentication'); const [passValue, setPassValue] = useState(''); const [confirmPassValue, setConfirmPassValue] = useState(''); const [inputTouched, setInputTouched] = useState(false); const [confirmInputTouched, setConfirmInputTouched] = useState(false); const [showPassword, setShowPassword] = useState(false); const [showConfirmPassword, setShowConfirmPassword] = useState(false); const inputRef = useRef(null); const confirmInputRef = useRef(null); const toast = useToast(); const { loading: resetPasswordLoading, execute: resetPasswordCall } = useApi(resetPassword); const passwordValidationRules = [ { title: t('forgetPassword.includingANumber'), validator: containsNumber }, { title: t('forgetPassword.atLeast8Characters'), validator: least8Chars }, { title: t('forgetPassword.containsAnUppercaseAndLowercaseLetter'), validator: hasUpperAndLowerLetter, }, { title: t('forgetPassword.ContainsASymbol'), validator: containsSymbol }, ]; const handleBlur = () => { setInputTouched(true); }; const handleConfirmPassBlur = () => { setConfirmInputTouched(true); }; const handleSubmit = async () => { if (!passValue || !isValidPassword(passValue)) { setInputTouched(true); inputRef.current?.focus(); } else if (passValue !== confirmPassValue) { setConfirmInputTouched(true); confirmInputRef.current?.focus(); } else { const apiRequest: ResetPasswordRequest = { email: infoType === 'email' ? forgetPasswordInfo : undefined, phoneNumber: infoType === 'phone' ? countryCode + forgetPasswordInfo : undefined, newPassword: passValue, confirmNewPassword: confirmPassValue, }; const res = await resetPasswordCall(apiRequest); if (!res) return; if (res.success) { onPasswordChanged(); toast({ message: t('forgetPassword.passwordChangedSuccessfully'), severity: 'success', }); } else { toast({ message: res.message, severity: 'error', }); } } }; const isValidPassword = (value: string) => { return ( containsNumber(value) && containsSymbol(value) && least8Chars(value) && hasUpperAndLowerLetter(value) ); }; return ( {t('forgetPassword.changePassword')} {t('forgetPassword.createANewPassword')} setPassValue(e.target.value)} onBlur={handleBlur} error={inputTouched && !isValidPassword(passValue)} autoFocus slotProps={{ htmlInput: { sx: { lineHeight: 1.5, paddingInlineStart: 1 } }, input: { startAdornment: confirmPassValue && isValidPassword(passValue) && passValue === confirmPassValue && ( ), endAdornment: passValue ? ( setShowPassword(!showPassword)} > {showPassword ? ( ) : ( )} ) : ( '' ), }, }} sx={{ mt: 4 }} /> {!isValidPassword(passValue) && ( {passwordValidationRules.map((rule) => ( {rule.title} ))} )} setConfirmPassValue(e.target.value)} onBlur={handleConfirmPassBlur} error={confirmInputTouched && confirmPassValue !== passValue} slotProps={{ htmlInput: { sx: { lineHeight: 1.5, paddingInlineStart: 1 } }, input: { startAdornment: confirmPassValue && isValidPassword(passValue) && passValue === confirmPassValue && ( ), endAdornment: confirmPassValue ? ( setShowConfirmPassword(!showConfirmPassword)} > {showConfirmPassword ? ( ) : ( )} ) : ( '' ), }, }} sx={{ my: 4 }} /> ); };