import { Box, Table, TextInput, Icon } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMediaQuery } from '@rocket.chat/fuselage-hooks'; import React, { useMemo, useCallback, useState, useEffect } from 'react'; import UserAvatar from '../../components/basic/avatar/UserAvatar'; import { GenericTable, Th } from '../../components/GenericTable'; import { useTranslation } from '../../contexts/TranslationContext'; import { useRoute } from '../../contexts/RouterContext'; import { useEndpointData } from '../../hooks/useEndpointData'; 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 }); }, [setFilter, text]); return e.preventDefault(), [])} display='flex' flexDirection='column' {...props}> } onChange={handleChange} value={text} /> ; }; const sortDir = (sortDir) => (sortDir === 'asc' ? 1 : -1); const useQuery = ({ text, itemsPerPage, current }, [column, direction]) => useMemo(() => ({ fields: JSON.stringify({ name: 1, username: 1, emails: 1, roles: 1, status: 1, avatarETag: 1 }), query: JSON.stringify({ $or: [ { 'emails.address': { $regex: text || '', $options: 'i' } }, { username: { $regex: text || '', $options: 'i' } }, { name: { $regex: text || '', $options: 'i' } }, ], }), sort: JSON.stringify({ [column]: sortDir(direction), usernames: column === 'name' ? sortDir(direction) : undefined }), ...itemsPerPage && { count: itemsPerPage }, ...current && { offset: current }, }), [text, itemsPerPage, current, column, direction]); export function UsersTable() { const t = useTranslation(); const [params, setParams] = useState({ text: '', current: 0, itemsPerPage: 25 }); const [sort, setSort] = useState(['name', 'asc']); const debouncedParams = useDebouncedValue(params, 500); const debouncedSort = useDebouncedValue(sort, 500); const query = useQuery(debouncedParams, debouncedSort); const data = useEndpointData('users.list', query) || {}; const usersRoute = useRoute('admin-users'); const onClick = useCallback((username) => () => usersRoute.push({ context: 'info', id: username, }), [usersRoute]); const onHeaderClick = useCallback((id) => { const [sortBy, sortDirection] = sort; if (sortBy === id) { setSort([id, sortDirection === 'asc' ? 'desc' : 'asc']); return; } setSort([id, 'asc']); }, [sort]); const mediaQuery = useMediaQuery('(min-width: 1024px)'); const header = useMemo(() => [ {t('Name')}, mediaQuery && {t('Username')}, {t('Email')}, mediaQuery && {t('Roles')}, {t('Status')}, ].filter(Boolean), [sort, onHeaderClick, t, mediaQuery]); const renderRow = useCallback(({ emails, _id, username, name, roles, status, avatarETag }) => {name || username} {!mediaQuery && name && {`@${ username }`} } {mediaQuery && { username } } {emails && emails.length && emails[0].address} {mediaQuery && {roles && roles.join(', ')}} {status} , [mediaQuery, onClick]); return ; } export default UsersTable;