import React, { useMemo, useState, useCallback, useEffect } from 'react'; import { Box, Table, Flex, TextInput, Icon } from '@rocket.chat/fuselage'; import { useMediaQuery } from '@rocket.chat/fuselage-hooks'; import { GenericTable, Th } from '../../components/GenericTable'; import { useTranslation } from '../../contexts/TranslationContext'; import { useRoute } from '../../contexts/RouterContext'; import { usePermission } from '../../contexts/AuthorizationContext'; import { useQuery } from './hooks'; import { useEndpointData } from '../../hooks/useEndpointData'; import { useFormatDate } from '../../hooks/useFormatDate'; import UserAvatar from '../../components/basic/avatar/UserAvatar'; import NotAuthorizedPage from '../../components/NotAuthorizedPage'; const style = { whiteSpace: 'nowrap', textOverflow: 'ellipsis', overflow: 'hidden' }; const FilterByText = ({ setFilter, ...props }) => { const t = useTranslation(); const [text, setText] = useState(''); const handleChange = useCallback((event) => setText(event.currentTarget.value), []); useEffect(() => { setFilter({ text }); }, [text, setFilter]); return } onChange={handleChange} value={text} /> ; }; 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 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} {bio} {mediaQuery && canViewFullOtherUserInfo && {emails && emails[0].address} } {federation && {domain} } {mediaQuery && {formatDate(createdAt)} } , [mediaQuery, federation, canViewFullOtherUserInfo, formatDate, onClick]); return ; } export default function UserTab(props) { const canViewOutsideRoom = usePermission('view-outside-room'); const canViewDM = usePermission('view-d-room'); if (canViewOutsideRoom && canViewDM) { return ; } return ; }