import { Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue, useStableCallback } from '@rocket.chat/fuselage-hooks'; import { GenericTable, GenericTableHeaderCell, GenericTableHeader, GenericTableLoadingRow, GenericTableBody, GenericTableRow, GenericTableCell, usePagination, useSort, } from '@rocket.chat/ui-client'; import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; import { useQuery, hashKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import { useMemo, useState, useEffect } from 'react'; import RemoveSlaButton from './RemoveSlaButton'; import FilterByText from '../../../components/FilterByText'; import GenericNoResults from '../../../components/GenericNoResults/GenericNoResults'; import { links } from '../../../lib/links'; const SlaTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const t = useTranslation(); const router = useRouter(); const [filter, setFilter] = useState(''); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'name' | 'description' | 'dueTimeInMinutes'>('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 getSlaData = useEndpoint('GET', '/v1/livechat/sla'); const { data, isSuccess, isLoading, refetch } = useQuery({ queryKey: ['/v1/livechat/sla', query], queryFn: () => getSlaData(query), }); const [defaultQuery] = useState(hashKey([query])); const queryHasChanged = defaultQuery !== hashKey([query]); useEffect(() => { reload.current = refetch; }, [reload, refetch]); const handleAddNew = useStableCallback(() => router.navigate('/omnichannel/sla-policies/new')); const onRowClick = useStableCallback((id: string) => () => router.navigate(`/omnichannel/sla-policies/edit/${id}`)); const headers = ( <> {t('Name')} {t('Description')} {t('Estimated_wait_time')} {t('Remove')} ); return ( <> {((isSuccess && data?.sla.length > 0) || queryHasChanged) && ( setFilter(event.target.value)} /> )} {isLoading && ( {headers} )} {isSuccess && data?.sla.length === 0 && queryHasChanged && } {isSuccess && data?.sla.length === 0 && !queryHasChanged && ( )} {isSuccess && data?.sla.length > 0 && ( <> {headers} {data?.sla.map(({ _id, name, description, dueTimeInMinutes }) => ( {name} {description} {dueTimeInMinutes} {t('minutes')} ))} )} ); }; export default SlaTable;