import { Box, Table, TextInput, Icon } from '@rocket.chat/fuselage';
import { useDebouncedValue, useResizeObserver } from '@rocket.chat/fuselage-hooks';
import React, { useMemo, useCallback, useState, useEffect } from 'react';
import { GenericTable, Th } from '../../components/GenericTable';
import { useTranslation } from '../../contexts/TranslationContext';
import { useRoute } from '../../contexts/RouterContext';
import { useEndpointDataExperimental } from '../../hooks/useEndpointDataExperimental';
import { useFormatDateAndTime } from '../../hooks/useFormatDateAndTime';
const style = { whiteSpace: 'nowrap', textOverflow: 'ellipsis', overflow: 'hidden' };
const FilterByTypeAndText = React.memo(({ setFilter, ...props }) => {
const t = useTranslation();
const [text, setText] = useState('');
const handleChange = useCallback((event) => setText(event.currentTarget.value), []);
useEffect(() => {
setFilter({ text });
}, [text]);
return e.preventDefault(), [])} display='flex' flexDirection='column' {...props}>
} onChange={handleChange} value={text} />
;
});
const useQuery = (params, sort) => useMemo(() => ({
query: JSON.stringify({ name: { $regex: params.text || '', $options: 'i' }, type: params.type }),
sort: JSON.stringify({ [sort[0]]: sort[1] === 'asc' ? 1 : -1 }),
...params.itemsPerPage && { count: params.itemsPerPage },
...params.current && { offset: params.current },
}), [JSON.stringify(params), JSON.stringify(sort)]);
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]);
return [ref, ...sizes];
};
export function IntegrationsTable({ type }) {
const t = useTranslation();
const formatDateAndTime = useFormatDateAndTime();
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 { data } = useEndpointDataExperimental('integrations.list', query);
const router = useRoute('admin-integrations');
const onClick = (_id, type) => () => router.push({
context: 'edit',
type: type === 'webhook-incoming' ? 'incoming' : 'outgoing',
id: _id,
});
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, isBig]);
const renderRow = useCallback(({ name, _id, type, username, _createdAt, _createdBy: { username: createdBy }, channel = [] }) => {
const handler = useMemo(() => onClick(_id, type), []);
return
{name}
{channel.join(', ')}
{createdBy}
{isBig && {formatDateAndTime(_createdAt)}}
{username}
;
}, []);
return ;
}
export default IntegrationsTable;