"use client" import { useEffect, useState } from "react" import { useAuth } from "@/contexts/auth-context" import { useRouter } from "next/navigation" import { Card, CardContent } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Search, Edit, Save, X, MapPin } from "lucide-react" import { getApiUrl } from "@/lib/api-config" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import Link from "next/link" interface Venue { id: number name: string slug: string city: string state: string | null country: string capacity: number | null } export default function AdminVenuesPage() { const { user, token, loading: authLoading } = useAuth() const router = useRouter() const [venues, setVenues] = useState([]) const [loading, setLoading] = useState(true) const [search, setSearch] = useState("") const [editingVenue, setEditingVenue] = useState(null) const [saving, setSaving] = useState(false) useEffect(() => { if (authLoading) return if (!user) { router.push("/login") return } if (user.role !== "admin") { router.push("/") return } fetchVenues() }, [user, router, authLoading]) const fetchVenues = async () => { if (!token) return try { const res = await fetch(`${getApiUrl()}/venues?limit=200`, { headers: { Authorization: `Bearer ${token}` } }) if (res.ok) { const data = await res.json() setVenues(data.venues || data) } } catch (e) { console.error("Failed to fetch venues", e) } finally { setLoading(false) } } const updateVenue = async () => { if (!token || !editingVenue) return setSaving(true) try { const res = await fetch(`${getApiUrl()}/admin/venues/${editingVenue.id}`, { method: "PATCH", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` }, body: JSON.stringify({ name: editingVenue.name, city: editingVenue.city, state: editingVenue.state, country: editingVenue.country, capacity: editingVenue.capacity }) }) if (res.ok) { fetchVenues() setEditingVenue(null) } } catch (e) { console.error("Failed to update venue", e) } finally { setSaving(false) } } const filteredVenues = venues.filter(v => v.name.toLowerCase().includes(search.toLowerCase()) || v.city.toLowerCase().includes(search.toLowerCase()) ) if (loading) { return (
{[1, 2, 3].map(i =>
)}
) } return (

Venue Management

setSearch(e.target.value)} className="pl-9" />
{filteredVenues.slice(0, 100).map(venue => ( ))}
Venue Location Capacity Actions
{venue.name} {venue.city}{venue.state ? `, ${venue.state}` : ""}, {venue.country} {venue.capacity ? ( {venue.capacity.toLocaleString()} ) : ( )}
{filteredVenues.length === 0 && (
No venues found
)}
setEditingVenue(null)}> Edit Venue: {editingVenue?.name} {editingVenue && (
setEditingVenue({ ...editingVenue, name: e.target.value })} />
setEditingVenue({ ...editingVenue, city: e.target.value })} />
setEditingVenue({ ...editingVenue, state: e.target.value })} />
setEditingVenue({ ...editingVenue, country: e.target.value })} />
setEditingVenue({ ...editingVenue, capacity: parseInt(e.target.value) || null })} />
)}
) }