import { Badge, ScrollArea, Table, Text, TextInput, Tooltip, rem, } from '@mantine/core'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { TbSearch } from 'react-icons/tb'; import { Th } from '~/components/admin/users/th'; import { sortData } from '~/components/admin/users/utils'; import { DATE_FORMAT } from '~/constants'; import { User } from '~/types/app'; dayjs.extend(relativeTime); export type UserWithCounts = User & { linksCount: number; collectionsCount: number; }; export type UsersWithCounts = UserWithCounts[]; export interface UsersTableProps { users: UsersWithCounts; totalCollections: number; totalLinks: number; } export function UsersTable({ users, totalCollections, totalLinks, }: UsersTableProps) { const { t } = useTranslation(); const [search, setSearch] = useState(''); const [sortedData, setSortedData] = useState(users); const [sortBy, setSortBy] = useState(null); const [reverseSortDirection, setReverseSortDirection] = useState(false); const setSorting = (field: keyof UserWithCounts) => { const reversed = field === sortBy ? !reverseSortDirection : false; setReverseSortDirection(reversed); setSortBy(field); setSortedData(sortData(users, { sortBy: field, reversed, search })); }; const handleSearchChange = (event: React.ChangeEvent) => { const { value } = event.currentTarget; setSearch(value); setSortedData( sortData(users, { sortBy: sortBy, reversed: reverseSortDirection, search: value, }) ); }; const renderDateCell = (date: string) => ( {dayjs(date).fromNow()} ); const rows = sortedData.map((user) => ( {user.fullname} {user.isAdmin ? ( {t('admin:admin')} ) : ( {t('admin:user')} )} {user.collectionsCount} {user.linksCount} {renderDateCell(user.createdAt)} {renderDateCell(user.lastSeenAt)} )); return ( } value={search} onChange={handleSearchChange} /> {rows.length > 0 ? ( rows ) : ( Nothing found )}
setSorting('fullname')} > {t('common:name')} setSorting('isAdmin')} > {t('admin:role')} setSorting('collectionsCount')} > {t('common:collection.collections')} ({totalCollections}) setSorting('linksCount')} > {t('common:link.links')} ({totalLinks}) setSorting('createdAt')} > {t('admin:created_at')} setSorting('lastSeenAt')} > {t('admin:last_seen_at')}
); }