'use client'; import { useState } from 'react'; import { X, CheckCircle, AlertCircle } from 'lucide-react'; interface CallbackModalProps { isOpen: boolean; onClose: () => void; } const CallbackModal = ({ isOpen, onClose }: CallbackModalProps) => { const [name, setName] = useState(''); const [phone, setPhone] = useState(''); const [message, setMessage] = useState(''); const [error, setError] = useState(''); const [success, setSuccess] = useState(false); const [loading, setLoading] = useState(false); if (!isOpen) return null; const validatePhone = (value: string) => { const digits = value.replace(/\D/g, ''); if (digits.length !== 11) return false; if (!(digits.startsWith('7') || digits.startsWith('8'))) return false; if (/^(7|8)0{10}$/.test(digits)) return false; return true; }; const validateName = (value: string) => { return /^[А-Яа-яA-Za-zЁё\-]{2,}$/.test(value.trim()); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(''); if (!validateName(name)) return setError('Пожалуйста, укажите корректное имя (только буквы, не менее 2 символов)'); if (!validatePhone(phone)) return setError('Пожалуйста, укажите корректный российский номер телефона'); setLoading(true); try { const res = await fetch('/api/send-telegram', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, phone, message, material: 'Звонок' }), }); if (res.ok) { setSuccess(true); setName(''); setPhone(''); setMessage(''); } else { setError('Ошибка отправки. Попробуйте позже.'); } } catch { setError('Ошибка отправки. Попробуйте позже.'); } finally { setLoading(false); } }; const closeModal = () => { setName(''); setPhone(''); setMessage(''); setError(''); setSuccess(false); setLoading(false); onClose(); }; return (
{/* Декоративные фоновые элементы */}
{/* Основной контейнер модального окна */}
{/* Кнопка закрытия */} {/* Заголовок */}

Заказать звонок

{!success ? (
{/* Поле имени */}
setName(e.target.value)} className="w-full px-4 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white placeholder-gray-400 focus:outline-none focus:border-blue-500/50 focus:bg-white/20 transition-all duration-300 group-hover:border-white/30" />
{/* Поле телефона */}
{ const val = e.target.value.replace(/\D/g, '').slice(0, 11); setPhone(val); }} className="w-full px-4 py-3 bg-white/10 backdrop-blur-sm border border-white/20 rounded-xl text-white placeholder-gray-400 focus:outline-none focus:border-blue-500/50 focus:bg-white/20 transition-all duration-300 group-hover:border-white/30" />
{/* Поле сообщения */}