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;