11'use client' ;
22import Link from 'next/link' ;
3- import { usePathname , useRouter } from 'next/navigation' ;
3+ import { useRouter } from 'next/navigation' ;
44import { useEffect , useState } from 'react' ;
55import clsx from 'clsx' ;
66import supabase , { getAvatarUrl } from '@/lib/supabase/client' ;
@@ -13,35 +13,38 @@ import {
1313 DropdownMenuItem ,
1414 DropdownMenuTrigger ,
1515} from '../ui/dropdown-menu' ;
16+ import { Button } from '../ui/button' ;
17+ import { Avatar , AvatarFallback , AvatarImage } from '../ui/avatar' ;
1618
17- const UserImage = ( { user, className } : any ) => {
19+ const UserAvatar = ( { user, className } : any ) => {
1820 // State to handle image load error
1921 const [ imgUrl , setImgUrl ] = useState < string > ( '/logo-spaced.png' ) ;
2022 useEffect ( ( ) => {
2123 getAvatarUrl ( ) . then ( setImgUrl ) ;
2224 } , [ user ] ) ;
2325
2426 return (
25- < div
27+ < Button
2628 className = {
2729 className ??
2830 'w-8 h-8 rounded-full bg-primary/10 text-primary/80 hover:text-primary hover:bg-primary/20 overflow-hidden'
2931 }
3032 >
31- { imgUrl ? (
32- < img
33+ < Avatar >
34+ < AvatarImage
3335 alt = "avatar"
3436 src = { imgUrl }
35- className = "w-full h-full object-cover rounded-full"
3637 />
37- ) : (
38- < Icons . user className = "w-full h-full p-2" />
39- ) }
40- </ div >
38+ < AvatarFallback >
39+ { user . email ?. match ( / ^ ( [ ^ @ ] + ) / ) ?. [ 1 ] ?? '(No Name)' }
40+ </ AvatarFallback >
41+ </ Avatar >
42+ </ Button >
4143 ) ;
4244} ;
4345
44- const UserPanel = ( { user } : { user : any } ) => {
46+ export const AuthButton = ( ) => {
47+ const { user } = useUser ( ) ;
4548 const router = useRouter ( ) ;
4649
4750 const signOut = async ( ) => {
@@ -51,136 +54,108 @@ const UserPanel = ({ user }: { user: any }) => {
5154 router . push ( '/auth/login' ) ;
5255 } ;
5356
54- return (
55- < div className = "flex flex-col items-center w-96 p-4 gap-2 text-sm" >
56- < UserImage
57- user = { user }
58- className = "mt-8 w-16 h-16 rounded-full bg-primary/20 text-primary overflow-hidden"
59- />
60- < span className = "text-lg font-bold" >
61- { user . user_metadata . name ??
62- user . email ?. match ( / ^ ( [ ^ @ ] + ) / ) ?. [ 1 ] ??
63- '(No Name)' }
64- </ span >
65- < span className = "flex flex-col items-center gap-2" >
66- { user . email }
67- { user . confirmed_at ? (
68- < Icons . badgeCheck className = "text-green-600 w-5 h-5" />
69- ) : (
70- < span className = "text-red-500" > (unverified)</ span >
71- ) }
72- </ span >
73- < a
74- href = "https://discord.gg/FeFSxWtn"
75- aria-label = "discord"
76- target = "_blank"
77- rel = "noreferrer"
57+ if ( ! user ) {
58+ return (
59+ < Link
60+ href = "/auth/login"
61+ className = "ml-4 btn text-xs font-normal"
7862 >
79- < img
80- src = "https://dcbadge.vercel.app/api/server/xBQxwRSWfm?timestamp=20240714"
81- alt = "discord"
82- className = "rounded-lg"
83- />
84- </ a >
85- < div className = "flex items-center no-wrap gap-1 mt-8 w-full" >
86- < DropdownMenuItem
87- onClick = { ( ) => router . push ( '/settings/models' ) }
88- className = { clsx (
89- 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-r-sm rounded-l-lg' ,
90- 'hover:bg-base-content/30'
91- ) }
92- >
93- < Icons . brain className = "w-5 h-5" />
94- Models
95- </ DropdownMenuItem >
96- < DropdownMenuItem
97- onClick = { ( ) =>
98- router . push ( 'https://github.com/hughlv/agentok/issues' )
99- }
100- className = { clsx (
101- 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-l-sm rounded-r-lg' ,
102- 'hover:bg-base-content/30'
103- ) }
104- >
105- < Icons . github className = "h-5 w-5" />
106- Open Issues
107- </ DropdownMenuItem >
108- </ div >
109- < div className = "flex items-center no-wrap gap-1 w-full" >
110- < DropdownMenuItem
111- onClick = { ( ) => router . push ( '/settings' ) }
112- className = { clsx (
113- 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-r-sm rounded-l-lg' ,
114- 'hover:bg-base-content/30'
115- ) }
116- >
117- < Icons . settings className = "h-5 w-5" />
118- Settings
119- </ DropdownMenuItem >
120-
121- < DropdownMenuItem
122- onClick = { signOut }
123- className = { clsx (
124- 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-l-sm rounded-r-lg' ,
125- 'hover:bg-base-content/30'
126- ) }
127- >
128- < Icons . logout className = "w-5 h-5" />
129- Sign out
130- </ DropdownMenuItem >
131- </ div >
132- < div className = "flex items-center justify-center text-xs w-full gap-1" >
133- < Link
134- href = "https://agentok.ai/docs/privacy"
135- target = "_blank"
136- className = "link link-hover"
137- >
138- Privacy Policy
139- </ Link >
140- < span className = "" > •</ span >
141- < Link
142- href = "https://agentok.ai/docs/tos"
143- target = "_blank"
144- className = "link link-hover"
145- >
146- Terms of Service
147- </ Link >
148- </ div >
149- </ div >
150- ) ;
151- } ;
152-
153- const UserAvatar = ( { user } : any ) => {
63+ < Button variant = "outline" size = "sm" >
64+ Login / Sign Up
65+ </ Button >
66+ </ Link >
67+ ) ;
68+ }
15469 return (
15570 < DropdownMenu >
156- < DropdownMenuTrigger asChild >
157- < UserImage user = { user } />
71+ < DropdownMenuTrigger >
72+ < UserAvatar user = { user } />
15873 </ DropdownMenuTrigger >
15974 < DropdownMenuContent align = "end" >
160- < UserPanel user = { user } />
75+ < div className = "flex flex-col items-center w-96 p-4 gap-2 text-sm" >
76+ < UserAvatar
77+ user = { user }
78+ className = "w-16 h-16 rounded-full bg-primary/20 text-primary overflow-hidden"
79+ />
80+ < span className = "text-lg font-bold" >
81+ { user . user_metadata . name ??
82+ user . email ?. match ( / ^ ( [ ^ @ ] + ) / ) ?. [ 1 ] ??
83+ '(No Name)' }
84+ </ span >
85+ < span className = "flex flex-col items-center gap-2" >
86+ { user . email }
87+ { user . confirmed_at ? (
88+ < Icons . badgeCheck className = "text-green-600 w-5 h-5" />
89+ ) : (
90+ < span className = "text-red-500" > (unverified)</ span >
91+ ) }
92+ </ span >
93+ < div className = "flex items-center no-wrap gap-1 mt-8 w-full" >
94+ < DropdownMenuItem
95+ onClick = { ( ) => router . push ( '/settings/models' ) }
96+ className = { clsx (
97+ 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-r-sm rounded-l-lg' ,
98+ 'hover:bg-base-content/30'
99+ ) }
100+ >
101+ < Icons . brain className = "w-5 h-5" />
102+ Models
103+ </ DropdownMenuItem >
104+ < DropdownMenuItem
105+ onClick = { ( ) =>
106+ router . push ( 'https://github.com/dustland/agentok/issues' )
107+ }
108+ className = { clsx (
109+ 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-l-sm rounded-r-lg' ,
110+ 'hover:bg-base-content/30'
111+ ) }
112+ >
113+ < Icons . github className = "h-5 w-5" />
114+ Open Issues
115+ </ DropdownMenuItem >
116+ </ div >
117+ < div className = "flex items-center no-wrap gap-1 w-full" >
118+ < DropdownMenuItem
119+ onClick = { ( ) => router . push ( '/settings' ) }
120+ className = { clsx (
121+ 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-r-sm rounded-l-lg' ,
122+ 'hover:bg-base-content/30'
123+ ) }
124+ >
125+ < Icons . settings className = "h-5 w-5" />
126+ Settings
127+ </ DropdownMenuItem >
128+
129+ < DropdownMenuItem
130+ onClick = { signOut }
131+ className = { clsx (
132+ 'flex w-64 items-center justify-start py-2 px-4 gap-1.5 bg-base-content/20 rounded-l-sm rounded-r-lg' ,
133+ 'hover:bg-base-content/30'
134+ ) }
135+ >
136+ < Icons . logout className = "w-5 h-5" />
137+ Sign out
138+ </ DropdownMenuItem >
139+ </ div >
140+ < div className = "flex items-center justify-center text-xs w-full gap-1" >
141+ < Link
142+ href = "https://agentok.ai/docs/privacy"
143+ target = "_blank"
144+ className = "link link-hover"
145+ >
146+ Privacy Policy
147+ </ Link >
148+ < span className = "" > •</ span >
149+ < Link
150+ href = "https://agentok.ai/docs/tos"
151+ target = "_blank"
152+ className = "link link-hover"
153+ >
154+ Terms of Service
155+ </ Link >
156+ </ div >
157+ </ div >
161158 </ DropdownMenuContent >
162159 </ DropdownMenu >
163160 ) ;
164161} ;
165-
166- const AuthButton = ( ) => {
167- const { user } = useUser ( ) ;
168- const pathname = usePathname ( ) ;
169-
170- if ( pathname . includes ( '/auth' ) ) {
171- return null ; // don't show auth button on login page
172- }
173-
174- return user ? (
175- < UserAvatar user = { user } />
176- ) : (
177- < Link
178- href = "/auth/login"
179- className = "ml-4 btn btn-sm btn-primary rounded text-xs font-normal"
180- >
181- Login / Sign Up
182- </ Link >
183- ) ;
184- } ;
185-
186- export default AuthButton ;
0 commit comments