Files
sentinel/static/app/views/organizationContainer.tsx
2024-02-15 17:01:50 +00:00

67 lines
2.1 KiB
TypeScript

import styled from '@emotion/styled';
import {Alert} from 'sentry/components/alert';
import LoadingError from 'sentry/components/loadingError';
import LoadingTriangle from 'sentry/components/loadingTriangle';
import {ORGANIZATION_FETCH_ERROR_TYPES} from 'sentry/constants';
import {t} from 'sentry/locale';
import OrganizationStore from 'sentry/stores/organizationStore';
import {useLegacyStore} from 'sentry/stores/useLegacyStore';
import {space} from 'sentry/styles/space';
import {useEnsureOrganization} from './organizationContext';
interface Props {
children: JSX.Element;
}
/**
* Ensures the current organization is loaded. A loading indicator will be
* rendered while loading the organization.
*/
function OrganizationContainer({children}: Props) {
const {loading, error, errorType} = useLegacyStore(OrganizationStore);
useEnsureOrganization();
if (loading) {
return <LoadingTriangle>{t('Loading data for your organization.')}</LoadingTriangle>;
}
// XXX(epurkhiser): There is a special case scenarion when we're unable to
// load an organization due to access issues. Right now this is VERY SPECIFIC
// to being able to enable 2FA
//
// In this scenario we render the children **explicitly without an
// organization in context**.
//
// TODO(epurkhiser): This scenario desprately should be improved
if (error && errorType === ORGANIZATION_FETCH_ERROR_TYPES.ORG_NO_ACCESS) {
return children;
}
if (error) {
const errorBody =
errorType === ORGANIZATION_FETCH_ERROR_TYPES.ORG_NO_ACCESS ? (
<Alert type="error" data-test-id="org-access-error">
{t('You do not have access to this organization.')}
</Alert>
) : errorType === ORGANIZATION_FETCH_ERROR_TYPES.ORG_NOT_FOUND ? (
<Alert type="error" data-test-id="org-loading-error">
{t('The organization you were looking for was not found.')}
</Alert>
) : (
<LoadingError />
);
return <ErrorWrapper>{errorBody}</ErrorWrapper>;
}
return children;
}
const ErrorWrapper = styled('div')`
padding: ${space(3)};
`;
export default OrganizationContainer;