import { Box, Pagination, States, StatesAction, StatesActions, StatesIcon, StatesSubtitle, StatesTitle } from '@rocket.chat/fuselage'; import { GenericModal, GenericTable, GenericTableHeader, GenericTableBody, GenericTableLoadingTable, GenericTableHeaderCell, usePagination, } from '@rocket.chat/ui-client'; import { useSetModal, useToastMessageDispatch, useUserId, useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery, useQueryClient } from '@tanstack/react-query'; import { useMemo, useCallback } from 'react'; import { Trans, useTranslation } from 'react-i18next'; import AccountTokensRow from './AccountTokensRow'; import AddToken from './AddToken'; import GenericNoResults from '../../../../components/GenericNoResults'; import { useResizeInlineBreakpoint } from '../../../../hooks/useResizeInlineBreakpoint'; import { miscQueryKeys } from '../../../../lib/queryKeys'; const AccountTokensTable = () => { const { t } = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const setModal = useSetModal(); const userId = useUserId(); const regenerateToken = useEndpoint('POST', '/v1/users.regeneratePersonalAccessToken'); const removeToken = useEndpoint('POST', '/v1/users.removePersonalAccessToken'); const getPersonalAccessTokens = useEndpoint('GET', '/v1/users.getPersonalAccessTokens'); const { isPending, isSuccess, data, isError, error } = useQuery({ queryKey: miscQueryKeys.personalAccessTokens, queryFn: () => getPersonalAccessTokens(), }); const queryClient = useQueryClient(); const [ref, isMedium] = useResizeInlineBreakpoint([600], 200); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const filteredTokens = useMemo(() => { if (!data?.tokens) { return null; } const sliceStart = current > data?.tokens.length ? data?.tokens.length - itemsPerPage : current; return data?.tokens.slice(sliceStart, sliceStart + itemsPerPage); }, [current, data?.tokens, itemsPerPage]); const closeModal = useCallback(() => setModal(null), [setModal]); const headers = useMemo( () => [ {t('API_Personal_Access_Token_Name')}, isMedium && {t('Created_at')}, {t('Last_token_part')}, {t('Two Factor Authentication')}, , ].filter(Boolean), [isMedium, t], ); const handleRegenerate = useCallback( (name: string) => { const onConfirm: () => Promise = async () => { try { setModal(null); const { token } = await regenerateToken({ tokenName: name }); setModal( , ); queryClient.invalidateQueries({ queryKey: miscQueryKeys.personalAccessTokens }); } catch (error) { setModal(null); dispatchToastMessage({ type: 'error', message: error }); } }; setModal( {t('API_Personal_Access_Tokens_Regenerate_Modal')} , ); }, [closeModal, dispatchToastMessage, queryClient, regenerateToken, setModal, t, userId], ); const handleRemove = useCallback( (name: string) => { const onConfirm: () => Promise = async () => { try { await removeToken({ tokenName: name }); dispatchToastMessage({ type: 'success', message: t('Token_has_been_removed') }); queryClient.invalidateQueries({ queryKey: miscQueryKeys.personalAccessTokens }); closeModal(); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } }; setModal( {t('API_Personal_Access_Tokens_Remove_Modal')} , ); }, [closeModal, dispatchToastMessage, queryClient, removeToken, setModal, t], ); if (isError) { return ( {t('Something_went_wrong')} {t('We_Could_not_retrive_any_data')} {error?.message} queryClient.invalidateQueries({ queryKey: miscQueryKeys.personalAccessTokens })}> {t('Retry')} ); } return ( <> queryClient.invalidateQueries({ queryKey: miscQueryKeys.personalAccessTokens })} /> {isPending && ( {headers} )} {filteredTokens && filteredTokens?.length > 0 && isSuccess && ( <> {headers} {isSuccess && filteredTokens && filteredTokens.map((filteredToken) => ( ))} )} {isSuccess && filteredTokens?.length === 0 && } ); }; export default AccountTokensTable;