'use client'; import { z as zod } from 'zod'; import { useState, Suspense } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import Link from '@mui/material/Link'; import Alert from '@mui/material/Alert'; import Stack from '@mui/material/Stack'; import IconButton from '@mui/material/IconButton'; import Typography from '@mui/material/Typography'; import LoadingButton from '@mui/lab/LoadingButton'; import InputAdornment from '@mui/material/InputAdornment'; import { paths } from 'src/routes/paths'; import { useRouter, useSearchParams } from 'src/routes/hooks'; import { RouterLink } from 'src/routes/components'; import { useBoolean } from 'src/hooks/use-boolean'; import { Iconify } from 'src/components/iconify'; import { Form, Field } from 'src/components/hook-form'; import { confirmPasswordReset } from 'src/auth/context/jwt'; // ---------------------------------------------------------------------- const ResetPasswordSchema = zod .object({ newPassword: zod .string() .min(1, { message: 'Введите пароль!' }) .min(8, { message: 'Пароль должен содержать не менее 8 символов!' }), newPasswordConfirm: zod.string().min(1, { message: 'Подтвердите пароль!' }), }) .refine((data) => data.newPassword === data.newPasswordConfirm, { message: 'Пароли не совпадают!', path: ['newPasswordConfirm'], }); // ---------------------------------------------------------------------- function ResetPasswordContent() { const router = useRouter(); const searchParams = useSearchParams(); const token = searchParams.get('token'); const [errorMsg, setErrorMsg] = useState(''); const [successMsg, setSuccessMsg] = useState(''); const newPassword = useBoolean(); const newPasswordConfirm = useBoolean(); const methods = useForm({ resolver: zodResolver(ResetPasswordSchema), defaultValues: { newPassword: '', newPasswordConfirm: '' }, }); const { handleSubmit, formState: { isSubmitting }, } = methods; const onSubmit = handleSubmit(async (data) => { if (!token) { setErrorMsg('Ссылка для сброса отсутствует. Запросите новый сброс пароля.'); return; } try { await confirmPasswordReset({ token, newPassword: data.newPassword, newPasswordConfirm: data.newPasswordConfirm, }); setSuccessMsg('Пароль успешно изменён. Теперь вы можете войти с новым паролем.'); setErrorMsg(''); } catch (error) { console.error(error); const msg = error?.response?.data?.error?.message || error?.response?.data?.message || error?.response?.data?.detail || 'Не удалось сбросить пароль. Возможно, ссылка устарела — запросите новую.'; setErrorMsg(msg); } }); if (!token) { return ( <> Сброс пароля Ссылка для сброса отсутствует. Перейдите по ссылке из письма или запросите новую. Запросить новую ссылку ); } if (successMsg) { return ( <> Сброс пароля {successMsg} Войти ); } return ( <> Новый пароль Введите новый пароль ниже. {!!errorMsg && ( {errorMsg} )}
), }} /> ), }} /> Сохранить пароль
Вернуться ко входу ); } // ---------------------------------------------------------------------- export function JwtResetPasswordView() { return ( Загрузка...}> ); }