import React, { useState, useEffect } from 'react'; import { Mail, Phone, MapPin, Send, User, MessageSquare } from 'lucide-react'; import { submitContactForm } from '../services/api/contactService'; import { pageContentService } from '../services/api'; import type { PageContent } from '../services/api/pageContentService'; import { useCompanySettings } from '../contexts/CompanySettingsContext'; import { toast } from 'react-toastify'; import Recaptcha from '../components/common/Recaptcha'; import { recaptchaService } from '../services/api/systemSettingsService'; import ChatWidget from '../components/chat/ChatWidget'; import { useAntibotForm } from '../hooks/useAntibotForm'; import HoneypotField from '../components/common/HoneypotField'; const ContactPage: React.FC = () => { const { settings } = useCompanySettings(); const [pageContent, setPageContent] = useState(null); const [formData, setFormData] = useState({ name: '', email: '', phone: '', subject: '', message: '', }); const [loading, setLoading] = useState(false); const [errors, setErrors] = useState>({}); // Enhanced antibot protection const { honeypotValue, setHoneypotValue, recaptchaToken, setRecaptchaToken, validate: validateAntibot, rateLimitInfo, } = useAntibotForm({ formId: 'contact', minTimeOnPage: 5000, minTimeToFill: 3000, requireRecaptcha: false, maxAttempts: 5, onValidationError: (errors) => { errors.forEach((err) => toast.error(err)); }, }); const validateForm = (): boolean => { const newErrors: Record = {}; if (!formData.name.trim()) { newErrors.name = 'Name is required'; } if (!formData.email.trim()) { newErrors.email = 'Email is required'; } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) { newErrors.email = 'Please enter a valid email address'; } if (!formData.subject.trim()) { newErrors.subject = 'Subject is required'; } if (!formData.message.trim()) { newErrors.message = 'Message is required'; } else if (formData.message.trim().length < 10) { newErrors.message = 'Message must be at least 10 characters long'; } setErrors(newErrors); return Object.keys(newErrors).length === 0; }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!validateForm()) { return; } // Validate antibot protection const isValid = await validateAntibot(); if (!isValid) { return; } if (recaptchaToken) { try { const verifyResponse = await recaptchaService.verifyRecaptcha(recaptchaToken); if (verifyResponse.status === 'error' || !verifyResponse.data.verified) { toast.error('reCAPTCHA verification failed. Please try again.'); setRecaptchaToken(null); return; } } catch (error) { toast.error('reCAPTCHA verification failed. Please try again.'); setRecaptchaToken(null); return; } } setLoading(true); try { await submitContactForm(formData); toast.success('Thank you for contacting us! We will get back to you soon.'); setFormData({ name: '', email: '', phone: '', subject: '', message: '', }); setErrors({}); setRecaptchaToken(null); } catch (error: any) { const errorMessage = error?.response?.data?.detail || error?.message || 'Failed to send message. Please try again.'; toast.error(errorMessage); setRecaptchaToken(null); } finally { setLoading(false); } }; useEffect(() => { const fetchPageContent = async () => { try { const response = await pageContentService.getContactContent(); if (response.status === 'success' && response.data?.page_content) { setPageContent(response.data.page_content); if (response.data.page_content.meta_title) { document.title = response.data.page_content.meta_title; } if (response.data.page_content.meta_description) { let metaDescription = document.querySelector('meta[name="description"]'); if (!metaDescription) { metaDescription = document.createElement('meta'); metaDescription.setAttribute('name', 'description'); document.head.appendChild(metaDescription); } metaDescription.setAttribute('content', response.data.page_content.meta_description); } } } catch (err: any) { console.error('Error fetching page content:', err); } }; fetchPageContent(); }, []); const displayPhone = settings.company_phone || 'Available 24/7 for your convenience'; const displayEmail = settings.company_email || "We'll respond within 24 hours"; const displayAddress = settings.company_address || 'Visit us at our hotel reception'; const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value })); if (errors[name]) { setErrors((prev) => { const newErrors = { ...prev }; delete newErrors[name]; return newErrors; }); } }; return (
{}
{}

{pageContent?.title || 'Contact Us'}

{pageContent?.subtitle || pageContent?.description || "Experience the pinnacle of hospitality. We're here to make your stay extraordinary."}

{}
{}
{}

Get in Touch

Location

{displayAddress}

{} {pageContent?.map_url && (

Find Us