1
1
import { Avatar } from "@/components/orbit/avatar" ;
2
+ import { buttonVariants } from "@/components/ui/button" ;
2
3
import {
3
4
DropdownMenu ,
4
5
DropdownMenuContent ,
5
6
DropdownMenuItem ,
6
- DropdownMenuSeparator ,
7
7
DropdownMenuTrigger ,
8
8
} from "@/components/ui/dropdown-menu" ;
9
- import { Gear , SignOut , ToggleLeft , ToggleRight } from "@phosphor-icons/react" ;
9
+ import { cn } from "@/lib/utils" ;
10
+ import {
11
+ CaretDown ,
12
+ Gear ,
13
+ SignOut ,
14
+ ToggleLeft ,
15
+ ToggleRight ,
16
+ } from "@phosphor-icons/react" ;
10
17
import { useTheme } from "next-themes" ;
11
18
import { useRouter } from "next/navigation" ;
12
19
import { useCallback } from "react" ;
13
20
import { useSession } from "./session-provider" ;
14
21
15
22
export default function NavigationProfile ( ) {
16
23
const { resolvedTheme, forcedTheme, setTheme } = useTheme ( ) ;
17
- const { session } = useSession ( ) ;
24
+ const { session, isLoading } = useSession ( ) ;
18
25
const router = useRouter ( ) ;
19
26
20
27
const theme = forcedTheme ?? resolvedTheme ;
@@ -34,48 +41,91 @@ export default function NavigationProfile() {
34
41
[ theme , setTheme ]
35
42
) ;
36
43
37
- if ( ! session ?. user ) return null ;
38
-
39
44
return (
40
45
< DropdownMenu modal = { false } >
41
46
< DropdownMenuTrigger >
42
- < Avatar size = "lg" username = { session . user . initials } as = "div" />
47
+ < div
48
+ className = { cn (
49
+ buttonVariants ( {
50
+ size : "lg" ,
51
+ variant : "ghost" ,
52
+ } ) ,
53
+ "flex items-center justify-start gap-2 p-1"
54
+ ) }
55
+ >
56
+ < Avatar username = "Guest" as = "div" />
57
+ { ! isLoading && (
58
+ < div className = "flex-1 text-left text-sm" >
59
+ { session
60
+ ? session . user . first_name + " " + session ?. user . last_name
61
+ : "Guest" }
62
+ </ div >
63
+ ) }
64
+
65
+ { isLoading && (
66
+ < div className = "bg-muted h-4 w-16 animate-pulse rounded-sm" />
67
+ ) }
68
+ < div >
69
+ < CaretDown weight = "bold" className = "h-3 w-3" />
70
+ </ div >
71
+ </ div >
43
72
</ DropdownMenuTrigger >
44
- < DropdownMenuContent align = "end " className = "w-[200px ]" >
45
- < div className = "flex gap-2 p-2" >
46
- < Avatar size = "lg" username = { session . user . initials } />
73
+ < DropdownMenuContent align = "start " className = "w-[250px ]" >
74
+ < div className = "flex gap-2 border-b p-2" >
75
+ < Avatar size = "lg" username = { session ? .user ? .initials ?? "Guest" } />
47
76
48
77
< div className = "flex flex-col justify-center" >
49
78
< div className = "text-sm font-semibold" >
50
- { session . user . first_name + " " + session . user . last_name }
79
+ { session
80
+ ? session . user . first_name + " " + session ?. user . last_name
81
+ : "Guest" }
51
82
</ div >
52
- < div className = "text-sm" > { session . user . email } </ div >
83
+ { session && < div className = "text-sm" > { session . user . email } </ div > }
53
84
</ div >
54
85
</ div >
55
- < DropdownMenuSeparator />
56
- < DropdownMenuItem
57
- className = "justify-between"
58
- onClick = { ( ) => {
59
- router . push ( `/account` ) ;
60
- } }
61
- >
62
- Account Setting
63
- < Gear size = { 20 } />
64
- </ DropdownMenuItem >
65
- < DropdownMenuItem
66
- className = "justify-between"
67
- onClick = { onThemeToggleClicked }
68
- >
69
- Theme
70
- { theme === "dark" ? (
71
- < ToggleRight weight = "fill" size = { 20 } />
72
- ) : (
73
- < ToggleLeft size = { 20 } />
86
+
87
+ < div className = "p-2" >
88
+ { session && (
89
+ < DropdownMenuItem
90
+ className = "justify-between"
91
+ onClick = { ( ) => {
92
+ router . push ( `/account` ) ;
93
+ } }
94
+ >
95
+ Account Setting
96
+ < Gear size = { 20 } />
97
+ </ DropdownMenuItem >
98
+ ) }
99
+ < DropdownMenuItem
100
+ className = "justify-between"
101
+ onClick = { onThemeToggleClicked }
102
+ >
103
+ Theme
104
+ { theme === "dark" ? (
105
+ < ToggleRight weight = "fill" size = { 20 } />
106
+ ) : (
107
+ < ToggleLeft size = { 20 } />
108
+ ) }
109
+ </ DropdownMenuItem >
110
+ { session && (
111
+ < DropdownMenuItem
112
+ onClick = { onLogoutClicked }
113
+ className = "justify-between"
114
+ >
115
+ Log out < SignOut size = { 20 } />
116
+ </ DropdownMenuItem >
74
117
) }
75
- </ DropdownMenuItem >
76
- < DropdownMenuItem onClick = { onLogoutClicked } className = "justify-between" >
77
- Log out < SignOut size = { 20 } />
78
- </ DropdownMenuItem >
118
+ { ! session && (
119
+ < DropdownMenuItem
120
+ onClick = { ( ) => {
121
+ router . push ( "/signin" ) ;
122
+ } }
123
+ className = "justify-between"
124
+ >
125
+ Log in
126
+ </ DropdownMenuItem >
127
+ ) }
128
+ </ div >
79
129
</ DropdownMenuContent >
80
130
</ DropdownMenu >
81
131
) ;
0 commit comments