import { addErrorMessage, addLoadingMessage, addSuccessMessage, } from 'sentry/actionCreators/indicator'; import AlertLink from 'sentry/components/alertLink'; import Button from 'sentry/components/button'; import ExternalLink from 'sentry/components/links/externalLink'; import {Panel, PanelBody, PanelHeader} from 'sentry/components/panels'; import {t, tct} from 'sentry/locale'; import {InternalAppApiToken, Organization} from 'sentry/types'; import withOrganization from 'sentry/utils/withOrganization'; import AsyncView from 'sentry/views/asyncView'; import ApiTokenRow from 'sentry/views/settings/account/apiTokenRow'; import EmptyMessage from 'sentry/views/settings/components/emptyMessage'; import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader'; import TextBlock from 'sentry/views/settings/components/text/textBlock'; type Props = { organization: Organization; } & AsyncView['props']; type State = { tokenList: InternalAppApiToken[] | null; } & AsyncView['state']; export class ApiTokens extends AsyncView { getTitle() { return t('API Tokens'); } getDefaultState() { return { ...super.getDefaultState(), tokenList: [], }; } getEndpoints(): ReturnType { return [['tokenList', '/api-tokens/']]; } handleRemoveToken = (token: InternalAppApiToken) => { addLoadingMessage(); const oldTokenList = this.state.tokenList; this.setState( state => ({ tokenList: state.tokenList?.filter(tk => tk.token !== token.token) ?? [], }), async () => { try { await this.api.requestPromise('/api-tokens/', { method: 'DELETE', data: {token: token.token}, }); addSuccessMessage(t('Removed token')); } catch (_err) { addErrorMessage(t('Unable to remove token. Please try again.')); this.setState({ tokenList: oldTokenList, }); } } ); }; renderBody() { const {organization} = this.props; const {tokenList} = this.state; const isEmpty = !Array.isArray(tokenList) || tokenList.length === 0; const action = ( ); return (
{t( "Auth Tokens are tied to the logged in user, meaning they'll stop working if the user leaves the organization! We suggest using internal integrations to create/manage tokens tied to the organization instead." )} {t( "Authentication tokens allow you to perform actions against the Sentry API on behalf of your account. They're the easiest way to get started using the API." )} {tct( 'For more information on how to use the web API, see our [link:documentation].', { link: , } )} {t('Auth Token')} {isEmpty && ( {t("You haven't created any authentication tokens yet.")} )} {tokenList?.map(token => ( ))}
); } } export default withOrganization(ApiTokens);