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 from '../../../components/GenericTable'; import { useTranslation } from '../../../contexts/TranslationContext'; import { useRoute } from '../../../contexts/RouterContext'; import { useFormatDateAndTime } from '../../../hooks/useFormatDateAndTime'; import { useEndpointData } from '../../../hooks/useEndpointData'; 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 }); }, [setFilter, text]); return e.preventDefault(), [])} display='flex' flexDirection='column' {...props}> } onChange={handleChange} value={text} /> ; }); 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 IntegrationRow({ name, _id, type, username, _createdAt, _createdBy: { username: createdBy }, channel = [], onClick, isBig, }) { const formatDateAndTime = useFormatDateAndTime(); const handler = useMemo(() => onClick(_id, type), [onClick, _id, type]); return {name} {channel.join(', ')} {createdBy} {isBig && {formatDateAndTime(_createdAt)}} {username} ; } export 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;