import {useState} from 'react'; import {addErrorMessage} from 'sentry/actionCreators/indicator'; import ApiForm from 'sentry/components/forms/apiForm'; import CheckboxField from 'sentry/components/forms/fields/checkboxField'; import SelectField from 'sentry/components/forms/fields/selectField'; import TextField from 'sentry/components/forms/fields/textField'; import NarrowLayout from 'sentry/components/narrowLayout'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {t, tct} from 'sentry/locale'; import ConfigStore from 'sentry/stores/configStore'; import {OrganizationSummary} from 'sentry/types'; import {normalizeUrl} from 'sentry/utils/withDomainRequired'; enum RegionDisplayName { US = 'πŸ‡ΊπŸ‡Έ United States of America (US)', DE = 'πŸ‡ͺπŸ‡Ί European Union (EU)', } function getRegionChoices(): [string, string][] { const regions = ConfigStore.get('regions') ?? []; return regions.map(({name, url}) => { const regionName = name.toUpperCase(); if (RegionDisplayName[regionName]) { return [url, RegionDisplayName[regionName]]; } return [url, name]; }); } function getDefaultRegionChoice( regionChoices: [string, string][] ): [string, string] | undefined { if (!shouldDisplayRegions()) { return undefined; } const usRegion = regionChoices.find( ([_, regionName]) => regionName === RegionDisplayName.US ); if (usRegion) { return usRegion; } return regionChoices[0]; } function shouldDisplayRegions(): boolean { const regionCount = (ConfigStore.get('regions') ?? []).length; return ( ConfigStore.get('features').has('organizations:multi-region-selector') && regionCount > 1 ); } function removeRegionFromRequestForm(formData: Record) { const shallowFormDataCopy = {...formData}; delete shallowFormDataCopy.region; return shallowFormDataCopy; } function OrganizationCreate() { const termsUrl = ConfigStore.get('termsUrl'); const privacyUrl = ConfigStore.get('privacyUrl'); const regionChoices = getRegionChoices(); const [regionUrl, setRegion] = useState( getDefaultRegionChoice(regionChoices)?.[0] ); return (

{t('Create a New Organization')}

{t( "Organizations represent the top level in your hierarchy. You'll be able to bundle a collection of teams within an organization as well as give organization-wide permissions to users." )}

{ const hasCustomerDomain = createdOrg?.features.includes('customer-domains'); let nextUrl = normalizeUrl( `/organizations/${createdOrg.slug}/projects/new/`, {forceCustomerDomain: hasCustomerDomain} ); if (hasCustomerDomain) { nextUrl = `${createdOrg.links.organizationUrl}${nextUrl}`; } // redirect to project creation *(BYPASS REACT ROUTER AND FORCE PAGE REFRESH TO GRAB CSRF TOKEN)* // browserHistory.pushState(null, `/organizations/${data.slug}/projects/new/`); window.location.assign(nextUrl); }} onSubmitError={error => { addErrorMessage( error.responseJSON?.detail ?? t('Unable to create organization.') ); }} requireChanges > {shouldDisplayRegions() && ( )} {termsUrl && privacyUrl && ( , privacyLink: , } )} inline={false} stacked required /> )}
); } export default OrganizationCreate;