import type { ILivechatDepartment } from '@rocket.chat/core-typings';
import { Pagination } from '@rocket.chat/fuselage';
import { useDebouncedValue, useStableCallback } from '@rocket.chat/fuselage-hooks';
import {
GenericTable,
GenericTableBody,
GenericTableCell,
GenericTableHeader,
GenericTableHeaderCell,
GenericTableLoadingTable,
GenericTableRow,
usePagination,
useSort,
} from '@rocket.chat/ui-client';
import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts';
import { useQuery, hashKey, keepPreviousData } from '@tanstack/react-query';
import { useState, useMemo } from 'react';
import DepartmentItemMenu from './DepartmentItemMenu';
import FilterByText from '../../../../components/FilterByText';
import GenericNoResults from '../../../../components/GenericNoResults/GenericNoResults';
import { links } from '../../../../lib/links';
const DEPARTMENTS_ENDPOINTS = {
department: '/v1/livechat/department',
archived: '/v1/livechat/departments/archived',
} as const;
export type DepartmentsTableProps = { archived: boolean };
const DepartmentsTable = ({ archived }: DepartmentsTableProps) => {
const t = useTranslation();
const router = useRouter();
const [text, setText] = useState('');
const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination();
const { sortBy, sortDirection, setSort } = useSort<'name' | 'description' | 'numAgents' | 'enabled' | 'showOnRegistration'>('name');
const getDepartments = useEndpoint('GET', archived ? DEPARTMENTS_ENDPOINTS.archived : DEPARTMENTS_ENDPOINTS.department);
const handleAddNew = useStableCallback(() => router.navigate('/omnichannel/departments/new'));
const query = useDebouncedValue(
useMemo(
() => ({
onlyMyDepartments: 'true' as const,
text,
sort: JSON.stringify({ [sortBy]: sortDirection === 'asc' ? 1 : -1 }),
...(current && { offset: current }),
...(itemsPerPage && { count: itemsPerPage }),
}),
[current, itemsPerPage, sortBy, sortDirection, text],
),
500,
);
const { data, isSuccess, isLoading } = useQuery({
queryKey: ['livechat-departments', query, archived],
queryFn: async () => getDepartments(query),
placeholderData: keepPreviousData,
});
const [defaultQuery] = useState(hashKey([query]));
const queryHasChanged = defaultQuery !== hashKey([query]);
const headers = (
<>
{t('Name')}
{t('Description')}
{t('Num_Agents')}
{t('Enabled')}
{t('Show_on_registration_page')}
>
);
return (
<>
{((isSuccess && data?.departments.length > 0) || queryHasChanged) && (
setText(event.target.value)} />
)}
{isLoading && (
{headers}
)}
{isSuccess && data?.departments.length === 0 && (queryHasChanged || archived) && }
{isSuccess && data?.departments.length === 0 && !queryHasChanged && !archived && (
)}
{isSuccess && data?.departments.length > 0 && (
<>
{headers}
{data.departments.map((department: Omit) => (
{department.name}
{department.description}
{department.numAgents || '0'}
{department.enabled ? t('Yes') : t('No')}
{department.showOnRegistration ? t('Yes') : t('No')}
))}
>
)}
>
);
};
export default DepartmentsTable;