import { useState, useEffect } from 'react';
import { Calendar, UserCircle, LogIn, Menu, X, BedDouble, Clock, Search, Mail, Lock } from 'lucide-react';
// Rooms data
const ROOMS_DATA = [
{
id: 1,
name: 'Orzah Royal Suite',
price: 399,
image: 'https://images.unsplash.com/photo-1582719478250-c89cae4dc85b?auto=format&fit=crop&q=80',
description: 'Luxurious suite with panoramic city views',
capacity: 2,
},
{
id: 2,
name: 'Orzah Presidential Suite',
price: 599,
image: 'https://images.unsplash.com/photo-1591088398332-8a7791972843?auto=format&fit=crop&q=80',
description: 'Ultimate luxury with private butler service',
capacity: 4,
},
{
id: 3,
name: 'Orzah Grand Villa',
price: 899,
image: 'https://images.unsplash.com/photo-1596394516093-501ba68a0ba6?auto=format&fit=crop&q=80',
description: 'Exclusive villa with private pool',
capacity: 6,
},
];
// Authentication Modal Component
const AuthModal = ({ isOpen, onClose, onSuccess }) => {
const [isSignUp, setIsSignUp] = useState(false);
const [formData, setFormData] = useState({
name: '',
email: '',
password: ''
});
const [error, setError] = useState('');
const handleSubmit = async (e) => {
e.preventDefault();
setError('');
try {
const endpoint = isSignUp ? '/api/auth/signup' : '/api/auth/login';
const response = await fetch(endpoint, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(formData),
});
const data = await response.json();
if (response.ok) {
localStorage.setItem('token', data.token);
onSuccess(data.user);
} else {
setError(data.message || 'Authentication failed');
}
} catch (err) {
setError('An error occurred. Please try again.');
}
};
if (!isOpen) return null;
return (
{isSignUp ? 'Create Account' : 'Welcome Back'}
{error && (
{error}
)}
{isSignUp ? 'Already have an account?' : "Don't have an account?"}{' '}
);
};
// Booking Modal Component
const BookingModal = ({ isOpen, onClose, room, dates, guests, currentUser }) => {
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState('');
const [success, setSuccess] = useState(false);
const handleBooking = async (e) => {
e.preventDefault();
setIsLoading(true);
setError('');
try {
const response = await fetch('/api/bookings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${localStorage.getItem('token')}`,
},
body: JSON.stringify({
roomId: room.id,
checkIn: dates.checkIn,
checkOut: dates.checkOut,
guests,
}),
});
const data = await response.json();
if (response.ok) {
setSuccess(true);
setTimeout(() => {
onClose();
}, 2000);
} else {
setError(data.message || 'Booking failed');
}
} catch (err) {
setError('An error occurred. Please try again.');
} finally {
setIsLoading(false);
}
};
if (!isOpen) return null;
return (
Confirm Booking
{error && (
{error}
)}
{success ? (
Booking Confirmed!
Thank you for choosing Orzah International
) : (
)}
);
};
// Main App Component
export default function App() {
const [isMenuOpen, setIsMenuOpen] = useState(false);
const [isAuthModalOpen, setIsAuthModalOpen] = useState(false);
const [isBookingModalOpen, setIsBookingModalOpen] = useState(false);
const [selectedRoom, setSelectedRoom] = useState(null);
const [currentUser, setCurrentUser] = useState(null);
const [searchDates, setSearchDates] = useState({ checkIn: '', checkOut: '' });
const [guests, setGuests] = useState(1);
useEffect(() => {
const token = localStorage.getItem('token');
if (token) {
fetchUserData(token);
}
}, []);
const fetchUserData = async (token) => {
try {
const response = await fetch('/api/user', {
headers: {
'Authorization': `Bearer ${token}`
}
});
if (response.ok) {
const userData = await response.json();
setCurrentUser(userData);
}
} catch (error) {
console.error('Error fetching user data:', error);
}
};
const handleLogout = () => {
localStorage.removeItem('token');
setCurrentUser(null);
};
const handleBooking = (room) => {
if (!currentUser) {
setIsAuthModalOpen(true);
} else {
setSelectedRoom(room);
setIsBookingModalOpen(true);
}
};
return (
{/* Navigation */}
{/* Mobile Menu */}
{isMenuOpen && (
Suites
{currentUser && (
My Bookings
)}
)}
{/* Hero Section */}
WELCOME TO ORZAH
WHERE LUXURY MEETS EXCELLENCE
{/* Search Box */}
{/* Available Rooms Section */}
LUXURY ACCOMMODATIONS
{ROOMS_DATA.map((room) => (
{room.name}
{room.description}
Up to {room.capacity} guests
${room.price}/night
))}
{/* Modals */}
{isAuthModalOpen && (
setIsAuthModalOpen(false)}
onSuccess={(userData) => {
setCurrentUser(userData);
setIsAuthModalOpen(false);
}}
/>
)}
{isBookingModalOpen && (
setIsBookingModalOpen(false)}
room={selectedRoom}
dates={searchDates}
guests={guests}
currentUser={currentUser}
/>
)}
);
}