import { Box, Icon, Table, Tag, TextInput } from '@rocket.chat/fuselage';
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
import React, { useCallback, useState, useEffect, memo, useContext, useMemo } from 'react';
import AppAvatar from '../../components/basic/avatar/AppAvatar';
import GenericTable from '../../components/GenericTable';
import { useRoute } from '../../contexts/RouterContext';
import { useTranslation } from '../../contexts/TranslationContext';
import { useResizeInlineBreakpoint } from '../../hooks/useResizeInlineBreakpoint';
import { useFilteredApps } from './hooks/useFilteredApps';
import AppMenu from './AppMenu';
import AppStatus from './AppStatus';
import { AppDataContext } from './AppProvider';
const FilterByText = 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 AppRow = memo(function AppRow({
medium,
...props
}) {
const {
author: { name: authorName },
name,
id,
description,
categories,
iconFileData,
marketplaceVersion,
iconFileContent,
installed,
} = props;
const t = useTranslation();
const [isFocused, setFocused] = useState(false);
const [isHovered, setHovered] = useState(false);
const isStatusVisible = isFocused || isHovered;
const appsRoute = useRoute('admin-apps');
const handleClick = () => {
appsRoute.push({
context: 'details',
version: marketplaceVersion,
id,
});
};
const handleKeyDown = (e) => {
if (!['Enter', 'Space'].includes(e.nativeEvent.code)) {
return;
}
handleClick();
};
const preventClickPropagation = (e) => {
e.stopPropagation();
};
return
setFocused(true)}
onBlur={() => setFocused(false)}
onMouseEnter={() => setHovered(true)}
onMouseLeave={() => setHovered(false)}
>
{name}
{`${ t('By') } ${ authorName }`}
{medium &&
{description}
{categories &&
{categories.map((current) => {current})}
}
}
{installed && }
;
});
function AppsTable() {
const t = useTranslation();
const [ref, onMediumBreakpoint] = useResizeInlineBreakpoint([600], 200);
const [params, setParams] = useState(() => ({ text: '', current: 0, itemsPerPage: 25 }));
const [sort, setSort] = useState(() => ['name', 'asc']);
const { text, current, itemsPerPage } = params;
const { data, dataCache } = useContext(AppDataContext);
const [filteredApps, filteredAppsCount] = useFilteredApps({
text: useDebouncedValue(text, 500),
current,
itemsPerPage,
sort: useDebouncedValue(sort, 200),
data: useMemo(
() => (data.length ? data.filter((current) => current.installed) : null),
[dataCache],
),
dataCache,
});
const [sortBy, sortDirection] = sort;
const handleHeaderCellClick = (id) => {
setSort(
([sortBy, sortDirection]) =>
(sortBy === id
? [id, sortDirection === 'asc' ? 'desc' : 'asc']
: [id, 'asc']),
);
};
return
{t('Name')}
{onMediumBreakpoint &&
{t('Details')}
}
{t('Status')}
>}
results={filteredApps}
total={filteredAppsCount}
params={params}
setParams={setParams}
FilterComponent={FilterByText}
>
{(props) => }
;
}
export default AppsTable;