import React, { useEffect, useState } from 'react'; import api from '../../utils/api'; import { Card } from '../../components/ui/card'; import { Button } from '../../components/ui/button'; import { Badge } from '../../components/ui/badge'; import { Input } from '../../components/ui/input'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '../../components/ui/dialog'; import { toast } from 'sonner'; import { Calendar, MapPin, Users, Plus, Edit, Trash2, Eye, EyeOff } from 'lucide-react'; import { AttendanceDialog } from '../../components/AttendanceDialog'; const AdminEvents = () => { const [events, setEvents] = useState([]); const [loading, setLoading] = useState(true); const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); const [editingEvent, setEditingEvent] = useState(null); const [attendanceDialogOpen, setAttendanceDialogOpen] = useState(false); const [selectedEvent, setSelectedEvent] = useState(null); const [formData, setFormData] = useState({ title: '', description: '', start_at: '', end_at: '', location: '', capacity: '', published: false }); useEffect(() => { fetchEvents(); }, []); const fetchEvents = async () => { try { const response = await api.get('/admin/events'); setEvents(response.data); } catch (error) { toast.error('Failed to fetch events'); } finally { setLoading(false); } }; const handleSubmit = async (e) => { e.preventDefault(); try { const eventData = { ...formData, capacity: formData.capacity ? parseInt(formData.capacity) : null, start_at: new Date(formData.start_at).toISOString(), end_at: new Date(formData.end_at).toISOString() }; if (editingEvent) { await api.put(`/admin/events/${editingEvent.id}`, eventData); toast.success('Event updated successfully'); } else { await api.post('/admin/events', eventData); toast.success('Event created successfully'); } setIsCreateDialogOpen(false); setEditingEvent(null); resetForm(); fetchEvents(); } catch (error) { toast.error(error.response?.data?.detail || 'Failed to save event'); } }; const handleEdit = (event) => { setEditingEvent(event); setFormData({ title: event.title, description: event.description || '', start_at: new Date(event.start_at).toISOString().slice(0, 16), end_at: new Date(event.end_at).toISOString().slice(0, 16), location: event.location, capacity: event.capacity || '', published: event.published }); setIsCreateDialogOpen(true); }; const handleDelete = async (eventId) => { if (!window.confirm('Are you sure you want to delete this event?')) { return; } try { await api.delete(`/admin/events/${eventId}`); toast.success('Event deleted successfully'); fetchEvents(); } catch (error) { toast.error('Failed to delete event'); } }; const togglePublish = async (event) => { try { await api.put(`/admin/events/${event.id}`, { published: !event.published }); toast.success(event.published ? 'Event unpublished' : 'Event published'); fetchEvents(); } catch (error) { toast.error('Failed to update event'); } }; const resetForm = () => { setFormData({ title: '', description: '', start_at: '', end_at: '', location: '', capacity: '', published: false }); }; const handleDialogClose = () => { setIsCreateDialogOpen(false); setEditingEvent(null); resetForm(); }; return ( <> {/* Header */}

Event Management

Create and manage community events.

{editingEvent ? 'Edit Event' : 'Create New Event'}
setFormData({ ...formData, title: e.target.value })} required className="border-2 border-[#ddd8eb] focus:border-[#664fa3]" />