import React, { useState, useEffect } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import axios from 'axios'; import { Box, Paper, Typography, TextField, Button, FormControl, InputLabel, Select, MenuItem, SelectChangeEvent, Container, Checkbox, ListItemText, OutlinedInput, } from '@mui/material'; interface RSVPFormData { name: string; attending: string; bringing_guests: string; guest_count: number; guest_names: string; items_bringing: string[]; } const RSVPForm: React.FC = () => { const { slug } = useParams<{ slug: string }>(); const [formData, setFormData] = useState({ name: '', attending: '', bringing_guests: '', guest_count: 0, guest_names: '', items_bringing: [] }); const [neededItems, setNeededItems] = useState([]); const [claimedItems, setClaimedItems] = useState([]); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); const [success, setSuccess] = useState(false); const navigate = useNavigate(); useEffect(() => { const fetchEventDetails = async () => { try { const [eventResponse, rsvpsResponse] = await Promise.all([ axios.get(`/api/events/${slug}`), axios.get(`/api/events/${slug}/rsvps`) ]); console.log('API Response:', eventResponse.data); // Process needed items let items: string[] = []; if (eventResponse.data.needed_items) { try { items = typeof eventResponse.data.needed_items === 'string' ? JSON.parse(eventResponse.data.needed_items) : Array.isArray(eventResponse.data.needed_items) ? eventResponse.data.needed_items : []; } catch (e) { console.error('Error parsing needed_items:', e); items = []; } } // Get all claimed items from existing RSVPs const claimed = new Set(); rsvpsResponse.data.forEach((rsvp: any) => { try { const rsvpItems = typeof rsvp.items_bringing === 'string' ? JSON.parse(rsvp.items_bringing) : Array.isArray(rsvp.items_bringing) ? rsvp.items_bringing : []; rsvpItems.forEach((item: string) => claimed.add(item)); } catch (e) { console.error('Error parsing RSVP items:', e); } }); // Filter out claimed items const availableItems = items.filter(item => !claimed.has(item)); console.log('Available items:', availableItems); setNeededItems(availableItems); setClaimedItems(Array.from(claimed)); } catch (error) { console.error('Error fetching event details:', error); setError('Failed to load event details'); setNeededItems([]); } }; fetchEventDetails(); }, [slug]); useEffect(() => { console.log('Current neededItems state:', neededItems); }, [neededItems]); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleSelectChange = (e: SelectChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; const handleItemsChange = (e: SelectChangeEvent) => { const value = e.target.value; console.log('Select onChange value:', value); const itemsArray = Array.isArray(value) ? value : typeof value === 'string' ? value.split(',').map((item: string): string => item.trim()) : []; console.log('Processed items array:', itemsArray); setFormData(prev => ({ ...prev, items_bringing: itemsArray })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); setError(null); try { await axios.post(`/api/events/${slug}/rsvp`, formData); setSuccess(true); } catch (err) { setError('Failed to submit RSVP. Please try again.'); } finally { setIsSubmitting(false); } }; if (success) { return ( Thank You! Your RSVP has been submitted successfully. ); } return ( RSVP Form {error && ( {error} )} Are you attending? {formData.attending === 'yes' && ( <> Are you bringing any guests? {formData.bringing_guests === 'yes' && ( <> )} {neededItems.length > 0 && ( What items are you bringing? )} )} ); }; export default RSVPForm;