import { useState } from 'react' import { useSearchParams, useNavigate } from 'react-router-dom' import { Hotel, Eye, EyeOff, AlertCircle, CheckCircle2, Moon, Sun } from 'lucide-react' import { useTheme } from '../contexts/ThemeContext' import { api } from '../lib/api' import { cn } from '../lib/utils' export function ResetPasswordPage() { const [searchParams] = useSearchParams() const navigate = useNavigate() const { theme, toggle } = useTheme() const token = searchParams.get('token') ?? '' const [password, setPassword] = useState('') const [password2, setPassword2] = useState('') const [showPass, setShowPass] = useState(false) const [loading, setLoading] = useState(false) const [error, setError] = useState('') const [done, setDone] = useState(false) const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (password.length < 8) { setError('Минимум 8 символов'); return } if (!/[a-zA-Zа-яА-ЯёЁ]/.test(password)) { setError('Пароль должен содержать хотя бы одну букву'); return } if (password !== password2) { setError('Пароли не совпадают'); return } setError('') setLoading(true) try { await api.auth.resetPassword(token, password) setDone(true) } catch (err) { const msg = err instanceof Error ? err.message : 'Ошибка' setError(msg) } finally { setLoading(false) } } return (
{/* Logo */}
HotelSync
{!token ? (
Ссылка недействительна. Запросите новое письмо.
) : done ? (

Пароль изменён!

Теперь вы можете войти с новым паролем.

) : ( <>

Новый пароль

Введите новый пароль для вашего аккаунта

{ setPassword(e.target.value); setError('') }} required />
{password && (
{[ { ok: password.length >= 8, label: '≥ 8 символов' }, { ok: /[a-zA-Zа-яА-ЯёЁ]/.test(password), label: 'Содержит букву' }, { ok: /[A-ZА-ЯЁ]/.test(password), label: 'Заглавная буква' }, { ok: /[0-9]/.test(password), label: 'Цифра' }, ].map(({ ok, label }) => (
{label}
))}
)}
{ setPassword2(e.target.value); setError('') }} required /> {password2 && password !== password2 && (

Пароли не совпадают

)}
{error && (
{error}
)}

)}
) }