import { useDebouncedValue, useResizeObserver } from '@rocket.chat/fuselage-hooks'; import React, { useMemo, useCallback, useState } from 'react'; import GenericTable from '../../../components/GenericTable'; import { useRoute } from '../../../contexts/RouterContext'; import { useTranslation } from '../../../contexts/TranslationContext'; import { useEndpointData } from '../../../hooks/useEndpointData'; import FilterByTypeAndText from './FilterByTypeAndText'; import IntegrationRow from './IntegrationRow'; const useQuery = ({ text, type, itemsPerPage, current }, [column, direction]) => useMemo( () => ({ query: JSON.stringify({ name: { $regex: text || '', $options: 'i' }, type }), sort: JSON.stringify({ [column]: direction === 'asc' ? 1 : -1 }), ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }), }), [column, current, direction, itemsPerPage, text, type], ); const useResizeInlineBreakpoint = (sizes = [], debounceDelay = 0) => { const { ref, borderBoxSize } = useResizeObserver({ debounceDelay }); const inlineSize = borderBoxSize ? borderBoxSize.inlineSize : 0; sizes = useMemo(() => sizes.map((current) => (inlineSize ? inlineSize > current : true)), [inlineSize, sizes]); return [ref, ...sizes]; }; function IntegrationsTable({ type }) { const t = useTranslation(); const [ref, isBig] = useResizeInlineBreakpoint([700], 200); const [params, setParams] = useState({ text: '', current: 0, itemsPerPage: 25 }); const [sort, setSort] = useState(['name', 'asc']); const debouncedText = useDebouncedValue(params.text, 500); const debouncedSort = useDebouncedValue(sort, 500); const query = useQuery({ ...params, text: debouncedText, type }, debouncedSort); const { value: data } = useEndpointData('integrations.list', query); const router = useRoute('admin-integrations'); const onClick = useCallback( (_id, type) => () => router.push({ context: 'edit', type: type === 'webhook-incoming' ? 'incoming' : 'outgoing', id: _id, }), [router], ); const onHeaderClick = useCallback( (id) => { const [sortBy, sortDirection] = sort; if (sortBy === id) { setSort([id, sortDirection === 'asc' ? 'desc' : 'asc']); return; } setSort([id, 'asc']); }, [sort], ); const header = useMemo( () => [ {t('Name')} , {t('Post_to')} , {t('Created_by')} , isBig && ( {t('Created_at')} ), {t('Post_as')} , ].filter(Boolean), [sort, onHeaderClick, isBig, t], ); const renderRow = useCallback((props) => , [isBig, onClick]); return ( } /> ); } export default IntegrationsTable;