"use client"; import { useState, useEffect, useRef } from "react"; import { Link, useTranslation } from "@/i18n/navigation"; import { pbLogout } from "@/app/lib/pocketbase"; function getAvatarLetter(email: string): string { const local = email.split("@")[0]; if (!local) return "?"; return local.slice(0, 1).toUpperCase(); } interface UserAvatarProps { email: string; isVip?: boolean; onLogout?: () => void; /** 设置后点击头像打开外部菜单(如 SiteMenu),不再展开内置下拉 */ onOpenMenu?: () => void; } /** 圆形头像 + 账户菜单 */ export default function UserAvatar({ email, isVip = false, onLogout, onOpenMenu }: UserAvatarProps) { const { t } = useTranslation("menu"); const { t: tNav } = useTranslation("nav"); const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { const handleClickOutside = (e: MouseEvent) => { if (ref.current && !ref.current.contains(e.target as Node)) setOpen(false); }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); const handleLogout = async () => { await pbLogout(); setOpen(false); onLogout?.(); }; return (
{isVip && ( VIP )} {!onOpenMenu && open && (

{email}

{isVip ? "VIP" : t("yourProfile")}

setOpen(false)} className="flex w-full items-center gap-2 rounded-lg px-3 py-2.5 text-left text-sm font-medium text-gray-700 transition hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700" > 👤 {t("yourProfile")} setOpen(false)} className="flex w-full items-center gap-2 rounded-lg px-3 py-2.5 text-left text-sm font-medium text-gray-700 transition hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700" > ⚙️ {t("settings")} setOpen(false)} className="flex w-full items-center gap-2 rounded-lg px-3 py-2.5 text-left text-sm font-medium text-gray-700 transition hover:bg-gray-50 dark:text-gray-300 dark:hover:bg-gray-700" > 👑 {t("pricing")}
)}
); }