import {Component} from 'react'; import {Client} from 'sentry/api'; import ConfigStore from 'sentry/stores/configStore'; import {Organization, Project, Team, TeamWithProjects} from 'sentry/types'; import getDisplayName from 'sentry/utils/getDisplayName'; import getProjectsByTeams from 'sentry/utils/getProjectsByTeams'; import {metric} from './analytics'; // We require these props when using this HOC type DependentProps = { api: Client; organization: Organization; }; type InjectedTeamsProps = { error: Error | null; loadingTeams: boolean; teams: TeamWithProjects[]; }; const withTeamsForUser =

( WrappedComponent: React.ComponentType

) => class extends Component< Omit & Partial & DependentProps, InjectedTeamsProps > { static displayName = `withUsersTeams(${getDisplayName(WrappedComponent)})`; state: InjectedTeamsProps = { teams: [], loadingTeams: true, error: null, }; componentDidMount() { this.fetchTeams(); } async fetchTeams() { this.setState({ loadingTeams: true, }); try { metric.mark({name: 'user-teams-fetch-start'}); const teamsWithProjects: TeamWithProjects[] = await this.props.api.requestPromise( this.getUsersTeamsEndpoint() ); this.setState( { teams: teamsWithProjects, loadingTeams: false, }, () => { metric.measure({ name: 'app.component.perf', start: 'user-teams-fetch-start', data: { name: 'user-teams', route: '/organizations/:orgid/user-teams', organization_id: parseInt(this.props.organization.id, 10), }, }); } ); } catch (error) { this.setState({ error, loadingTeams: false, }); } } populateTeamsWithProjects(teams: Team[], projects: Project[]) { const {isSuperuser} = ConfigStore.get('user'); const {projectsByTeam} = getProjectsByTeams(teams, projects, isSuperuser); const teamsWithProjects: TeamWithProjects[] = teams.map(team => { const teamProjects = projectsByTeam[team.slug] || []; return {...team, projects: teamProjects}; }); this.setState({ teams: teamsWithProjects, loadingTeams: false, }); } getUsersTeamsEndpoint() { return `/organizations/${this.props.organization.slug}/user-teams/`; } render() { return ; } }; export default withTeamsForUser;