diff --git a/components/dashboard/src/projects/NewProject.tsx b/components/dashboard/src/projects/NewProject.tsx index a6e236996ef4e2..8385b96016c13b 100644 --- a/components/dashboard/src/projects/NewProject.tsx +++ b/components/dashboard/src/projects/NewProject.tsx @@ -7,7 +7,7 @@ import { useContext, useEffect, useState } from "react"; import { getGitpodService, gitpodHostUrl } from "../service/service"; import { iconForAuthProvider, openAuthorizeWindow, simplifyProviderName } from "../provider-utils"; -import { AuthProviderInfo, ProviderRepository, Team, User } from "@gitpod/gitpod-protocol"; +import { AuthProviderInfo, ProviderRepository, Team, TeamMemberInfo, User } from "@gitpod/gitpod-protocol"; import { TeamsContext } from "../teams/teams-context"; import { useHistory, useLocation } from "react-router"; import ContextMenu, { ContextMenuEntry } from "../components/ContextMenu"; @@ -65,6 +65,24 @@ export default function NewProject() { } }, []); + const [ teamMembers, setTeamMembers ] = useState>({}); + useEffect(() => { + if (!teams) { + return; + } + (async () => { + const members: Record = {}; + await Promise.all(teams.map(async (team) => { + try { + members[team.id] = await getGitpodService().server.getTeamMembers(team.id); + } catch (error) { + console.error('Could not get members of team', team, error); + } + })); + setTeamMembers(members); + })(); + }, [teams]); + useEffect(() => { if (selectedTeamOrUser && selectedRepo) { createProject(selectedTeamOrUser, selectedRepo); @@ -91,7 +109,7 @@ export default function NewProject() { }, [selectedAccount]); useEffect(() => { - if (!provider || isBitbucket()) { + if (!provider || isBitbucket()) { return; } (async () => { @@ -101,7 +119,7 @@ export default function NewProject() { }, [provider]); const isGitHub = () => provider === "github.com"; - const isBitbucket = () => provider == "bitbucket.org"; + const isBitbucket = () => provider === "bitbucket.org"; const updateReposInAccounts = async (installationId?: string) => { setLoaded(false); @@ -163,7 +181,7 @@ export default function NewProject() { } const createProject = async (teamOrUser: Team | User, selectedRepo: string) => { - if (!provider || isBitbucket()) { + if (!provider || isBitbucket()) { return; } const repo = reposInAccounts.find(r => r.account === selectedAccount && (r.path ? r.path === selectedRepo : r.name === selectedRepo)); @@ -243,6 +261,7 @@ export default function NewProject() { const showSearchInput = !!repoSearchFilter || filteredRepos.length > 0; const renderRepos = () => (<> + {!isBitbucket() &&

Select a Git repository on {provider}. ( setShowGitProviders(true)}>change)

}
@@ -357,39 +376,42 @@ export default function NewProject() { const userFullName = user?.fullName || user?.name || '...'; const teamsToRender = teams || []; return (<> -

Select Team

-

Adding {selectedRepo}

- -
-
-
{userFullName}
-
-
- -
+

Select team or personal account

+
+
+ {teamsToRender.map((t) => ( -
-
{t.name}
-
-
- -
+
+ ))} -
-
setShowNewTeam(!showNewTeam)}> -
New Team
+
- {(showNewTeam || teamsToRender.length === 0) && ( - setSelectedTeamOrUser(t)} /> - )} + {(showNewTeam || teamsToRender.length === 0) && ( + setSelectedTeamOrUser(t)} /> + )} +
) }; @@ -406,15 +428,9 @@ export default function NewProject() {
); } - const renderSelectRepoHeading = () => { - return

Select a Git repository on {provider}. ( setShowGitProviders(true)}>change)

- } - return (

New Project

- {isBitbucket() || renderSelectRepoHeading()} - {!selectedRepo && renderSelectRepository()} {selectedRepo && !selectedTeamOrUser && renderSelectTeam()} @@ -504,7 +520,6 @@ function GitProviders(props: { function NewTeam(props: { onSuccess: (team: Team) => void, - className?: string, }) { const { setTeams } = useContext(TeamsContext); @@ -530,15 +545,13 @@ function NewTeam(props: { setError(undefined); } - return ( -
-
- onTeamNameChanged(e.target.value)} /> - -
- {error &&

{error}

} + return <> +
+ onTeamNameChanged(e.target.value)} /> +
- ) + {error &&

{error}

} + ; } async function openReconfigureWindow(params: { account?: string, onSuccess: (p: any) => void }) {