'use client'; import { useEffect, useState } from 'react'; import api from '@/lib/api'; import EditUserModal from '@/components/edit-user-modal'; import ResetPasswordModal from '@/components/reset-password-modal'; interface User { id: string; email: string; firstName: string; lastName: string; isActive: boolean; createdAt: string; tenant: { id: string; name: string; slug: string } | null; roles: { role: string }[]; tenantRoles: { tenantRole: { name: string; slug: string } }[]; } interface TenantOption { id: string; name: string; slug: string; } export default function UsersPage() { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [search, setSearch] = useState(''); const [tenantId, setTenantId] = useState(''); const [tenants, setTenants] = useState([]); const [page, setPage] = useState(1); const [total, setTotal] = useState(0); const limit = 20; const [editingUser, setEditingUser] = useState(null); const [resettingUser, setResettingUser] = useState(null); useEffect(() => { loadTenants(); }, []); useEffect(() => { loadUsers(); }, [search, tenantId, page]); async function loadTenants() { try { const res = await api.get('/tenants?limit=100'); setTenants(res.data.data.items || []); } catch {} } async function loadUsers() { setLoading(true); try { const params = new URLSearchParams({ page: String(page), limit: String(limit) }); if (search) params.set('search', search); if (tenantId) params.set('tenantId', tenantId); const res = await api.get(`/users?${params}`); setUsers(res.data.data.items); setTotal(res.data.data.total); } catch (err) { console.error(err); } finally { setLoading(false); } } return (

Users

{total} total users across all tenants

{ setSearch(e.target.value); setPage(1); }} className="px-3 py-2 border border-surface-300 rounded-lg text-sm flex-1 min-w-[200px] max-w-xs" />
{loading ? ( ) : users.length === 0 ? ( ) : ( users.map((u) => ( )) )}
Name Email Tenant Roles Status Actions
Loading...
No users found
{u.firstName} {u.lastName} {u.email} {u.tenant?.name || '—'}
{u.roles.map((r, i) => ( {r.role} ))} {u.tenantRoles.map((tr, i) => ( {tr.tenantRole.name} ))}
{u.isActive ? 'Active' : 'Inactive'}
{/* Pagination */} {total > limit && (
Showing {(page - 1) * limit + 1}-{Math.min(page * limit, total)} of {total}
)} {/* Modals */} {editingUser && ( setEditingUser(null)} onSuccess={loadUsers} /> )} {resettingUser && ( setResettingUser(null)} onSuccess={loadUsers} /> )}
); }