import {cloneElement, isValidElement, useState} from 'react'; import styled from '@emotion/styled'; import {addErrorMessage, addSuccessMessage} from 'sentry/actionCreators/indicator'; import {joinTeam} from 'sentry/actionCreators/teams'; import {Alert} from 'sentry/components/alert'; import {Button} from 'sentry/components/button'; import IdBadge from 'sentry/components/idBadge'; import ListLink from 'sentry/components/links/listLink'; import LoadingIndicator from 'sentry/components/loadingIndicator'; import NavTabs from 'sentry/components/navTabs'; import SentryDocumentTitle from 'sentry/components/sentryDocumentTitle'; import {t, tct} from 'sentry/locale'; import type {RouteComponentProps} from 'sentry/types/legacyReactRouter'; import useApi from 'sentry/utils/useApi'; import useOrganization from 'sentry/utils/useOrganization'; import {useParams} from 'sentry/utils/useParams'; import {useTeamsById} from 'sentry/utils/useTeamsById'; type Props = { children: React.ReactNode; } & RouteComponentProps<{teamId: string}, {}>; function TeamDetails({children}: Props) { const api = useApi(); const params = useParams(); const orgSlug = useOrganization().slug; const [requesting, setRequesting] = useState(false); const {teams, isLoading, isError} = useTeamsById({slugs: [params.teamId]}); const team = teams.find(({slug}) => slug === params.teamId); function handleRequestAccess(teamSlug: string) { setRequesting(true); joinTeam( api, { orgId: orgSlug, teamId: teamSlug, }, { success: () => { addSuccessMessage( tct('You have requested access to [team]', { team: `#${teamSlug}`, }) ); setRequesting(false); }, error: () => { addErrorMessage( tct('Unable to request access to [team]', { team: `#${teamSlug}`, }) ); setRequesting(false); }, } ); } const routePrefix = `/settings/${orgSlug}/teams/${params.teamId}/`; const navigationTabs = [ {t('Members')} , {t('Projects')} , {t('Notifications')} , {t('Settings')} , ]; if (isLoading) { return ; } if (!team || isError) { return (
{t('This team does not exist, or you do not have access to it.')}
); } return (
{team.hasAccess ? (

{navigationTabs} {isValidElement(children) ? cloneElement(children, {team}) : null}
) : (
{tct('You do not have access to the [teamSlug] team.', { teamSlug: {`#${team.slug}`}, })}
)}
); } export default TeamDetails; const RequestAccessWrapper = styled('div')` display: flex; justify-content: space-between; align-items: center; `;