'use client'; import React, { useState, useEffect } from 'react'; import Image from 'next/image'; import Link from 'next/link'; import { User, ChevronDown, Settings, LogOut } from 'lucide-react'; import { useNavidrome } from '@/app/components/NavidromeContext'; import { getGravatarUrl } from '@/lib/gravatar'; import { User as NavidromeUser } from '@/lib/navidrome'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Button } from '@/components/ui/button'; interface UserProfileProps { variant?: 'desktop' | 'mobile'; } export function UserProfile({ variant = 'desktop' }: UserProfileProps) { const { api, isConnected } = useNavidrome(); const [userInfo, setUserInfo] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const fetchUserInfo = async () => { if (!api || !isConnected) { setLoading(false); return; } try { const user = await api.getUserInfo(); setUserInfo(user); } catch (error) { console.error('Failed to fetch user info:', error); } finally { setLoading(false); } }; fetchUserInfo(); }, [api, isConnected]); const handleLogout = () => { // Clear Navidrome config and reload localStorage.removeItem('navidrome-config'); window.location.reload(); }; if (!userInfo) { if (variant === 'desktop') { return ( ); } else { return ( ); } } const gravatarUrl = userInfo.email ? getGravatarUrl(userInfo.email, variant === 'desktop' ? 32 : 48, 'identicon') : null; if (variant === 'desktop') { // Desktop: Only show profile icon return (
{gravatarUrl ? ( {`${userInfo.username}'s ) : (
)}

{userInfo.username}

{userInfo.email && (

{userInfo.email}

)}
Settings Logout
); } else { // Mobile: Show only icon with dropdown return (
{gravatarUrl ? ( {`${userInfo.username}'s ) : (
)}

{userInfo.username}

{userInfo.email && (

{userInfo.email}

)}
Settings Logout
); } }