1
+ 'use client'
2
+
3
+ import { Avatar , AvatarFallback , AvatarImage } from "@/components/ui/avatar"
4
+ import { Button } from "@/components/ui/button"
5
+ import { DropdownMenu , DropdownMenuContent , DropdownMenuItem , DropdownMenuTrigger } from "@/components/ui/dropdown-menu"
6
+ import { Settings , Info , User , Moon , Sun , Palette } from "lucide-react"
7
+ import Link from "next/link"
8
+ import { useAtom } from "jotai"
9
+ import { settingsAtom } from "@/lib/atoms"
10
+ import AboutModal from "./AboutModal"
11
+ import { useState } from "react"
12
+ import { useTheme } from "next-themes"
13
+
14
+ export function Profile ( ) {
15
+ const [ settings ] = useAtom ( settingsAtom )
16
+ const [ showAbout , setShowAbout ] = useState ( false )
17
+ const { theme, setTheme } = useTheme ( )
18
+
19
+ return (
20
+ < >
21
+ < DropdownMenu >
22
+ < DropdownMenuTrigger asChild >
23
+ < Button variant = "ghost" className = "flex items-center gap-2" >
24
+ < Avatar className = "h-8 w-8" >
25
+ < AvatarImage src = { settings ?. profile ?. avatarPath ? `/api/avatars/${ settings . profile . avatarPath . split ( '/' ) . pop ( ) } ` : '/avatars/default.png' } />
26
+ < AvatarFallback >
27
+ < User className = "h-4 w-4" />
28
+ </ AvatarFallback >
29
+ </ Avatar >
30
+ </ Button >
31
+ </ DropdownMenuTrigger >
32
+ < DropdownMenuContent align = "end" className = "w-[200px] p-2" >
33
+ < DropdownMenuItem className = "cursor-pointer px-2 py-1.5" asChild >
34
+ < Link
35
+ href = "/settings"
36
+ aria-label = 'settings'
37
+ className = "flex items-center w-full gap-3"
38
+ >
39
+ < Settings className = "h-4 w-4" />
40
+ < span > Settings</ span >
41
+ </ Link >
42
+ </ DropdownMenuItem >
43
+ < DropdownMenuItem className = "cursor-pointer px-2 py-1.5" asChild >
44
+ < button
45
+ onClick = { ( ) => setShowAbout ( true ) }
46
+ className = "flex items-center w-full gap-3"
47
+ >
48
+ < Info className = "h-4 w-4" />
49
+ < span > About</ span >
50
+ </ button >
51
+ </ DropdownMenuItem >
52
+ < DropdownMenuItem className = "cursor-pointer px-2 py-1.5" >
53
+ < div className = "flex items-center justify-between w-full gap-3" >
54
+ < div className = "flex items-center gap-3" >
55
+ < Palette className = "h-4 w-4" />
56
+ < span > Theme</ span >
57
+ </ div >
58
+ < button
59
+ onClick = { ( ) => setTheme ( theme === 'dark' ? 'light' : 'dark' ) }
60
+ className = { `
61
+ w-12 h-6 rounded-full relative transition-all duration-300 ease-in-out
62
+ hover:scale-105 shadow-inner
63
+ ${ theme === 'dark'
64
+ ? 'bg-blue-600/90 hover:bg-blue-600'
65
+ : 'bg-gray-200 hover:bg-gray-300'
66
+ }
67
+ ` }
68
+ >
69
+ < div className = { `
70
+ w-5 h-5 rounded-full absolute top-0.5 left-0.5
71
+ transition-all duration-300 ease-in-out
72
+ shadow-md bg-white
73
+ ${ theme === 'dark' ? 'translate-x-6' : 'translate-x-0' }
74
+ ` } >
75
+ < div className = "absolute inset-0 flex items-center justify-center" >
76
+ { theme === 'dark' ? (
77
+ < Moon className = "h-3 w-3 text-gray-600" />
78
+ ) : (
79
+ < Sun className = "h-3 w-3 text-gray-600" />
80
+ ) }
81
+ </ div >
82
+ </ div >
83
+ </ button >
84
+ </ div >
85
+ </ DropdownMenuItem >
86
+ </ DropdownMenuContent >
87
+ </ DropdownMenu >
88
+
89
+ < AboutModal isOpen = { showAbout } onClose = { ( ) => setShowAbout ( false ) } />
90
+ </ >
91
+ )
92
+ }
0 commit comments