import {Fragment, useMemo} from 'react'; import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator'; import {openAddTempestCredentialsModal} from 'sentry/actionCreators/modal'; import Alert from 'sentry/components/alert'; import {Button} from 'sentry/components/button'; import Form from 'sentry/components/forms/form'; import JsonForm from 'sentry/components/forms/jsonForm'; import List from 'sentry/components/list'; import ListItem from 'sentry/components/list/listItem'; import {PanelTable} from 'sentry/components/panels/panelTable'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {Tooltip} from 'sentry/components/tooltip'; import {t} from 'sentry/locale'; import type {Organization} from 'sentry/types/organization'; import type {Project} from 'sentry/types/project'; import {handleXhrErrorResponse} from 'sentry/utils/handleXhrErrorResponse'; import {useMutation} from 'sentry/utils/queryClient'; import type RequestError from 'sentry/utils/requestError/requestError'; import {hasTempestAccess} from 'sentry/utils/tempest/features'; import useApi from 'sentry/utils/useApi'; import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader'; import {useFetchTempestCredentials} from 'sentry/views/settings/project/tempest/hooks/useFetchTempestCredentials'; import {MessageType} from 'sentry/views/settings/project/tempest/types'; import {useHasTempestWriteAccess} from 'sentry/views/settings/project/tempest/utils/access'; import {CredentialRow} from './CredentialRow'; interface Props { organization: Organization; project: Project; } export default function TempestSettings({organization, project}: Props) { const hasWriteAccess = useHasTempestWriteAccess(); const { data: tempestCredentials, isLoading, invalidateCredentialsCache, } = useFetchTempestCredentials(organization, project); const api = useApi(); const {mutate: handleRemoveCredential, isPending: isRemoving} = useMutation< {}, RequestError, {id: number} >({ mutationFn: ({id}) => api.requestPromise( `/projects/${organization.slug}/${project.slug}/tempest-credentials/${id}/`, { method: 'DELETE', } ), onSuccess: () => { addSuccessMessage(t('Removed the credentials.')); invalidateCredentialsCache(); }, onError: error => { const message = t('Failed to remove the credentials.'); handleXhrErrorResponse(message, error); addErrorMessage(message); }, }); const credentialErrors = useMemo(() => { return tempestCredentials?.filter( credential => credential.messageType === MessageType.ERROR && credential.message ); }, [tempestCredentials]); if (!hasTempestAccess(organization)) { return {t("You don't have access to this feature")}; } return ( {credentialErrors && credentialErrors?.length > 0 && ( {t('There was a problem with following credentials:')} {credentialErrors.map(credential => ( {credential.clientId} - {credential.message} ))} )}
{tempestCredentials?.map(credential => ( ))}
); } const addNewCredentials = ( hasWriteAccess: boolean, organization: Organization, project: Project ) => ( );