import { useEffect, useState } from 'react'; import { useAuthStore } from '../store/authStore'; import { useNavigate } from 'react-router-dom'; import { ArrowLeft, ShieldAlert, Loader2, Save } from 'lucide-react'; import { api } from '../lib/api'; interface UserProfile { id: string; email: string; role: string; api_credits: number; storage_limit_mb: number; is_active: number; } export default function Admin() { const navigate = useNavigate(); const { profile } = useAuthStore(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { const fetchUsers = async () => { if (profile?.role !== 'admin') return; try { const data = await api.getUsers(); setUsers(data.users || []); } catch (error) { console.error(error); } setLoading(false); }; fetchUsers(); }, [profile]); const updateLimits = async (userObj: UserProfile) => { try { await api.updateUser(userObj.id, { role: userObj.role, api_credits: userObj.api_credits, storage_limit_mb: userObj.storage_limit_mb, is_active: userObj.is_active }); alert("Updated successfully!"); } catch (error: any) { alert("Failed to update user: " + error.message); } }; if (profile?.role !== 'admin') { return (

Access Denied

You do not have administrative privileges.

); } return (

Admin Control Panel

User Limit Management

{loading ? (
) : (
{users.map(u => ( ))}
User ID Email Role Status API Credits Storage Limit (MB) Actions
)}
); } const UserRow = ({ user, onUpdate }: { user: UserProfile, onUpdate: (u: UserProfile) => void }) => { const [role, setRole] = useState(user.role); const [isActive, setIsActive] = useState(user.is_active); const [credits, setCredits] = useState(user.api_credits); const [storage, setStorage] = useState(user.storage_limit_mb); const handleUpdate = () => { onUpdate({ ...user, role, is_active: isActive, api_credits: credits, storage_limit_mb: storage }); }; return ( {user.id.substring(0, 8)}... {user.email} setCredits(Number(e.target.value))} className="w-24 bg-zinc-950 border border-zinc-700 rounded px-2 py-1 text-white focus:outline-none focus:border-primary" /> setStorage(Number(e.target.value))} className="w-24 bg-zinc-950 border border-zinc-700 rounded px-2 py-1 text-white focus:outline-none focus:border-primary" /> ); }