import { Pagination, Field } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMediaQuery, useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useEndpoint, useToastMessageDispatch, useRoute, useTranslation } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; import type { FC } from 'react'; import React, { useMemo, useState } from 'react'; import FilterByText from '../../../components/FilterByText'; import GenericNoResults from '../../../components/GenericNoResults'; import { GenericTable, GenericTableLoadingTable, GenericTableHeaderCell, GenericTableBody, GenericTableHeader, } from '../../../components/GenericTable'; import { usePagination } from '../../../components/GenericTable/hooks/usePagination'; import { useSort } from '../../../components/GenericTable/hooks/useSort'; import ModerationConsoleTableRow from './ModerationConsoleTableRow'; import DateRangePicker from './helpers/DateRangePicker'; // TODO: Missing error state const ModerationConsoleTable: FC = () => { const [text, setText] = useState(''); const moderationRoute = useRoute('moderation-console'); 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 dispatchToastMessage = useToastMessageDispatch(); const { data, isLoading, isSuccess } = useQuery(['moderation.reports', query], async () => getReports(query), { onError: (error) => { dispatchToastMessage({ type: 'error', message: error }); }, keepPreviousData: true, }); const handleClick = useMutableCallback((id): void => { moderationRoute.push({ context: 'info', id, }); }); // header sequence would be: name, reportedMessage, room, postdate, reports, actions const headers = useMemo( () => [ {t('Name')} , isDesktopOrLarger && ( {t('Username')} ), {t('Moderation_Reported_message')} , {t('Room')} , {t('Moderation_Report_date')} , {t('Moderation_Report_plural')} , , ], [sortDirection, sortBy, setSort, t, isDesktopOrLarger], ); return ( <> setText(text)} /> {t('Date')} {isLoading && ( {headers} {isLoading && } )} {isSuccess && data.reports.length > 0 && ( <> {headers} {data.reports.map((report) => ( ))} )} {isSuccess && data.reports.length === 0 && } ); }; export default ModerationConsoleTable;