import { Pagination, States, StatesIcon, StatesTitle, StatesActions, StatesAction } from '@rocket.chat/fuselage'; import { useMediaQuery, useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import type { OptionProp } from '@rocket.chat/ui-client'; import { GenericTable, GenericTableBody, GenericTableHeader, GenericTableHeaderCell, GenericTableLoadingTable, usePagination, useSort, } from '@rocket.chat/ui-client'; import { useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import { useRef, useState, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import RoomRow from './RoomRow'; import RoomsTableFilters from './RoomsTableFilters'; import GenericNoResults from '../../../components/GenericNoResults'; type RoomFilters = { searchText: string; types: OptionProp[]; }; const DEFAULT_TYPES = ['d', 'p', 'c', 'l', 'discussions', 'teams']; const RoomsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const { t } = useTranslation(); const mediaQuery = useMediaQuery('(min-width: 1024px)'); const [roomFilters, setRoomFilters] = useState({ searchText: '', types: [] }); const prevRoomFilterText = useRef(roomFilters.searchText); const { sortBy, sortDirection, setSort } = useSort<'name' | 't' | 'usersCount' | 'msgs' | 'default' | 'featured' | 'ts'>('name'); const { current, itemsPerPage, setItemsPerPage, setCurrent, ...paginationProps } = usePagination(); const searchText = useDebouncedValue(roomFilters.searchText, 500); const query = useDebouncedValue( useMemo(() => { if (searchText !== prevRoomFilterText.current) { setCurrent(0); } return { filter: searchText || '', sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`, count: itemsPerPage, offset: searchText === prevRoomFilterText.current ? current : 0, types: (roomFilters.types.length ? [...roomFilters.types.map((roomType) => roomType.id)] : DEFAULT_TYPES) as unknown as ( 'c' | 'd' | 'p' | 'l' | 'discussions' | 'teams' )[], }; }, [searchText, sortBy, sortDirection, itemsPerPage, current, roomFilters.types, setCurrent]), 500, ); const getAdminRooms = useEndpoint('GET', '/v1/rooms.adminRooms'); const { data, refetch, isSuccess, isLoading, isError } = useQuery({ queryKey: ['rooms', query, 'admin'], queryFn: async () => getAdminRooms(query), }); useEffect(() => { reload.current = refetch; }, [reload, refetch]); useEffect(() => { prevRoomFilterText.current = searchText; }, [searchText]); const headers = ( <> {t('Name')} {t('Type')} {t('Users')} {mediaQuery && ( <> {t('Msgs')} {t('Default')} {t('Featured')} {t('Created_at')} )} ); return ( <> {isLoading && ( {headers} )} {isSuccess && data.rooms.length === 0 && } {isSuccess && data.rooms.length > 0 && ( <> {headers} {data.rooms?.map((room) => ( ))} )} {isError && ( {t('Something_went_wrong')} refetch()}>{t('Reload_page')} )} ); }; export default RoomsTable;