import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { useAuth } from '@/lib/auth'; import { api } from '@/lib/api'; import { useToast } from '@/hooks/useToast'; import { Search, KeyRound } from 'lucide-react'; const ROLE_COLORS: Record = { STUDENT: 'bg-slate-700 text-slate-300', ORG_MEMBER: 'bg-blue-900/60 text-blue-300', ORG_ADMIN: 'bg-violet-900/60 text-violet-300', ADMIN: 'bg-amber-900/60 text-amber-300', SUPER_ADMIN: 'bg-red-900/60 text-red-300', }; export default function UsersManager() { const { t } = useTranslation(); const { token } = useAuth(); const toast = useToast(); const [users, setUsers] = useState([]); const [total, setTotal] = useState(0); const [page, setPage] = useState(1); const [search, setSearch] = useState(''); const [loading, setLoading] = useState(true); const LIMIT = 20; async function load() { if (!token) return; setLoading(true); try { const params = new URLSearchParams({ page: String(page), limit: String(LIMIT) }); if (search) params.set('search', search); const data = await api.get(`/v1/super-admin/users?${params}`, token); setUsers(data.data ?? []); setTotal(data.total ?? 0); } catch { toast.error(t('super_admin.err_load_users')); } finally { setLoading(false); } } useEffect(() => { load(); }, [page, token]); async function handleSearch(e: React.FormEvent) { e.preventDefault(); setPage(1); load(); } async function handleRoleChange(userId: string, role: string) { try { await api.patch(`/v1/super-admin/users/${userId}/role`, { role }, token); toast.success(t('super_admin.role_updated')); load(); } catch { toast.error(t('super_admin.err_role_change')); } } async function handleResetPassword(user: any) { if (!user.email) { toast.error(t('super_admin.reset_no_email')); return; } if (!confirm(t('super_admin.reset_confirm', { email: user.email }))) return; try { await api.post(`/v1/super-admin/users/${user.id}/reset-password`, {}, token); toast.success(t('super_admin.reset_sent', { email: user.email })); } catch { toast.error(t('super_admin.err_reset_password')); } } return (

{t('super_admin.users_title')}

{t('super_admin.users_total', { count: total })}

setSearch(e.target.value)} placeholder={t('super_admin.user_search_placeholder')} className="w-full pl-9 pr-4 py-2 bg-slate-900 border border-slate-700 rounded-lg text-sm text-white placeholder-slate-500 focus:outline-none focus:border-violet-500" />
{loading ? (
{t('super_admin.org_loading')}
) : users.length === 0 ? (
{t('super_admin.user_empty')}
) : (
{users.map(user => ( ))}
{t('super_admin.col_user')} {t('super_admin.col_organization')} {t('super_admin.col_role')} {t('super_admin.col_created_at')}
{user.name || '—'}
{user.email || user.phone || '—'}
{user.organization?.name || '—'} {user.role} {new Date(user.createdAt).toLocaleDateString()}
)}
{total > LIMIT && (
{t('super_admin.pagination_info', { from: ((page - 1) * LIMIT) + 1, to: Math.min(page * LIMIT, total), total })}
)}
); }