@@ -24,6 +24,12 @@ import { VisibilitySensor } from "@/components/visibility-sensor";
24
24
export function ContextSwitcher ( ) {
25
25
const [ isOpen , setIsOpen ] = useState ( false ) ;
26
26
27
+ const match = useContextSwitchMatch ( ) ;
28
+
29
+ if ( ! match ) {
30
+ return null ;
31
+ }
32
+
27
33
return (
28
34
< >
29
35
< Popover open = { isOpen } onOpenChange = { setIsOpen } >
@@ -47,45 +53,69 @@ export function ContextSwitcher() {
47
53
) ;
48
54
}
49
55
50
- function Breadcrumbs ( ) {
56
+ const useContextSwitchMatch = ( ) :
57
+ | {
58
+ project : string ;
59
+ namespace : string ;
60
+ organization : string ;
61
+ }
62
+ | { organization : string ; project : string }
63
+ | false => {
51
64
const match = useMatchRoute ( ) ;
52
65
53
66
const matchNamespace = match ( {
54
67
to : "/orgs/$organization/projects/$project/ns/$namespace" ,
55
68
fuzzy : true ,
56
69
} ) ;
70
+
57
71
if ( matchNamespace ) {
72
+ return matchNamespace ;
73
+ }
74
+
75
+ const matchProject = match ( {
76
+ to : "/orgs/$organization/projects/$project" ,
77
+ fuzzy : true ,
78
+ } ) ;
79
+
80
+ if ( matchProject ) {
81
+ return matchProject ;
82
+ }
83
+
84
+ return false ;
85
+ } ;
86
+
87
+ function Breadcrumbs ( ) {
88
+ const match = useContextSwitchMatch ( ) ;
89
+
90
+ if ( match && "project" in match && "namespace" in match ) {
58
91
return (
59
92
< div className = "flex flex-col items-center min-w-0 w-full" >
60
93
< div className = "text-left text-xs text-muted-foreground min-w-0 flex w-full" >
61
94
< ProjectBreadcrumb
62
- project = { matchNamespace . project }
95
+ project = { match . project }
63
96
className = "truncate min-w-0 max-w-full block h-4"
64
97
/>
65
98
</ div >
66
99
< div className = "min-w-0 w-full" >
67
100
< NamespaceBreadcrumb
68
101
className = "text-left truncate block"
69
- namespace = { matchNamespace . namespace }
70
- project = { matchNamespace . project }
102
+ namespace = { match . namespace }
103
+ project = { match . project }
71
104
/>
72
105
</ div >
73
106
</ div >
74
107
) ;
75
108
}
76
109
77
- const matchProject = match ( {
78
- to : "/orgs/$organization/projects/$project" ,
79
- fuzzy : true ,
80
- } ) ;
81
-
82
- if ( matchProject ) {
110
+ if ( match && "project" in match ) {
83
111
return (
84
112
< >
85
- < ProjectBreadcrumb project = { matchProject . project } />
113
+ < ProjectBreadcrumb project = { match . project } />
86
114
</ >
87
115
) ;
88
116
}
117
+
118
+ return null ;
89
119
}
90
120
91
121
function ProjectBreadcrumb ( {
@@ -102,7 +132,7 @@ function ProjectBreadcrumb({
102
132
return < Skeleton className = { cn ( "h-5 w-32" , className ) } /> ;
103
133
}
104
134
105
- return < span className = { className } > { data ?. name } </ span > ;
135
+ return < span className = { className } > { data ?. displayName } </ span > ;
106
136
}
107
137
108
138
function NamespaceBreadcrumb ( {
@@ -124,7 +154,7 @@ function NamespaceBreadcrumb({
124
154
return < Skeleton className = "h-5 w-32" /> ;
125
155
}
126
156
127
- return < span className = { className } > { data ?. name } </ span > ;
157
+ return < span className = { className } > { data ?. displayName } </ span > ;
128
158
}
129
159
130
160
function Content ( { onClose } : { onClose ?: ( ) => void } ) {
0 commit comments