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;