"use client" import { useEffect, useState } from "react" import { useAuth } from "@/contexts/auth-context" import { useRouter } from "next/navigation" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Badge } from "@/components/ui/badge" import { Users, Music2, MapPin, Calendar, BarChart3, Shield, ShieldCheck, Search, Check, X, Edit } from "lucide-react" import { getApiUrl } from "@/lib/api-config" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter, } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" interface PlatformStats { total_users: number verified_users: number total_shows: number total_songs: number total_venues: number total_ratings: number total_reviews: number total_comments: number } interface UserItem { id: number email: string username: string | null role: string is_active: boolean email_verified: boolean } export default function AdminPage() { const { user, token } = useAuth() const router = useRouter() const [stats, setStats] = useState(null) const [users, setUsers] = useState([]) const [loading, setLoading] = useState(true) const [search, setSearch] = useState("") const [editingUser, setEditingUser] = useState(null) useEffect(() => { if (!user) { router.push("/login") return } if (user.role !== "admin") { router.push("/") return } fetchData() }, [user, router]) const fetchData = async () => { if (!token) return try { const [statsRes, usersRes] = await Promise.all([ fetch(`${getApiUrl()}/admin/stats`, { headers: { Authorization: `Bearer ${token}` } }), fetch(`${getApiUrl()}/admin/users`, { headers: { Authorization: `Bearer ${token}` } }) ]) if (statsRes.ok) setStats(await statsRes.json()) if (usersRes.ok) setUsers(await usersRes.json()) } catch (e) { console.error("Failed to fetch admin data", e) } finally { setLoading(false) } } const updateUser = async (userId: number, updates: Partial) => { if (!token) return try { const res = await fetch(`${getApiUrl()}/admin/users/${userId}`, { method: "PATCH", headers: { "Content-Type": "application/json", Authorization: `Bearer ${token}` }, body: JSON.stringify(updates) }) if (res.ok) { fetchData() setEditingUser(null) } } catch (e) { console.error("Failed to update user", e) } } const filteredUsers = users.filter(u => u.email.toLowerCase().includes(search.toLowerCase()) || (u.username && u.username.toLowerCase().includes(search.toLowerCase())) ) if (loading) { return (
{[1, 2, 3, 4].map(i =>
)}
) } if (!user || user.role !== "admin") { return null } return (

Admin Dashboard

{stats && (

{stats.total_users}

Total Users

{stats.verified_users}

Verified

{stats.total_shows}

Shows

{stats.total_songs}

Songs

)} Users Content
setSearch(e.target.value)} className="pl-9" />
{filteredUsers.map(u => ( ))}
User Role Status Verified Actions

{u.username || "No username"}

{u.email}

{u.role} {u.is_active ? ( Active ) : ( Banned )} {u.email_verified ? ( ) : ( )}
Shows

{stats?.total_shows || 0} shows in database

Songs

{stats?.total_songs || 0} songs in database

Venues

{stats?.total_venues || 0} venues in database

Activity

{stats?.total_ratings || 0} ratings

{stats?.total_reviews || 0} reviews

{stats?.total_comments || 0} comments

setEditingUser(null)}> Edit User {editingUser && (

{editingUser.email}

{editingUser.username || "No username"}

)}
) }