'use client'
import { useState } from 'react'
import Link from 'next/link'
import { useRouter } from 'next/navigation'
import {
IconChartBar as ChartBar,
IconLink as Link2,
IconLogout as LogOut,
IconShield,
IconUserCircle as UserRound
} from '@tabler/icons-react'
import { signOut } from '@/lib/actions/auth'
import type { AppUser } from '@/lib/auth/types'
import { chatStore } from '@/lib/chat-store'
import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger
} from '@/components/ui/dropdown-menu'
import { AccountSettingsDialog } from '@/components/account-settings-dialog'
import { useUsageBudget } from '@/components/usage-budget-provider'
import { UsageDialog } from '@/components/usage-dialog'
import { Button } from './ui/button'
import { ExternalLinkItems } from './external-link-items'
interface UserMenuProps {
user: AppUser
}
export default function UserMenu({ user }: UserMenuProps) {
const router = useRouter()
const [menuOpen, setMenuOpen] = useState(false)
const [accountOpen, setAccountOpen] = useState(false)
const [usageOpen, setUsageOpen] = useState(false)
const { usage, isLow, isExhausted, refreshUsage } = useUsageBudget()
const userName = user.name || 'User'
const avatarUrl = user.image ?? undefined
const getInitials = (name: string, email: string | null | undefined) => {
if (name && name !== 'User') {
const names = name.split(' ')
if (names.length > 1) {
return `${names[0][0]}${names[names.length - 1][0]}`.toUpperCase()
}
return name.substring(0, 2).toUpperCase()
}
if (email) {
return email.split('@')[0].substring(0, 2).toUpperCase()
}
return 'U'
}
const handleLogout = async () => {
await signOut()
chatStore.setUser(null)
router.push('/')
router.refresh()
}
const handleOpenAccount = () => {
setMenuOpen(false)
window.setTimeout(() => setAccountOpen(true), 0)
}
const handleOpenUsage = () => {
setMenuOpen(false)
window.setTimeout(() => {
setUsageOpen(true)
void refreshUsage()
}, 0)
}
const accountMenuLabel = isExhausted
? 'Open account menu. Monthly usage limit reached.'
: isLow
? 'Open account menu. Monthly usage is running low.'
: 'Open account menu'
return (
<>
{
event.preventDefault()
handleOpenAccount()
}}
>
Account
{user.role === 'admin' && (
Admin
)}
{usage && (
{
event.preventDefault()
handleOpenUsage()
}}
>
Usage
{usage.remaining} / {usage.limit}
)}
Links
Logout
{usage && (
)}
>
)
}