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;