5
5
*/
6
6
7
7
import { useContext , useEffect , useState } from "react" ;
8
- import { Team } from "@gitpod/gitpod-protocol" ;
8
+ import { Team , TeamMemberInfo } from "@gitpod/gitpod-protocol" ;
9
9
import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution" ;
10
10
import { getGitpodService } from "../service/service" ;
11
11
import { TeamsContext } from "../teams/teams-context" ;
@@ -17,6 +17,7 @@ export function BillingAccountSelector(props: { onSelected?: () => void }) {
17
17
const { user, setUser } = useContext ( UserContext ) ;
18
18
const { teams } = useContext ( TeamsContext ) ;
19
19
const [ teamsWithBillingEnabled , setTeamsWithBillingEnabled ] = useState < Team [ ] | undefined > ( ) ;
20
+ const [ membersByTeam , setMembersByTeam ] = useState < Record < string , TeamMemberInfo [ ] > > ( { } ) ;
20
21
21
22
useEffect ( ( ) => {
22
23
if ( ! teams ) {
@@ -34,6 +35,25 @@ export function BillingAccountSelector(props: { onSelected?: () => void }) {
34
35
) . then ( ( ) => setTeamsWithBillingEnabled ( teamsWithBilling ) ) ;
35
36
} , [ teams ] ) ;
36
37
38
+ useEffect ( ( ) => {
39
+ if ( ! teamsWithBillingEnabled ) {
40
+ return ;
41
+ }
42
+ ( async ( ) => {
43
+ const members : Record < string , TeamMemberInfo [ ] > = { } ;
44
+ await Promise . all (
45
+ teamsWithBillingEnabled . map ( async ( team ) => {
46
+ try {
47
+ members [ team . id ] = await getGitpodService ( ) . server . getTeamMembers ( team . id ) ;
48
+ } catch ( error ) {
49
+ console . error ( "Could not get members of team" , team , error ) ;
50
+ }
51
+ } ) ,
52
+ ) ;
53
+ setMembersByTeam ( members ) ;
54
+ } ) ( ) ;
55
+ } , [ teamsWithBillingEnabled ] ) ;
56
+
37
57
const setUsageAttributionTeam = async ( team ?: Team ) => {
38
58
if ( ! user ) {
39
59
return ;
@@ -63,15 +83,17 @@ export function BillingAccountSelector(props: { onSelected?: () => void }) {
63
83
< p > Bill all my usage to:</ p >
64
84
< div className = "mt-4 flex space-x-3" >
65
85
{ /* <SelectableCardSolid
66
- className="w-36 h-32 "
86
+ className="w-52 h-14 "
67
87
title="(myself)"
68
88
selected={
69
89
!!user &&
70
90
selectedAttributionId === AttributionId.render({ kind: "user", userId: user.id })
71
91
}
72
92
onClick={() => setUsageAttributionTeam(undefined)}
73
93
>
74
- <div className="flex-grow flex items-end p-1"></div>
94
+ <div className="flex-grow flex items-end p-1">
95
+ Personal Account
96
+ </div>
75
97
</SelectableCardSolid> */ }
76
98
{ teamsWithBillingEnabled . length === 0 && (
77
99
< span >
@@ -81,14 +103,20 @@ export function BillingAccountSelector(props: { onSelected?: () => void }) {
81
103
) }
82
104
{ teamsWithBillingEnabled . map ( ( t ) => (
83
105
< SelectableCardSolid
84
- className = "w-36 h-32 "
106
+ className = "w-52 h-14 "
85
107
title = { t . name }
86
108
selected = {
87
109
selectedAttributionId === AttributionId . render ( { kind : "team" , teamId : t . id } )
88
110
}
89
111
onClick = { ( ) => setUsageAttributionTeam ( t ) }
90
112
>
91
- < div className = "flex-grow flex items-end p-1" > </ div >
113
+ < div className = "flex-grow flex items-end p-1" >
114
+ { ! ! membersByTeam [ t . id ]
115
+ ? `${ membersByTeam [ t . id ] . length } member${
116
+ membersByTeam [ t . id ] . length === 1 ? "" : "s"
117
+ } `
118
+ : "..." }
119
+ </ div >
92
120
</ SelectableCardSolid >
93
121
) ) }
94
122
</ div >
0 commit comments