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;