Если аккаунт с адресом {email} существует,
на него придёт письмо со ссылкой для сброса пароля.
Ссылка действительна 1 час.
)
}
return (
<>
Восстановление пароля
Введите email аккаунта — мы пришлём ссылку для сброса пароля
>
)
}
// ── Phone mask helper ──────────────────────────────────────────────────────────
function formatPhone(raw: string): string {
const digits = raw.replace(/\D/g, '')
// Normalize: leading 8 or 7 → keep as +7, otherwise prepend 7
const d = digits.startsWith('8') ? '7' + digits.slice(1)
: digits.startsWith('7') ? digits
: digits.length ? '7' + digits : ''
let result = '+7'
if (d.length > 1) result += ' (' + d.slice(1, Math.min(4, d.length))
if (d.length >= 4) result += ') ' + d.slice(4, Math.min(7, d.length))
if (d.length >= 7) result += '-' + d.slice(7, Math.min(9, d.length))
if (d.length >= 9) result += '-' + d.slice(9, Math.min(11, d.length))
return result
}
// ── Register form ──────────────────────────────────────────────────────────────
function RegisterForm({ onSwitch }: { onSwitch: () => void }) {
const [done, setDone] = useState(false)
const [hotelName, setHotelName] = useState('')
const [address, setAddress] = useState('')
const [contact, setContact] = useState('')
const [email, setEmail] = useState('')
const [phone, setPhone] = useState('')
const [password, setPassword] = useState('')
const [showPass, setShowPass] = useState(false)
const [agreed, setAgreed] = useState(false)
const [showTerms, setShowTerms] = useState(false)
const [loading, setLoading] = useState(false)
const [errors, setErrors] = useState>({})
const handlePhoneChange = (raw: string) => {
// Allow clearing
if (raw === '' || raw === '+') { setPhone(''); return }
setPhone(formatPhone(raw))
setErrors(prev => ({ ...prev, phone: '' }))
}
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
const err: Record = {}
if (!hotelName.trim()) err.hotelName = 'Введите название отеля'
if (!address.trim()) err.address = 'Введите адрес отеля'
if (!contact.trim()) err.contact = 'Введите контактное лицо'
if (!email.trim()) err.email = 'Введите email'
else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) err.email = 'Некорректный email'
const phoneDigits = phone.replace(/\D/g, '')
if (phoneDigits.length < 11) err.phone = 'Введите полный номер телефона'
if (password.length < 8) err.password = 'Минимум 8 символов'
else if (!/[a-zA-Zа-яА-ЯёЁ]/.test(password)) err.password = 'Пароль должен содержать хотя бы одну букву'
if (!agreed) err.agreed = 'Необходимо принять пользовательское соглашение'
setErrors(err)
if (Object.keys(err).length > 0) return
setLoading(true)
try {
await api.auth.register({ hotelName, address, contact, email, phone, password })
setDone(true)
} catch (regErr) {
const msg = regErr instanceof Error ? regErr.message : 'Ошибка регистрации'
if (msg.includes('уже существует')) {
setErrors({ email: 'Пользователь с таким email уже существует' })
} else {
setErrors({ general: msg })
}
} finally {
setLoading(false)
}
}
if (done) {
return (
Заявка отправлена!
Мы получили данные отеля {hotelName}.
На адрес {email} отправлено
письмо с подтверждением. Перейдите по ссылке в письме, чтобы активировать аккаунт.
)
}
return (
<>
Регистрация отеля
Заполните данные — мы активируем аккаунт в течение дня
Уже есть аккаунт?{' '}
{/* Модальное окно — пользовательское соглашение */}
{showTerms && (
setShowTerms(false)}
>
e.stopPropagation()}
>
Пользовательское соглашение
Редакция от 1 января 2026 г.
Настоящее Пользовательское соглашение регулирует отношения между ООО «ХотелСинк» (далее — Сервис) и пользователем, зарегистрировавшим учётную запись.
1. Предмет соглашения. Сервис предоставляет доступ к облачной PMS-системе HotelSync для управления гостиничными операциями.
2. Регистрация. Пользователь обязуется предоставить достоверные сведения при регистрации и нести ответственность за сохранность учётных данных.
3. Персональные данные. Обработка персональных данных осуществляется в соответствии с Федеральным законом № 152-ФЗ «О персональных данных».
4. Ограничение ответственности. Сервис не несёт ответственности за прямые или косвенные убытки, возникшие вследствие использования или невозможности использования платформы.
5. Изменение условий. Сервис вправе изменять условия соглашения, уведомив пользователей не менее чем за 7 дней.