import {RouteComponentProps} from 'react-router'; import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator'; import Form from 'sentry/components/forms/form'; import SelectField from 'sentry/components/forms/selectField'; import NarrowLayout from 'sentry/components/narrowLayout'; import {t, tct} from 'sentry/locale'; import {Organization, Project} from 'sentry/types'; import AsyncView from 'sentry/views/asyncView'; import SettingsPageHeader from 'sentry/views/settings/components/settingsPageHeader'; type Props = RouteComponentProps<{}, {}>; type TransferDetails = { organizations: Organization[]; project: Project; }; type State = { transferDetails: TransferDetails | null; } & AsyncView['state']; class AcceptProjectTransfer extends AsyncView { disableErrorReport = false; getEndpoints(): ReturnType { const query = this.props.location.query; return [['transferDetails', '/accept-transfer/', {query}]]; } getTitle() { return t('Accept Project Transfer'); } handleSubmit = formData => { this.api.request('/accept-transfer/', { method: 'POST', data: { data: this.props.location.query.data, organization: formData.organization, }, success: () => { const orgSlug = formData.organization; this.props.router.push(`/${orgSlug}`); addSuccessMessage(t('Project successfully transferred')); }, error: error => { const errorMsg = error && error.responseJSON && typeof error.responseJSON.detail === 'string' ? error.responseJSON.detail : ''; addErrorMessage( t('Unable to transfer project') + errorMsg ? `: ${errorMsg}` : '' ); }, }); }; renderError(error) { let disableLog = false; // Check if there is an error message with `transferDetails` endpoint // If so, show as toast and ignore, otherwise log to sentry if (error && error.responseJSON && typeof error.responseJSON.detail === 'string') { addErrorMessage(error.responseJSON.detail); disableLog = true; } return super.renderError(error, disableLog); } renderBody() { const {transferDetails} = this.state; const options = transferDetails?.organizations.map(org => ({ label: org.slug, value: org.slug, })); const organization = options?.[0]?.value; return (

{tct( 'Projects must be transferred to a specific [organization]. ' + 'You can grant specific teams access to the project later under the [projectSettings]. ' + '(Note that granting access to at least one team is necessary for the project to ' + 'appear in all parts of the UI.)', { organization: {t('Organization')}, projectSettings: {t('Project Settings')}, } )}

{transferDetails && (

{tct( 'Please select which [organization] you want for the project [project].', { organization: {t('Organization')}, project: transferDetails.project.slug, } )}

)}
); } } export default AcceptProjectTransfer;