import { X, User, ShieldCheck, Loader2 } from 'lucide-react'; import { toast } from 'sonner'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Select } from '@/components/ui/select'; import { Button } from '@/components/ui/button'; import { Skeleton } from '@/components/ui/skeleton'; import { useAdminUserDetail, useUpdateRole, getErrorMessage } from '@/hooks/useAdmin'; import { getRelativeTime } from '@/lib/date-utils'; import { cn } from '@/lib/utils'; import type { UserRole } from '@/types'; interface UserDetailSectionProps { userId: number; onClose: () => void; } function DetailRow({ label, value }: { label: string; value: React.ReactNode }) { return (
{label} {value || '—'}
); } function StatusBadge({ active }: { active: boolean }) { return ( {active ? 'Active' : 'Disabled'} ); } function MfaBadge({ enabled, pending }: { enabled: boolean; pending: boolean }) { if (enabled) { return ( Enabled ); } if (pending) { return ( Pending ); } return Off; } export default function UserDetailSection({ userId, onClose }: UserDetailSectionProps) { const { data: user, isLoading, error } = useAdminUserDetail(userId); const updateRole = useUpdateRole(); const handleRoleChange = async (newRole: UserRole) => { if (!user || newRole === user.role) return; try { await updateRole.mutateAsync({ userId: user.id, role: newRole }); toast.success(`Role updated to "${newRole}"`); } catch (err) { toast.error(getErrorMessage(err, 'Failed to update role')); } }; if (isLoading) { return (
{Array.from({ length: 5 }).map((_, i) => ( ))} {Array.from({ length: 7 }).map((_, i) => ( ))}
); } if (error) { return (

Failed to load user details

{error.message}

); } if (!user) return null; return (
{/* User Information (read-only) */}
User Information
{ const dob = new Date(user.date_of_birth + 'T00:00:00'); const now = new Date(); let age = now.getFullYear() - dob.getFullYear(); if (now.getMonth() < dob.getMonth() || (now.getMonth() === dob.getMonth() && now.getDate() < dob.getDate())) age--; return `${dob.toLocaleDateString()} (${age})`; })() : null} />
{/* Security & Permissions */}
Security & Permissions
Role
{updateRole.isPending && ( )}
} /> } />
); }