import React, { useEffect } from 'react'; import { defineMessages, FormattedDate, useIntl } from 'react-intl'; import { openModal } from 'soapbox/actions/modals'; import { fetchOAuthTokens, revokeOAuthTokenById } from 'soapbox/actions/security'; import { Button, Card, CardBody, CardHeader, CardTitle, Column, HStack, Spinner, Stack, Text } from 'soapbox/components/ui'; import { useAppDispatch, useAppSelector } from 'soapbox/hooks'; import { Token } from 'soapbox/reducers/security'; const messages = defineMessages({ header: { id: 'security.headers.tokens', defaultMessage: 'Sessions' }, revoke: { id: 'security.tokens.revoke', defaultMessage: 'Revoke' }, revokeSessionHeading: { id: 'confirmations.revoke_session.heading', defaultMessage: 'Revoke current session' }, revokeSessionMessage: { id: 'confirmations.revoke_session.message', defaultMessage: 'You are about to revoke your current session. You will be signed out.' }, revokeSessionConfirm: { id: 'confirmations.revoke_session.confirm', defaultMessage: 'Revoke' }, }); interface IAuthToken { token: Token isCurrent: boolean } const AuthToken: React.FC = ({ token, isCurrent }) => { const dispatch = useAppDispatch(); const intl = useIntl(); const handleRevoke = () => { if (isCurrent) dispatch(openModal('CONFIRM', { icon: require('@tabler/icons/alert-triangle.svg'), heading: intl.formatMessage(messages.revokeSessionHeading), message: intl.formatMessage(messages.revokeSessionMessage), confirm: intl.formatMessage(messages.revokeSessionConfirm), onConfirm: () => { dispatch(revokeOAuthTokenById(token.id)); }, })); else { dispatch(revokeOAuthTokenById(token.id)); } }; return (
{token.app_name} {token.valid_until && ( )}
); }; const AuthTokenList: React.FC = () => { const dispatch = useAppDispatch(); const intl = useIntl(); const tokens = useAppSelector(state => state.security.get('tokens').reverse()); const currentTokenId = useAppSelector(state => { const currentToken = state.auth.tokens.valueSeq().find((token) => token.me === state.auth.me); return currentToken?.id; }); useEffect(() => { dispatch(fetchOAuthTokens()); }, []); const body = tokens ? (
{tokens.map((token) => ( ))}
) : ; return ( {body} ); }; export default AuthTokenList;