import type { DeviceManagementPopulatedSession, DeviceManagementSession, Serialized } from '@rocket.chat/core-typings'; import { useDebouncedValue, useMediaQuery } from '@rocket.chat/fuselage-hooks'; import { GenericTableHeaderCell, usePagination, useSort } from '@rocket.chat/ui-client'; import { useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; import { useState, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import DeviceManagementAdminRow from './DeviceManagementAdminRow'; import FilterByText from '../../../../components/FilterByText'; import DeviceManagementTable from '../../../../components/deviceManagement/DeviceManagementTable'; import { deviceManagementQueryKeys } from '../../../../lib/queryKeys'; const sortMapping = { client: 'device.name', username: '_user.username', os: 'device.os.name', loginAt: 'loginAt', }; const isSessionPopulatedSession = ( session: Serialized, ): session is Serialized => '_user' in session; const DeviceManagementAdminTable = () => { const { t } = useTranslation(); const [text, setText] = useState(''); const { current, itemsPerPage, setCurrent, setItemsPerPage, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'client' | 'os' | 'username' | 'loginAt'>('username'); const query = useDebouncedValue( useMemo( () => ({ filter: text, sort: JSON.stringify({ [sortMapping[sortBy]]: sortDirection === 'asc' ? 1 : -1 }), count: itemsPerPage, offset: text ? undefined : current, }), [text, itemsPerPage, current, sortBy, sortDirection], ), 500, ); const listAllSessions = useEndpoint('GET', '/v1/sessions/list.all'); const queryResult = useQuery({ queryKey: deviceManagementQueryKeys.sessions(query), queryFn: () => listAllSessions(query), }); const mediaQuery = useMediaQuery('(min-width: 1024px)'); const headers = useMemo( () => [ {t('Client')} , {t('Version')}, {t('OS')} , {t('User')} , mediaQuery && ( {t('Last_login')} ), mediaQuery && {t('Device_ID')}, mediaQuery && {t('IP_Address')}, , ], [t, mediaQuery, setSort, sortDirection, sortBy], ); return ( <> setText(event.target.value)} /> ( )} current={current} itemsPerPage={itemsPerPage} setCurrent={setCurrent} setItemsPerPage={setItemsPerPage} paginationProps={paginationProps} /> ); }; export default DeviceManagementAdminTable;