import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { Box, Button, TextField, Typography, Container, Paper, Chip, IconButton, styled, Checkbox, FormControlLabel, } from '@mui/material'; import WallpaperIcon from '@mui/icons-material/Wallpaper'; import DeleteIcon from '@mui/icons-material/Delete'; import AddIcon from '@mui/icons-material/Add'; import axios from 'axios'; const DarkTextField = styled(TextField)({ '& .MuiOutlinedInput-root': { '& fieldset': { borderColor: 'rgba(255, 255, 255, 0.23)', }, '&:hover fieldset': { borderColor: 'rgba(255, 255, 255, 0.4)', }, '&.Mui-focused fieldset': { borderColor: '#90caf9', }, }, '& .MuiInputLabel-root': { color: 'rgba(255, 255, 255, 0.7)', }, '& .MuiOutlinedInput-input': { color: 'rgba(255, 255, 255, 0.9)', }, }); interface FormData { title: string; description: string; date: string; location: string; needed_items: string[]; rsvp_cutoff_date: string; max_guests_per_rsvp: number; email_notifications_enabled: boolean; email_recipients: string; } const EventForm: React.FC = () => { const navigate = useNavigate(); const [formData, setFormData] = useState({ title: '', description: '', date: '', location: '', needed_items: [], rsvp_cutoff_date: '', max_guests_per_rsvp: 0, email_notifications_enabled: false, email_recipients: '', }); const [wallpaper, setWallpaper] = useState(null); const [currentItem, setCurrentItem] = useState(''); const [error, setError] = useState(null); const fileInputRef = React.useRef(null); const handleChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData((prev) => ({ ...prev, [name]: value, })); }; const handleWallpaperClick = () => { fileInputRef.current?.click(); }; const handleWallpaperChange = (e: React.ChangeEvent) => { if (e.target.files && e.target.files[0]) { setWallpaper(e.target.files[0]); } }; const handleItemChange = (e: React.ChangeEvent) => { setCurrentItem(e.target.value); }; const handleAddItem = () => { if (currentItem.trim()) { setFormData((prev) => ({ ...prev, needed_items: [...prev.needed_items, currentItem.trim()], })); setCurrentItem(''); } }; const handleRemoveItem = (index: number) => { setFormData((prev) => ({ ...prev, needed_items: prev.needed_items.filter((_, i) => i !== index), })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); try { const submitData = new FormData(); // Append all form fields Object.entries(formData).forEach(([key, value]) => { if (key === 'needed_items') { submitData.append(key, JSON.stringify(value)); } else { submitData.append(key, String(value)); } }); // Append wallpaper if selected if (wallpaper) { submitData.append('wallpaper', wallpaper); } await axios.post('/api/events', submitData, { headers: { 'Content-Type': 'multipart/form-data', }, }); navigate('/'); } catch (error) { setError('Failed to create event. Please try again.'); console.error('Error creating event:', error); } }; return ( Create New Event {error && ( {error} )} { const value = parseInt(e.target.value); setFormData((prev) => ({ ...prev, max_guests_per_rsvp: isNaN(value) ? 0 : value, })); }} variant="outlined" helperText="Set to 0 for no additional guests, -1 for unlimited" inputProps={{ min: -1 }} /> Event Wallpaper {wallpaper && ( setWallpaper(null)} size="small" sx={{ color: '#f44336', '&:hover': { backgroundColor: 'rgba(244, 67, 54, 0.08)', } }} > )} {wallpaper && ( Selected: {wallpaper.name} )} Needed Items {formData.needed_items.map((item, index) => ( handleRemoveItem(index)} sx={{ bgcolor: 'rgba(144, 202, 249, 0.2)', color: 'rgba(255, 255, 255, 0.9)', '& .MuiChip-deleteIcon': { color: 'rgba(255, 255, 255, 0.7)', '&:hover': { color: 'rgba(255, 255, 255, 0.9)', } } }} /> ))} Email Notifications { setFormData((prev) => ({ ...prev, email_notifications_enabled: e.target.checked, })); }} sx={{ color: 'rgba(255, 255, 255, 0.7)', '&.Mui-checked': { color: '#90caf9', }, }} /> } label="Enable Email Notifications" sx={{ color: 'rgba(255, 255, 255, 0.9)', }} /> {formData.email_notifications_enabled && ( )} ); }; export default EventForm;