@@ -13,7 +13,7 @@ import { countries } from "countries-list";
13
13
import gitpodIcon from "./icons/gitpod.svg" ;
14
14
import { getGitpodService , gitpodHostUrl } from "./service/service" ;
15
15
import { UserContext } from "./user-context" ;
16
- import { TeamsContext , getCurrentTeam , getSelectedTeamSlug } from "./teams/teams-context" ;
16
+ import { useCurrentTeam , useTeams } from "./teams/teams-context" ;
17
17
import { getAdminMenu } from "./admin/admin-menu" ;
18
18
import ContextMenu , { ContextMenuEntry } from "./components/ContextMenu" ;
19
19
import Separator from "./components/Separator" ;
@@ -39,9 +39,9 @@ interface Entry {
39
39
export default function Menu ( ) {
40
40
const { user } = useContext ( UserContext ) ;
41
41
const { showUsageView, oidcServiceEnabled } = useContext ( FeatureFlagContext ) ;
42
- const { teams } = useContext ( TeamsContext ) ;
42
+ const teams = useTeams ( ) ;
43
43
const location = useLocation ( ) ;
44
- const team = getCurrentTeam ( location , teams ) ;
44
+ const team = useCurrentTeam ( ) ;
45
45
const { setCurrency, setIsStudent, setIsChargebeeCustomer } = useContext ( PaymentContext ) ;
46
46
const [ teamBillingMode , setTeamBillingMode ] = useState < BillingMode | undefined > ( undefined ) ;
47
47
const [ userBillingMode , setUserBillingMode ] = useState < BillingMode | undefined > ( undefined ) ;
@@ -57,17 +57,12 @@ export default function Menu() {
57
57
getGitpodService ( ) . server . getBillingModeForUser ( ) . then ( setUserBillingMode ) ;
58
58
} , [ ] ) ;
59
59
60
- const teamRouteMatch = useRouteMatch < { segment1 ?: string ; segment2 ?: string ; segment3 ?: string } > (
61
- "/t/:segment1/:segment2?/:segment3?" ,
62
- ) ;
63
-
64
- // TODO: Remove it after remove projects under personal accounts
65
60
const projectsRouteMatch = useRouteMatch < { segment1 ?: string ; segment2 ?: string } > (
66
61
"/projects/:segment1?/:segment2?" ,
67
62
) ;
68
63
69
64
const projectSlug = ( ( ) => {
70
- const resource = teamRouteMatch ?. params ?. segment2 || projectsRouteMatch ?. params . segment1 ;
65
+ const resource = projectsRouteMatch ?. params . segment1 ;
71
66
if (
72
67
resource &&
73
68
! [
@@ -89,7 +84,7 @@ export default function Menu() {
89
84
}
90
85
} ) ( ) ;
91
86
const prebuildId = ( ( ) => {
92
- const resource = projectSlug && ( teamRouteMatch ?. params ?. segment3 || projectsRouteMatch ?. params . segment2 ) ;
87
+ const resource = projectSlug && projectsRouteMatch ?. params . segment2 ;
93
88
if (
94
89
resource &&
95
90
! [
@@ -110,7 +105,7 @@ export default function Menu() {
110
105
}
111
106
112
107
// Hide most of the top menu when in a full-page form.
113
- const isMinimalUI = inResource ( location . pathname , [ "new" , "teams /new" , "open" ] ) ;
108
+ const isMinimalUI = inResource ( location . pathname , [ "new" , "orgs /new" , "open" ] ) ;
114
109
const isWorkspacesUI = inResource ( location . pathname , [ "workspaces" ] ) ;
115
110
const isPersonalSettingsUI = inResource ( location . pathname , [
116
111
"account" ,
@@ -164,8 +159,7 @@ export default function Menu() {
164
159
}
165
160
166
161
// Find project matching with slug, otherwise with name
167
- const project =
168
- projectSlug && projects . find ( ( p ) => ( p . slug ? p . slug === projectSlug : p . name === projectSlug ) ) ;
162
+ const project = projectSlug && projects . find ( ( p ) => Project . slug ( p ) === projectSlug ) ;
169
163
if ( ! project ) {
170
164
return ;
171
165
}
@@ -191,22 +185,21 @@ export default function Menu() {
191
185
}
192
186
} , [ team ] ) ;
193
187
194
- const teamOrUserSlug = ! ! team ? "/t/" + team . slug : "/projects" ;
195
188
const secondLevelMenu : Entry [ ] = ( ( ) => {
196
189
// Project menu
197
190
if ( projectSlug ) {
198
191
return [
199
192
{
200
193
title : "Branches" ,
201
- link : `${ teamOrUserSlug } /${ projectSlug } ` ,
194
+ link : `/projects /${ projectSlug } ` ,
202
195
} ,
203
196
{
204
197
title : "Prebuilds" ,
205
- link : `${ teamOrUserSlug } /${ projectSlug } /prebuilds` ,
198
+ link : `/projects /${ projectSlug } /prebuilds` ,
206
199
} ,
207
200
{
208
201
title : "Settings" ,
209
- link : `${ teamOrUserSlug } /${ projectSlug } /settings` ,
202
+ link : `/projects /${ projectSlug } /settings` ,
210
203
alternatives : getProjectSettingsMenu ( { slug : projectSlug } as Project , team ) . flatMap ( ( e ) => e . link ) ,
211
204
} ,
212
205
] ;
@@ -220,12 +213,12 @@ export default function Menu() {
220
213
const teamSettingsList = [
221
214
{
222
215
title : "Projects" ,
223
- link : `/t/ ${ team . slug } / projects` ,
216
+ link : `/projects` ,
224
217
alternatives : [ ] as string [ ] ,
225
218
} ,
226
219
{
227
220
title : "Members" ,
228
- link : `/t/ ${ team . slug } / members` ,
221
+ link : `/members` ,
229
222
} ,
230
223
] ;
231
224
if (
@@ -234,13 +227,13 @@ export default function Menu() {
234
227
) {
235
228
teamSettingsList . push ( {
236
229
title : "Usage" ,
237
- link : `/t/ ${ team . slug } / usage` ,
230
+ link : `/org- usage` ,
238
231
} ) ;
239
232
}
240
233
if ( currentUserInTeam ?. role === "owner" ) {
241
234
teamSettingsList . push ( {
242
235
title : "Settings" ,
243
- link : `/t/ ${ team . slug } / settings` ,
236
+ link : `/org- settings` ,
244
237
alternatives : getTeamSettingsMenu ( {
245
238
team,
246
239
billingMode : teamBillingMode ,
@@ -277,7 +270,7 @@ export default function Menu() {
277
270
const onFeedbackFormClose = ( ) => {
278
271
setFeedbackFormVisible ( false ) ;
279
272
} ;
280
- const isTeamLevelActive = ! projectSlug && ! isWorkspacesUI && ! isPersonalSettingsUI && ! isAdminUI && teamOrUserSlug ;
273
+ const isTeamLevelActive = ! projectSlug && ! isWorkspacesUI && ! isPersonalSettingsUI && ! isAdminUI ;
281
274
const renderTeamMenu = ( ) => {
282
275
if ( ! hasIndividualProjects && ( ! teams || teams . length === 0 ) ) {
283
276
return (
@@ -291,8 +284,8 @@ export default function Menu() {
291
284
) ;
292
285
}
293
286
const userFullName = user ?. fullName || user ?. name || "..." ;
294
- const entries : ( ContextMenuEntry & { slug : string } ) [ ] = [
295
- ...( hasIndividualProjects
287
+ const entries : ContextMenuEntry [ ] = [
288
+ ...( ! user ?. additionalData ?. isMigratedToTeamOnlyAttribution
296
289
? [
297
290
{
298
291
title : userFullName ,
@@ -304,16 +297,14 @@ export default function Menu() {
304
297
< span className = "" > Personal Account</ span >
305
298
</ div >
306
299
) ,
307
- active : getSelectedTeamSlug ( ) === "" ,
300
+ active : team === undefined ,
308
301
separator : true ,
309
- slug : "" ,
310
- link : "/projects" ,
302
+ link : `${ location . pathname } ?org=0` ,
311
303
} ,
312
304
]
313
305
: [ ] ) ,
314
306
...( teams || [ ] )
315
307
. map ( ( t ) => ( {
316
- slug : t . slug ,
317
308
title : t . name ,
318
309
customContent : (
319
310
< div className = "w-full text-gray-400 flex flex-col" >
@@ -325,13 +316,12 @@ export default function Menu() {
325
316
</ span >
326
317
</ div >
327
318
) ,
328
- active : getSelectedTeamSlug ( ) === t . slug ,
319
+ active : team ?. id === t . id ,
329
320
separator : true ,
330
- link : `/t/ ${ t . slug } ` ,
321
+ link : `/projects/?org= ${ t . id } ` ,
331
322
} ) )
332
323
. sort ( ( a , b ) => ( a . title . toLowerCase ( ) > b . title . toLowerCase ( ) ? 1 : - 1 ) ) ,
333
324
{
334
- slug : "new" ,
335
325
title : "Create a new organization" ,
336
326
customContent : (
337
327
< div className = "w-full text-gray-400 flex items-center" >
@@ -354,7 +344,7 @@ export default function Menu() {
354
344
( isTeamLevelActive
355
345
? "text-gray-50 bg-gray-800 dark:bg-gray-50 dark:text-gray-900 border-gray-700 dark:border-gray-200"
356
346
: "text-gray-500 bg-gray-50 dark:bg-gray-800 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 dark:border-gray-700" ) ;
357
- const selectedEntry = entries . find ( ( e ) => e . slug === getSelectedTeamSlug ( ) ) || entries [ 0 ] ;
347
+ const selectedEntry = entries . find ( ( e ) => e . active ) || entries [ 0 ] ;
358
348
return (
359
349
< div className = "flex p-1" >
360
350
< Link to = { selectedEntry . link ! } >
@@ -378,14 +368,14 @@ export default function Menu() {
378
368
</ ContextMenu >
379
369
</ div >
380
370
{ projectSlug && ! prebuildId && ! isAdminUI && (
381
- < Link to = { `${ teamOrUserSlug } /${ projectSlug } ${ prebuildId ? "/prebuilds" : "" } ` } >
371
+ < Link to = { `/projects /${ projectSlug } ${ prebuildId ? "/prebuilds" : "" } ` } >
382
372
< span className = " flex h-full text-base text-gray-50 bg-gray-800 dark:bg-gray-50 dark:text-gray-900 font-semibold ml-2 px-3 py-1 rounded-2xl border-gray-100" >
383
373
{ project ?. name }
384
374
</ span >
385
375
</ Link >
386
376
) }
387
377
{ prebuildId && (
388
- < Link to = { `${ teamOrUserSlug } /${ projectSlug } ${ prebuildId ? "/prebuilds" : "" } ` } >
378
+ < Link to = { `/projects /${ projectSlug } ${ prebuildId ? "/prebuilds" : "" } ` } >
389
379
< span className = " flex h-full text-base text-gray-500 bg-gray-50 hover:bg-gray-100 dark:text-gray-400 dark:bg-gray-800 dark:hover:bg-gray-700 font-semibold ml-2 px-3 py-1 rounded-2xl border-gray-100" >
390
380
{ project ?. name }
391
381
</ span >
@@ -403,7 +393,7 @@ export default function Menu() {
403
393
/>
404
394
</ svg >
405
395
</ div >
406
- < Link to = { `${ teamOrUserSlug } /${ projectSlug } /${ prebuildId } ` } >
396
+ < Link to = { `/projects /${ projectSlug } /${ prebuildId } ` } >
407
397
< span className = "flex h-full text-base text-gray-50 bg-gray-800 dark:bg-gray-50 dark:text-gray-900 font-semibold px-3 py-1 rounded-2xl border-gray-100" >
408
398
{ prebuildId . substring ( 0 , 8 ) . trimEnd ( ) }
409
399
</ span >
0 commit comments