import { useState, memo } from 'react';
import { Form } from '@remix-run/react';
import { DataTable, Pagination, Button, Text, ConfirmModal } from '~/components/ui';
import { getAuthLevelName, getStatusName } from '~/lib/user-utils';
import { useSettings } from '~/contexts/SettingsContext';
import { AUTH_LEVELS } from '~/types/auth';
import type { UserWithoutPassword } from '~/types/database';
interface UserListProps {
users: UserWithoutPassword[];
currentPage: number;
totalPages: number;
onPageChange: (page: number) => void;
onEdit: (user: UserWithoutPassword) => void;
onDelete: (userId: number) => void;
onToggleStatus: (userId: number) => void;
currentUserAuthLevel: number;
loading?: boolean;
}
export const UserList = memo(function UserList({
users,
currentPage,
totalPages,
onPageChange,
onEdit,
onDelete,
onToggleStatus,
currentUserAuthLevel,
loading = false,
}: UserListProps) {
const { formatDate } = useSettings();
const [deleteModal, setDeleteModal] = useState<{
isOpen: boolean;
user: UserWithoutPassword | null;
}>({ isOpen: false, user: null });
const [statusModal, setStatusModal] = useState<{
isOpen: boolean;
user: UserWithoutPassword | null;
}>({ isOpen: false, user: null });
const handleDeleteClick = (user: UserWithoutPassword) => {
setDeleteModal({ isOpen: true, user });
};
const handleStatusClick = (user: UserWithoutPassword) => {
setStatusModal({ isOpen: true, user });
};
const handleDeleteConfirm = () => {
if (deleteModal.user) {
onDelete(deleteModal.user.id);
}
setDeleteModal({ isOpen: false, user: null });
};
const handleStatusConfirm = () => {
if (statusModal.user) {
onToggleStatus(statusModal.user.id);
}
setStatusModal({ isOpen: false, user: null });
};
const canEditUser = (user: UserWithoutPassword) => {
// Superadmin can edit anyone
if (currentUserAuthLevel === AUTH_LEVELS.SUPERADMIN) return true;
// Admin cannot edit superadmin
if (currentUserAuthLevel === AUTH_LEVELS.ADMIN && user.authLevel === AUTH_LEVELS.SUPERADMIN) {
return false;
}
return true;
};
const canDeleteUser = (user: UserWithoutPassword) => {
// Same rules as edit
return canEditUser(user);
};
const columns = [
{
key: 'name',
header: 'الاسم',
sortable: true,
render: (user: UserWithoutPassword) => (
{user.name}
@{user.username}
),
},
{
key: 'email',
header: 'البريد الإلكتروني',
sortable: true,
},
{
key: 'authLevel',
header: 'مستوى الصلاحية',
render: (user: UserWithoutPassword) => {
const levelName = getAuthLevelName(user.authLevel);
const colorClass = user.authLevel === AUTH_LEVELS.SUPERADMIN
? 'text-purple-600 bg-purple-100'
: user.authLevel === AUTH_LEVELS.ADMIN
? 'text-blue-600 bg-blue-100'
: 'text-gray-600 bg-gray-100';
return (
{levelName}
);
},
},
{
key: 'status',
header: 'الحالة',
render: (user: UserWithoutPassword) => {
const statusName = getStatusName(user.status);
const colorClass = user.status === 'active'
? 'text-green-600 bg-green-100'
: 'text-red-600 bg-red-100';
return (
{statusName}
);
},
},
{
key: 'createdDate',
header: 'تاريخ الإنشاء',
sortable: true,
render: (user: UserWithoutPassword) => (
{formatDate(user.createdDate)}
),
},
{
key: 'actions',
header: 'الإجراءات',
render: (user: UserWithoutPassword) => (
{canEditUser(user) && (
)}
{canEditUser(user) && (
)}
{canDeleteUser(user) && (
)}
),
},
];
return (
<>
{/* Desktop Table View */}
{/* Mobile Card View */}
{users.map((user) => {
const levelName = getAuthLevelName(user.authLevel);
const statusName = getStatusName(user.status);
const levelColorClass = user.authLevel === AUTH_LEVELS.SUPERADMIN
? 'text-purple-600 bg-purple-100'
: user.authLevel === AUTH_LEVELS.ADMIN
? 'text-blue-600 bg-blue-100'
: 'text-gray-600 bg-gray-100';
const statusColorClass = user.status === 'active'
? 'text-green-600 bg-green-100'
: 'text-red-600 bg-red-100';
return (
{user.name}
@{user.username}
{user.email && (
{user.email}
)}
{levelName}
{statusName}
{formatDate(user.createdDate)}
{canEditUser(user) && (
)}
{canEditUser(user) && (
)}
{canDeleteUser(user) && (
)}
);
})}
{totalPages > 1 && (
)}
{/* Delete Confirmation Modal */}
setDeleteModal({ isOpen: false, user: null })}
onConfirm={handleDeleteConfirm}
title="تأكيد الحذف"
message={`هل أنت متأكد من حذف المستخدم "${deleteModal.user?.name}"؟ هذا الإجراء لا يمكن التراجع عنه.`}
confirmText="حذف"
cancelText="إلغاء"
variant="danger"
/>
{/* Status Toggle Confirmation Modal */}
setStatusModal({ isOpen: false, user: null })}
onConfirm={handleStatusConfirm}
title={statusModal.user?.status === 'active' ? 'إلغاء تفعيل المستخدم' : 'تفعيل المستخدم'}
message={
statusModal.user?.status === 'active'
? `هل أنت متأكد من إلغاء تفعيل المستخدم "${statusModal.user?.name}"؟`
: `هل أنت متأكد من تفعيل المستخدم "${statusModal.user?.name}"؟`
}
confirmText={statusModal.user?.status === 'active' ? 'إلغاء تفعيل' : 'تفعيل'}
cancelText="إلغاء"
variant={statusModal.user?.status === 'active' ? 'warning' : 'info'}
/>
>
);
});