import { ScrollArea, Table, Text, TextInput, Tooltip, rem, } from '@mantine/core'; import dayjs from 'dayjs'; import relativeTime from 'dayjs/plugin/relativeTime'; import { ChangeEvent, 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 { UserBadgeRole } from '~/components/common/user_badge_role'; 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 type Columns = keyof UserWithCounts; const DEFAULT_SORT_BY: Columns = 'lastSeenAt'; const DEFAULT_SORT_DIRECTION = true; export interface UsersTableProps { users: UsersWithCounts; totalCollections: number; totalLinks: number; } export function UsersTable({ users, totalCollections, totalLinks, }: UsersTableProps) { const { t } = useTranslation(); const [search, setSearch] = useState(''); const [sortBy, setSortBy] = useState(DEFAULT_SORT_BY); const [reverseSortDirection, setReverseSortDirection] = useState( DEFAULT_SORT_DIRECTION ); const [sortedData, setSortedData] = useState(() => sortData(users, { sortBy: sortBy, reversed: reverseSortDirection, search: '', }) ); 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: 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.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')}
); }