import { DataTable } from '@/components/admin/DataTable.tsx'; import { Badge, Button, Input } from '@/components/ui'; import { useDeactivateUser, useUpdateUserRole, useUsers } from '@/hooks/api/useAdminAPI.ts'; import { useTranslation } from '@/hooks/useI18n.tsx'; import type { User } from '@/services/admin-api.ts'; import { Edit, Plus, UserCheck, UserX } from 'lucide-react'; import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; const UsersListPage = () => { const { t } = useTranslation(); const navigate = useNavigate(); const [searchTerm, setSearchTerm] = useState(''); const [roleFilter, setRoleFilter] = useState(); const [statusFilter, setStatusFilter] = useState(); const [currentPage, setCurrentPage] = useState(1); const pageSize = 25; const { data, isLoading } = useUsers({ search: searchTerm || undefined, role: roleFilter, isActive: statusFilter, limit: pageSize, offset: (currentPage - 1) * pageSize, }); const { mutate: deactivateUser } = useDeactivateUser(); const { mutate: updateRole } = useUpdateUserRole(); const handleDeactivate = (user: User) => { if ( window.confirm( t('adminPage.users.confirmDeactivate', { name: user.name }) || `Deactivate ${user.name}?` ) ) { deactivateUser(user.id, { onSuccess: () => { // Query will refetch automatically }, }); } }; const handleRoleChange = (user: User, newRole: string) => { updateRole( { id: user.id, role: newRole }, { onSuccess: () => { // Query will refetch automatically }, } ); }; const formatDate = (dateString: string | null | undefined) => { if (!dateString) return t('adminPage.users.never') || 'Never'; try { const date = new Date(dateString); return ( date.toLocaleDateString() + ' ' + date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }) ); } catch { return t('adminPage.users.never') || 'Never'; } }; const columns = [ { key: 'name', header: t('adminPage.users.table.name') || 'Name', render: (user: User) => {user.name}, }, { key: 'email', header: t('adminPage.users.table.email') || 'Email', render: (user: User) => {user.email}, }, { key: 'role', header: t('adminPage.users.table.role') || 'Role', render: (user: User) => ( {user.role} ), }, { key: 'status', header: t('adminPage.users.table.status') || 'Status', render: (user: User) => ( {user.isActive ? t('adminPage.users.active') || 'Active' : t('adminPage.users.inactive') || 'Inactive'} ), }, { key: 'lastLogin', header: t('adminPage.users.table.lastLogin') || 'Last Login', render: (user: User) => ( {formatDate(user.lastLoginAt)} ), }, ]; const actions = [ { label: t('adminPage.users.edit') || 'Edit', icon: , onClick: (user: User) => navigate(`/admin/users/${user.id}/edit`), }, { label: t('adminPage.users.changeRole') || 'Change Role', onClick: (user: User) => handleRoleChange(user, user.role === 'admin' ? 'user' : 'admin'), }, { label: t('adminPage.users.toggleStatus') || 'Toggle Status', variant: 'destructive' as const, onClick: (user: User) => handleDeactivate(user), }, ]; return (
{/* Header */}

{t('adminPage.users.title') || 'Users'}

{t('adminPage.users.description') || 'Manage user accounts, roles, and permissions'}

{/* Filters */}
setSearchTerm(e.target.value)} />
{/* Table */} user.id} isLoading={isLoading} actions={actions} pagination={ data ? { currentPage, totalPages: Math.ceil(data.total / pageSize), pageSize, totalItems: data.total, onPageChange: setCurrentPage, } : undefined } />
); }; export default UsersListPage;