'use client'; import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Switch } from '@/components/ui/switch'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Badge } from '@/components/ui/badge'; import { Label } from '@/components/ui/label'; import { Textarea } from '@/components/ui/textarea'; import { toast } from '@/hooks/use-toast'; import { Plus, Edit, Trash2, MapPin, Settings, RefreshCw } from 'lucide-react'; interface Court { id: string; name: string; isActive: boolean; createdAt: Date; updatedAt: Date; } interface CourtFormData { name: string; isActive: boolean; } export function AdminCourtManagement() { const [courts, setCourts] = useState([]); const [loading, setLoading] = useState(true); const [creating, setCreating] = useState(false); const [editing, setEditing] = useState(null); const [deleting, setDeleting] = useState(null); const [isDialogOpen, setIsDialogOpen] = useState(false); const [editingCourt, setEditingCourt] = useState(null); const [formData, setFormData] = useState({ name: '', isActive: true, }); useEffect(() => { fetchCourts(); }, []); const fetchCourts = async () => { try { setLoading(true); const response = await fetch('/api/admin/courts'); if (response.ok) { const data = await response.json(); setCourts(data.courts || []); } else { toast({ title: 'Error', description: 'Failed to fetch courts', variant: 'destructive', }); } } catch (error) { console.error('Error fetching courts:', error); toast({ title: 'Error', description: 'Failed to fetch courts', variant: 'destructive', }); } finally { setLoading(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.name.trim()) { toast({ title: 'Error', description: 'Court name is required', variant: 'destructive', }); return; } try { if (editingCourt) { setEditing(editingCourt.id); const response = await fetch(`/api/admin/courts/${editingCourt.id}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData), }); if (response.ok) { toast({ title: 'Success', description: 'Court updated successfully', }); await fetchCourts(); resetForm(); } else { const error = await response.json(); toast({ title: 'Error', description: error.error || 'Failed to update court', variant: 'destructive', }); } } else { setCreating(true); const response = await fetch('/api/admin/courts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData), }); if (response.ok) { toast({ title: 'Success', description: 'Court created successfully', }); await fetchCourts(); resetForm(); } else { const error = await response.json(); toast({ title: 'Error', description: error.error || 'Failed to create court', variant: 'destructive', }); } } } catch (error) { console.error('Error saving court:', error); toast({ title: 'Error', description: 'Failed to save court', variant: 'destructive', }); } finally { setCreating(false); setEditing(null); } }; const handleEdit = (court: Court) => { setEditingCourt(court); setFormData({ name: court.name, isActive: court.isActive, }); setIsDialogOpen(true); }; const handleDelete = async (courtId: string) => { if (!confirm('Are you sure you want to delete this court? This action cannot be undone.')) { return; } try { setDeleting(courtId); const response = await fetch(`/api/admin/courts/${courtId}`, { method: 'DELETE', }); if (response.ok) { toast({ title: 'Success', description: 'Court deleted successfully', }); await fetchCourts(); } else { const error = await response.json(); toast({ title: 'Error', description: error.error || 'Failed to delete court', variant: 'destructive', }); } } catch (error) { console.error('Error deleting court:', error); toast({ title: 'Error', description: 'Failed to delete court', variant: 'destructive', }); } finally { setDeleting(null); } }; const resetForm = () => { setFormData({ name: '', isActive: true }); setEditingCourt(null); setIsDialogOpen(false); }; if (loading) { return ( Court Management
{[1, 2, 3].map((i) => (
))}
); } return ( Court Management
{editingCourt ? 'Edit Court' : 'Create New Court'}
setFormData({ ...formData, name: e.target.value })} placeholder='e.g., Court 1, Main Court' required />
setFormData({ ...formData, isActive: checked }) } />
{courts.length === 0 ? (

No courts found. Create your first court to get started.

) : (
{courts.map((court) => (

{court.name}

Created {new Date(court.createdAt).toLocaleDateString()}

{court.isActive ? 'Active' : 'Inactive'}
))}
)}
); }