import {useCallback, useState} from 'react'; import {browserHistory} from 'react-router'; import styled from '@emotion/styled'; import { addErrorMessage, addLoadingMessage, addSuccessMessage, } from 'sentry/actionCreators/indicator'; import Alert from 'sentry/components/alert'; import {Button} from 'sentry/components/button'; import {Form, TextField} from 'sentry/components/forms'; import FieldGroup from 'sentry/components/forms/fieldGroup'; import ExternalLink from 'sentry/components/links/externalLink'; import {Panel, PanelBody, PanelHeader, PanelItem} from 'sentry/components/panels'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import TextCopyInput from 'sentry/components/textCopyInput'; import {t, tct} from 'sentry/locale'; import {space} from 'sentry/styles/space'; import {Organization, OrgAuthToken} from 'sentry/types'; import getDynamicText from 'sentry/utils/getDynamicText'; import {handleXhrErrorResponse} from 'sentry/utils/handleXhrErrorResponse'; import {useMutation, useQueryClient} from 'sentry/utils/queryClient'; import RequestError from 'sentry/utils/requestError/requestError'; import useApi from 'sentry/utils/useApi'; import {normalizeUrl} from 'sentry/utils/withDomainRequired'; import withOrganization from 'sentry/utils/withOrganization'; import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader'; import TextBlock from 'sentry/views/settings/components/text/textBlock'; import {makeFetchOrgAuthTokensForOrgQueryKey} from 'sentry/views/settings/organizationAuthTokens'; type CreateTokenQueryVariables = { name: string; }; type OrgAuthTokenWithToken = OrgAuthToken & {token: string}; type CreateOrgAuthTokensResponse = OrgAuthTokenWithToken; function AuthTokenCreateForm({ organization, onCreatedToken, }: { onCreatedToken: (token: OrgAuthTokenWithToken) => void; organization: Organization; }) { const initialData = { name: '', }; const api = useApi(); const queryClient = useQueryClient(); const handleGoBack = useCallback(() => { browserHistory.push(normalizeUrl(`/settings/${organization.slug}/auth-tokens/`)); }, [organization.slug]); const {mutate: submitToken} = useMutation< CreateOrgAuthTokensResponse, RequestError, CreateTokenQueryVariables >({ mutationFn: ({name}) => { addLoadingMessage(); return api.requestPromise(`/organizations/${organization.slug}/org-auth-tokens/`, { method: 'POST', data: { name, }, }); }, onSuccess: (token: OrgAuthTokenWithToken) => { addSuccessMessage(t('Created auth token.')); queryClient.invalidateQueries({ queryKey: makeFetchOrgAuthTokensForOrgQueryKey({orgSlug: organization.slug}), }); onCreatedToken(token); }, onError: error => { const message = t('Failed to create a new auth token.'); handleXhrErrorResponse(message, error); addErrorMessage(message); }, }); return (
); } function ShowNewToken({ token, organization, }: { organization: Organization; token: OrgAuthTokenWithToken; }) { const handleGoBack = useCallback(() => { browserHistory.push(normalizeUrl(`/settings/${organization.slug}/auth-tokens/`)); }, [organization.slug]); return (