'use client'; import { AuthGuard } from '@/components/AuthGuard'; import { DashboardLayout } from '@/components/DashboardLayout'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { adminApi, AdminUser, AdminUserUpdate } from '@/lib/api'; import { useAuthStore } from '@/store/authStore'; import { useRouter } from 'next/navigation'; import { useEffect, useState } from 'react'; import { Shield, Pencil, Trash2, X, Check } from 'lucide-react'; const TIERS = ['free', 'basic', 'pro', 'enterprise']; const STATUSES = ['active', 'canceled', 'past_due']; function EditUserModal({ user, onClose, onSave, }: { user: AdminUser; onClose: () => void; onSave: (data: AdminUserUpdate) => void; }) { const [form, setForm] = useState({ full_name: user.full_name ?? '', email: user.email, is_active: user.is_active, is_superuser: user.is_superuser, subscription_tier: user.subscription_tier, subscription_status: user.subscription_status, }); return (

Edit User

setForm({ ...form, full_name: e.target.value })} />
setForm({ ...form, email: e.target.value })} />
); } export default function AdminUsersPage() { const { user: currentUser } = useAuthStore(); const router = useRouter(); const queryClient = useQueryClient(); const [editingUser, setEditingUser] = useState(null); const [deleteConfirm, setDeleteConfirm] = useState(null); useEffect(() => { if (currentUser && !currentUser.is_superuser) { router.replace('/dashboard'); } }, [currentUser, router]); const { data: users, isLoading } = useQuery({ queryKey: ['admin-users'], queryFn: () => adminApi.listUsers(), enabled: !!currentUser?.is_superuser, }); const updateMutation = useMutation({ mutationFn: ({ id, data }: { id: number; data: AdminUserUpdate }) => adminApi.updateUser(id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-users'] }); setEditingUser(null); }, }); const deleteMutation = useMutation({ mutationFn: (id: number) => adminApi.deleteUser(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['admin-users'] }); setDeleteConfirm(null); }, }); // AuthGuard must always render (see admin/page.tsx for explanation). return ( {!currentUser?.is_superuser ? (
) : ( <>

Manage Users

View all registered users, assign plans, and manage admin privileges.

{isLoading ? (
) : (
{['User', 'Plan', 'Status', 'Accounts', 'Last Login', 'Role', 'Actions'].map((h) => ( ))} {(users ?? []).map((u) => ( ))}
{h}

{u.full_name || '—'}

{u.email}

{u.subscription_tier} {u.is_active ? 'Active' : 'Inactive'} {u.mail_account_count} {u.last_login_at ? new Date(u.last_login_at).toLocaleDateString() : '—'} {u.is_superuser ? ( Admin ) : ( User )}
{u.id !== currentUser?.id && ( deleteConfirm === u.id ? (
) : ( ) )}
{(users ?? []).length === 0 && (
No users found.
)}
)}
{editingUser && ( setEditingUser(null)} onSave={(data) => updateMutation.mutate({ id: editingUser.id, data })} /> )} )} ); }