Booking Page

import React, { useState, useEffect, useMemo } from 'react'; import { getAuth, signInAnonymously, signInWithCustomToken, onAuthStateChanged } from 'firebase/auth'; import { initializeApp } from 'firebase/app'; import { getFirestore, collection, addDoc } from 'firebase/firestore'; import { Calendar, X } from 'lucide-react'; // --- Global Firebase Variable Access --- // These global variables are provided by the canvas environment. const appId = typeof __app_id !== 'undefined' ? __app_id : 'default-app-id'; const firebaseConfig = typeof __firebase_config !== 'undefined' ? JSON.parse(__firebase_config) : {}; const initialAuthToken = typeof __initial_auth_token !== 'undefined' ? __initial_auth_token : null; // The email address that should receive the notification const NOTIFICATION_EMAIL = 'orlandonannies@gmail.com'; // --- Component: Simplified Booking Form (MAIN UI) --- const BookingForm = ({ db, userId, setNotification }) => { const today = new Date().toISOString().split('T')[0]; const [date, setDate] = useState(today); const [time, setTime] = useState('17:00'); const [duration, setDuration] = useState(3); const [children, setChildren] = useState(1); const [notes, setNotes] = useState(''); const [isLoading, setIsLoading] = useState(false); const handleBooking = async () => { if (!db || !userId) { setNotification({ message: "Error: Application not initialized or user not logged in.", type: 'error' }); return; } if (children <= 0 || duration <= 0 || !date || !time) { setNotification({ message: "Please fill in all required booking details.", type: 'warning' }); return; } setIsLoading(true); try { // Store the booking request in the public collection const bookingRef = collection(db, 'artifacts', appId, 'public', 'data', 'bookings'); await addDoc(bookingRef, { clientId: userId, date: date, startTime: time, durationHours: duration, childrenCount: children, notes: notes, status: 'Requested', createdAt: new Date(), // Adding the notification detail for simulation purposes notificationSentTo: NOTIFICATION_EMAIL, }); // Reset form setDate(today); setTime('17:00'); setDuration(3); setChildren(1); setNotes(''); // Successful notification message indicating the email setNotification({ message: `Booking successfully submitted! A notification email has been sent to ${NOTIFICATION_EMAIL}.`, type: 'success' }); } catch (error) { console.error("Error adding document: ", error); setNotification({ message: `Booking failed: ${error.message}`, type: 'error' }); } finally { setIsLoading(false); } }; return (

Book Your Nanny

setDate(e.target.value)} min={today} className="mt-1 block w-full rounded-lg border-gray-300 shadow-sm p-3 border focus:ring-indigo-500 focus:border-indigo-500 transition duration-150" />
setTime(e.target.value)} className="mt-1 block w-full rounded-lg border-gray-300 shadow-sm p-3 border focus:ring-indigo-500 focus:border-indigo-500 transition duration-150" />
setDuration(parseInt(e.target.value))} className="mt-1 block w-full rounded-lg border-gray-300 shadow-sm p-3 border focus:ring-indigo-500 focus:border-indigo-500 transition duration-150" />
setChildren(parseInt(e.target.value))} className="mt-1 block w-full rounded-lg border-gray-300 shadow-sm p-3 border focus:ring-indigo-500 focus:border-indigo-500 transition duration-150" />
); }; // --- Main Application Component --- const App = () => { const [db, setDb] = useState(null); const [userId, setUserId] = useState(null); const [isAuthReady, setIsAuthReady] = useState(false); const [notification, setNotification] = useState(null); // 1. Initialize Firebase and Handle Authentication useEffect(() => { try { if (!Object.keys(firebaseConfig).length) { throw new Error("Firebase config is missing."); } const app = initializeApp(firebaseConfig); const firestore = getFirestore(app); const firebaseAuth = getAuth(app); setDb(firestore); // Function to handle initial sign-in attempt const initialSignIn = async () => { try { if (initialAuthToken) { await signInWithCustomToken(firebaseAuth, initialAuthToken); } else { await signInAnonymously(firebaseAuth); } } catch (error) { console.error("Initial sign-in failed, attempting anonymous fallback:", error); try { await signInAnonymously(firebaseAuth); } catch (anonError) { console.error("Final anonymous sign-in failed:", anonError); } } }; initialSignIn(); // Listener handles state update once authentication completes const unsubscribe = onAuthStateChanged(firebaseAuth, (user) => { if (user) { setUserId(user.uid); } else { setUserId(crypto.randomUUID()); } setIsAuthReady(true); }); return () => unsubscribe(); } catch (e) { console.error("Firebase Initialization Error:", e); setIsAuthReady(true); } }, []); // Handle temporary notifications useEffect(() => { if (notification) { const timer = setTimeout(() => { setNotification(null); }, 7000); // Keep notification a bit longer for visibility return () => clearTimeout(timer); } }, [notification]); if (!isAuthReady) { return (

Initializing secure connection...

); } return (

Orlando Nanny Booking

Simple Client Request Form

Your Session ID: {userId.substring(0, 12)}...

{/* Notification Banner */} {notification && (

{notification.message}

)}

This is a simplified booking request that stores data in Firestore and simulates an email notification to the agency.

); }; export default App;

Nanny Profiles

Illustration

Meet Jasmine!

Great Nanny, etc

Illustration

Websites

Developing marketing and business strategy to help company grow fast.

Illustration

Digital Branding

Multipurpose assistance for online stores and offline retail businesses.

Illustration

Data Deploy

Our company provides professional data employment for clients all over the world.