import { Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue, useStableCallback } from '@rocket.chat/fuselage-hooks'; import { GenericTable, GenericTableHeader, GenericTableHeaderCell, GenericTableBody, GenericTableLoadingRow, usePagination, useSort, } from '@rocket.chat/ui-client'; import { useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; import { useQuery, hashKey } from '@tanstack/react-query'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import UnitTableRow from './UnitTableRow'; import FilterByText from '../../../components/FilterByText'; import GenericNoResults from '../../../components/GenericNoResults/GenericNoResults'; import { links } from '../../../lib/links'; const UnitsTable = () => { const { t } = useTranslation(); const [filter, setFilter] = useState(''); const router = useRouter(); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'name' | 'visibility'>('name'); const query = useDebouncedValue( useMemo( () => ({ text: filter, sort: JSON.stringify({ [sortBy]: sortDirection === 'asc' ? 1 : -1 }), ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }), }), [filter, itemsPerPage, current, sortBy, sortDirection], ), 500, ); const getUnits = useEndpoint('GET', '/v1/livechat/units'); const { isSuccess, isLoading, data } = useQuery({ queryKey: ['livechat-units', query], queryFn: async () => getUnits(query), }); const [defaultQuery] = useState(hashKey([query])); const queryHasChanged = defaultQuery !== hashKey([query]); const handleAddNew = useStableCallback(() => router.navigate('/omnichannel/units/new')); const headers = ( <> {t('Name')} {t('Visibility')} ); return ( <> {((isSuccess && data?.units.length > 0) || queryHasChanged) && ( setFilter(event.target.value)} /> )} {isLoading && ( {headers} )} {isSuccess && data.units.length === 0 && queryHasChanged && } {isSuccess && data.units.length === 0 && !queryHasChanged && ( )} {isSuccess && data?.units.length > 0 && ( <> {headers} {data.units.map(({ _id, name, visibility }) => ( ))} )} ); }; export default UnitsTable;