import type { IUser } from '@rocket.chat/core-typings'; import { Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMediaQuery, useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { GenericTable, GenericTableLoadingTable, GenericTableHeaderCell, GenericTableBody, GenericTableHeader, usePagination, useSort, } from '@rocket.chat/ui-client'; import { useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; import { keepPreviousData, useQuery } from '@tanstack/react-query'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import ModerationConsoleTableRow from './ModerationConsoleTableRow'; import ModerationFilter from './helpers/ModerationFilter'; import GenericNoResults from '../../../components/GenericNoResults'; // TODO: Missing error state const ModerationConsoleTable = () => { const [text, setText] = useState(''); const router = useRouter(); const { t } = useTranslation(); const isDesktopOrLarger = useMediaQuery('(min-width: 1024px)'); const { sortBy, sortDirection, setSort } = useSort<'reports.ts' | 'reports.message.u.username' | 'reports.description' | 'count'>( 'reports.ts', ); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const [dateRange, setDateRange] = useState<{ start: string | null; end: string | null }>({ start: '', end: '', }); const { start, end } = dateRange; const query = useDebouncedValue( useMemo( () => ({ selector: text, sort: JSON.stringify({ [sortBy]: sortDirection === 'asc' ? 1 : -1 }), count: itemsPerPage, offset: current, ...(end && { latest: `${new Date(end).toISOString().slice(0, 10)}T23:59:59.999Z` }), ...(start && { oldest: `${new Date(start).toISOString().slice(0, 10)}T00:00:00.000Z` }), }), [current, end, itemsPerPage, sortBy, sortDirection, start, text], ), 500, ); const getReports = useEndpoint('GET', '/v1/moderation.reportsByUsers'); const { data, isLoading, isSuccess } = useQuery({ queryKey: ['moderation', 'msgReports', 'fetchAll', query], queryFn: async () => getReports(query), meta: { apiErrorToastMessage: true, }, placeholderData: keepPreviousData, }); const handleClick = useEffectEvent((id: IUser['_id']): void => { router.navigate({ pattern: '/admin/moderation/:tab?/:context?/:id?', params: { tab: 'messages', context: 'info', id, }, }); }); const headers = useMemo( () => [ {t('User')} , {t('Room')} , {t('Moderation_Report_date')} , {t('Moderation_Reports')} , , ], [sortDirection, sortBy, setSort, t], ); return ( <> {isLoading && ( {headers} {isLoading && } )} {isSuccess && data.reports.length > 0 && ( <> {headers} {data.reports.map((report) => ( ))} )} {isSuccess && data.reports.length === 0 && } ); }; export default ModerationConsoleTable;