import { ConfirmDeleteDialog, ConfirmDeleteDialogNode, } from '@/components/confirm-delete-dialog'; import { RAGFlowAvatar } from '@/components/ragflow-avatar'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { useListTenantUser } from '@/hooks/user-setting-hooks'; import { formatDate } from '@/utils/date'; import { upperFirst } from 'lodash'; import { ArrowDown, ArrowUp, ArrowUpDown, Trash2 } from 'lucide-react'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { TenantRole } from '../constants'; import { useHandleDeleteUser } from './hooks'; const ColorMap: Record = { [TenantRole.Normal]: 'bg-transparent text-white', [TenantRole.Invite]: 'bg-accent-primary-5 bg-accent-primary rounded-sm', [TenantRole.Owner]: 'bg-red-100 text-red-800', }; const UserTable = ({ searchUser }: { searchUser: string }) => { const { data, loading } = useListTenantUser(); const { deleteTenantUser } = useHandleDeleteUser(); const [sortOrder, setSortOrder] = useState<'asc' | 'desc' | null>(null); const { t } = useTranslation(); const sortedData = useMemo(() => { console.log('sortedData', data, searchUser); if (!data || data.length === 0) return data; let filtered = data; if (searchUser) { filtered = filtered.filter( (tenant) => tenant.nickname.toLowerCase().includes(searchUser.toLowerCase()) || tenant.email.toLowerCase().includes(searchUser.toLowerCase()), ); } if (sortOrder) { filtered = [...filtered].sort((a, b) => { const dateA = new Date(a.update_date).getTime(); const dateB = new Date(b.update_date).getTime(); if (sortOrder === 'asc') { return dateA - dateB; } else { return dateB - dateA; } }); } return filtered; }, [data, sortOrder, searchUser]); const toggleSortOrder = () => { if (sortOrder === 'asc') { setSortOrder('desc'); } else if (sortOrder === 'desc') { setSortOrder(null); } else { setSortOrder('asc'); } }; const renderSortIcon = () => { if (sortOrder === 'asc') { return ; } else if (sortOrder === 'desc') { return ; } else { return ; } }; return (
{t('common.name')}
{t('setting.updateDate')} {renderSortIcon()}
{t('setting.email')} {t('setting.role')} {t('common.action')}
{loading ? (
) : sortedData && sortedData.length > 0 ? ( sortedData.map((record) => (
{record.nickname}
{formatDate(record.update_date)} {record.email} {record.role === TenantRole.Normal && ( {upperFirst('Member')} )} {record.role !== TenantRole.Normal && ( {upperFirst(record.role)} )} { await deleteTenantUser({ userId: record.user_id, }); return; }} content={{ node: ( ), }} >
)) ) : ( {t('common.noData')} )}
); }; export default UserTable;