'use client'; import { Clock, Mail, MoreHorizontal, Pencil, Shield, Trash2 } from 'lucide-react'; import { formatDistanceToNow } from 'date-fns'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { ConfirmationDialog } from '@/components/shared/confirmation-dialog'; import { ListCard, ListCardAvatar, ListCardMeta, deriveInitials, } from '@/components/shared/list-card'; import { cn } from '@/lib/utils'; interface UserRow { userId: string; displayName: string; email: string; phone: string | null; isActive: boolean; isSuperAdmin: boolean; lastLoginAt: string | null; role: { id: string; name: string }; assignedAt: string; } interface UserCardProps { user: UserRow; onEdit: (user: UserRow) => void; onRemove: (userId: string) => void; isRemoving: boolean; } export function UserCard({ user, onEdit, onRemove, isRemoving }: UserCardProps) { const initials = deriveInitials(user.displayName || user.email); const accentClass = user.isSuperAdmin ? 'bg-violet-400' : !user.isActive ? 'bg-slate-400' : undefined; return ( { e.preventDefault(); onEdit(user); }} > Edit e.preventDefault()}> Remove } title="Remove User" description={`Remove "${user.displayName}" from this port? They will lose access but their account remains.`} confirmLabel="Remove" onConfirm={() => onRemove(user.userId)} loading={isRemoving} /> } >
{/* Title row + spacer for actions button */}

{user.displayName || user.email}

{/* Email subtitle — only when display name is shown as title */} {user.displayName && user.displayName !== user.email ? (

{user.email}

) : null} {/* Role + last login meta */}
}>{user.role.name} {user.lastLoginAt ? ( }> {formatDistanceToNow(new Date(user.lastLoginAt), { addSuffix: true })} ) : ( }>Never logged in )}
{/* Status + super-admin pills */}
{!user.isActive ? ( Inactive ) : null} {user.isSuperAdmin ? ( Super Admin ) : null}
); }