import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, UserX } from 'lucide-react' import { usersApi } from '@/lib/api' import { useAuth, isTenantAdmin } from '@/lib/auth' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { formatDateTime } from '@/lib/utils' import { CreateUserForm } from './CreateUserForm' import { toast } from '@/components/ui/toast' import { TableSkeleton } from '@/components/ui/page-skeleton' const ROLE_COLORS: Record = { super_admin: '#7c3aed', tenant_admin: '#2563eb', operator: '#059669', viewer: '#6b7280', } const ROLE_LABELS: Record = { super_admin: 'Super Admin', tenant_admin: 'Admin', operator: 'Operator', viewer: 'Viewer', } interface Props { tenantId: string } export function UserList({ tenantId }: Props) { const { user: currentUser } = useAuth() const queryClient = useQueryClient() const [createOpen, setCreateOpen] = useState(false) const { data: users, isLoading } = useQuery({ queryKey: ['users', tenantId], queryFn: () => usersApi.list(tenantId), }) const deactivateMutation = useMutation({ mutationFn: (userId: string) => usersApi.deactivate(tenantId, userId), onSuccess: () => { void queryClient.invalidateQueries({ queryKey: ['users', tenantId] }) void queryClient.invalidateQueries({ queryKey: ['tenants'] }) toast({ title: 'User deactivated' }) }, onError: () => { toast({ title: 'Failed to deactivate user', variant: 'destructive' }) }, }) const handleDeactivate = (userId: string, email: string) => { if (confirm(`Deactivate user "${email}"?`)) { deactivateMutation.mutate(userId) } } return (

Users

{users?.filter((u) => u.is_active).length ?? 0} active

{isTenantAdmin(currentUser) && ( )}
{isTenantAdmin(currentUser) && ( )} {isLoading ? ( ) : users?.length === 0 ? ( ) : ( users?.map((u) => ( {isTenantAdmin(currentUser) && ( )} )) )}
Name Email Role Last Login StatusActions
No users in this tenant
{u.name} {u.email} {ROLE_LABELS[u.role] ?? u.role} {formatDateTime(u.last_login)} {u.is_active ? ( Active ) : ( Inactive )} {u.is_active && u.id !== currentUser?.id && ( )}
setCreateOpen(false)} />
) }