import { Box, Table, Flex } from '@rocket.chat/fuselage'; import { useMediaQuery, useAutoFocus } from '@rocket.chat/fuselage-hooks'; import React, { useMemo, useState, useCallback } from 'react'; import FilterByText from '../../components/FilterByText'; import GenericTable from '../../components/GenericTable'; import MarkdownText from '../../components/MarkdownText'; import UserAvatar from '../../components/avatar/UserAvatar'; import { usePermission } from '../../contexts/AuthorizationContext'; import { useRoute } from '../../contexts/RouterContext'; import { useTranslation } from '../../contexts/TranslationContext'; import { useEndpointData } from '../../hooks/useEndpointData'; import { useFormatDate } from '../../hooks/useFormatDate'; import { useQuery } from './hooks'; function UserTable({ workspace = 'local' }) { const [params, setParams] = useState({ current: 0, itemsPerPage: 25 }); const [sort, setSort] = useState(['name', 'asc']); const canViewFullOtherUserInfo = usePermission('view-full-other-user-info'); const t = useTranslation(); const federation = workspace === 'external'; const query = useQuery(params, sort, 'users', workspace); const mediaQuery = useMediaQuery('(min-width: 1024px)'); const onHeaderClick = useCallback( (id) => { const [sortBy, sortDirection] = sort; if (sortBy === id) { setSort([id, sortDirection === 'asc' ? 'desc' : 'asc']); return; } setSort([id, 'asc']); }, [sort], ); const header = useMemo( () => [ {t('Name')} , mediaQuery && canViewFullOtherUserInfo && ( {t('Email')} ), federation && ( {t('Domain')} ), mediaQuery && ( {t('Joined_at')} ), ].filter(Boolean), [sort, onHeaderClick, t, mediaQuery, canViewFullOtherUserInfo, federation], ); const directRoute = useRoute('direct'); const { value: data = {} } = useEndpointData('directory', query); const onClick = useCallback( (username) => (e) => { if (e.type === 'click' || e.key === 'Enter') { directRoute.push({ rid: username }); } }, [directRoute], ); const formatDate = useFormatDate(); const renderRow = useCallback( ({ createdAt, emails, _id, username, name, domain, bio, avatarETag, nickname }) => ( {name || username} {nickname && ` (${nickname})`} {' '} {' '} {username} {mediaQuery && canViewFullOtherUserInfo && ( {emails && emails.length && emails[0].address} )} {federation && {domain}} {mediaQuery && ( {formatDate(createdAt)} )} ), [mediaQuery, federation, canViewFullOtherUserInfo, formatDate, onClick], ); const refAutoFocus = useAutoFocus(true); return ( ( )} renderRow={renderRow} results={data.result} setParams={setParams} total={data.total} /> ); } export default UserTable;