7
7
import { useContext , useEffect , useState } from "react" ;
8
8
import { getGitpodService , gitpodHostUrl } from "../service/service" ;
9
9
import { iconForAuthProvider , openAuthorizeWindow , simplifyProviderName } from "../provider-utils" ;
10
- import { AuthProviderInfo , ProviderRepository , Team } from "@gitpod/gitpod-protocol" ;
10
+ import { AuthProviderInfo , ProviderRepository , Team , User } from "@gitpod/gitpod-protocol" ;
11
11
import { TeamsContext } from "../teams/teams-context" ;
12
12
import { useHistory , useLocation } from "react-router" ;
13
13
import ContextMenu , { ContextMenuEntry } from "../components/ContextMenu" ;
@@ -16,13 +16,13 @@ import Plus from "../icons/Plus.svg";
16
16
import Switch from "../icons/Switch.svg" ;
17
17
import search from "../icons/search.svg" ;
18
18
import moment from "moment" ;
19
+ import { UserContext } from "../user-context" ;
19
20
20
21
export default function NewProject ( ) {
21
-
22
22
const location = useLocation ( ) ;
23
23
const history = useHistory ( ) ;
24
-
25
24
const { teams } = useContext ( TeamsContext ) ;
25
+ const { user } = useContext ( UserContext ) ;
26
26
27
27
const [ provider , setProvider ] = useState < string > ( "github.com" ) ;
28
28
const [ reposInAccounts , setReposInAccounts ] = useState < ProviderRepository [ ] > ( [ ] ) ;
@@ -31,7 +31,7 @@ export default function NewProject() {
31
31
const [ noOrgs , setNoOrgs ] = useState < boolean > ( false ) ;
32
32
const [ showGitProviders , setShowGitProviders ] = useState < boolean > ( false ) ;
33
33
const [ selectedRepo , setSelectedRepo ] = useState < string | undefined > ( undefined ) ;
34
- const [ selectedTeam , setSelectedTeam ] = useState < Team | undefined > ( undefined ) ;
34
+ const [ selectedTeamOrUser , setSelectedTeamOrUser ] = useState < Team | User | undefined > ( undefined ) ;
35
35
36
36
const [ showNewTeam , setShowNewTeam ] = useState < boolean > ( false ) ;
37
37
const [ loaded , setLoaded ] = useState < boolean > ( false ) ;
@@ -42,7 +42,7 @@ export default function NewProject() {
42
42
if ( teamParam ) {
43
43
window . history . replaceState ( { } , '' , window . location . pathname ) ;
44
44
const team = teams ?. find ( t => t . slug === teamParam ) ;
45
- setSelectedTeam ( team ) ;
45
+ setSelectedTeamOrUser ( team ) ;
46
46
}
47
47
48
48
( async ( ) => {
@@ -57,10 +57,10 @@ export default function NewProject() {
57
57
} , [ ] ) ;
58
58
59
59
useEffect ( ( ) => {
60
- if ( selectedTeam && selectedRepo ) {
61
- createProject ( selectedTeam , selectedRepo ) ;
60
+ if ( selectedTeamOrUser && selectedRepo ) {
61
+ createProject ( selectedTeamOrUser , selectedRepo ) ;
62
62
}
63
- } , [ selectedRepo , selectedTeam ] ) ;
63
+ } , [ selectedTeamOrUser , selectedRepo ] ) ;
64
64
65
65
useEffect ( ( ) => {
66
66
if ( reposInAccounts . length === 0 ) {
@@ -128,7 +128,7 @@ export default function NewProject() {
128
128
}
129
129
}
130
130
131
- const createProject = async ( team : Team , selectedRepo : string ) => {
131
+ const createProject = async ( teamOrUser : Team | User , selectedRepo : string ) => {
132
132
const repo = reposInAccounts . find ( r => r . account === selectedAccount && r . name === selectedRepo ) ;
133
133
if ( ! repo ) {
134
134
console . error ( "No repo selected!" )
@@ -140,11 +140,11 @@ export default function NewProject() {
140
140
cloneUrl : repo . cloneUrl ,
141
141
account : repo . account ,
142
142
provider,
143
+ ...( User . is ( teamOrUser ) ? { userId : teamOrUser . id } : { teamId : teamOrUser . id } ) ,
143
144
appInstallationId : String ( repo . installationId ) ,
144
- teamId : team . id
145
145
} ) ;
146
146
147
- history . push ( `/${ team . slug } /${ repo . name } /configure` ) ;
147
+ history . push ( `/${ User . is ( teamOrUser ) ? 'projects' : teamOrUser . slug } /${ repo . name } /configure` ) ;
148
148
}
149
149
150
150
const toSimpleName = ( fullName : string ) => {
@@ -279,18 +279,27 @@ export default function NewProject() {
279
279
} ;
280
280
281
281
const renderSelectTeam = ( ) => {
282
+ const userFullName = user ?. fullName || user ?. name || '...' ;
282
283
const teamsToRender = teams || [ ] ;
283
284
return ( < >
284
285
< h3 className = "pb-2 mt-8" > Select Team</ h3 >
285
286
< h4 className = "pb-2" > Adding < strong > { selectedRepo } </ strong > </ h4 >
286
287
287
288
< div className = "mt-8 border rounded-xl border-gray-100 flex-col" >
289
+ < div key = { `user-${ userFullName } ` } className = { `w-96 border-b px-8 py-4 flex space-x-2 justify-between dark:hover:bg-gray-800 focus:bg-gitpod-kumquat-light transition ease-in-out group` } >
290
+ < div className = "w-8/12 m-auto overflow-ellipsis truncate" > { userFullName } </ div >
291
+ < div className = "w-4/12 flex justify-end" >
292
+ < div className = "flex self-center hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md cursor-pointer opacity-0 group-hover:opacity-100" >
293
+ < button className = "primary py-1" onClick = { ( ) => setSelectedTeamOrUser ( user ) } > Select</ button >
294
+ </ div >
295
+ </ div >
296
+ </ div >
288
297
{ teamsToRender . map ( ( t ) => (
289
298
< div key = { `team-${ t . name } ` } className = { `w-96 border-b px-8 py-4 flex space-x-2 justify-between dark:hover:bg-gray-800 focus:bg-gitpod-kumquat-light transition ease-in-out group` } >
290
299
< div className = "w-8/12 m-auto overflow-ellipsis truncate" > { t . name } </ div >
291
300
< div className = "w-4/12 flex justify-end" >
292
301
< div className = "flex self-center hover:bg-gray-200 dark:hover:bg-gray-700 rounded-md cursor-pointer opacity-0 group-hover:opacity-100" >
293
- < button className = "primary py-1" onClick = { ( ) => setSelectedTeam ( t ) } > Select</ button >
302
+ < button className = "primary py-1" onClick = { ( ) => setSelectedTeamOrUser ( t ) } > Select</ button >
294
303
</ div >
295
304
</ div >
296
305
</ div >
@@ -304,7 +313,7 @@ export default function NewProject() {
304
313
</ div >
305
314
</ div >
306
315
{ ( showNewTeam || teamsToRender . length === 0 ) && (
307
- < NewTeam className = "w-96 px-8 pb-8" onSuccess = { ( t ) => setSelectedTeam ( t ) } />
316
+ < NewTeam className = "w-96 px-8 pb-8" onSuccess = { ( t ) => setSelectedTeamOrUser ( t ) } />
308
317
) }
309
318
</ div >
310
319
</ > )
@@ -316,9 +325,9 @@ export default function NewProject() {
316
325
317
326
{ ! selectedRepo && renderSelectRepository ( ) }
318
327
319
- { selectedRepo && ! selectedTeam && renderSelectTeam ( ) }
328
+ { selectedRepo && ! selectedTeamOrUser && renderSelectTeam ( ) }
320
329
321
- { selectedRepo && selectedTeam && ( < div > </ div > ) }
330
+ { selectedRepo && selectedTeamOrUser && ( < div > </ div > ) }
322
331
323
332
</ div > ) ;
324
333
0 commit comments