"use client"; import { useState, useEffect, useRef } from "react"; import { Link, useTranslation } from "@/app/digital/i18n/navigation"; import { pbLogout } from "@/app/digital/lib/pocketbase"; import { useCrossSiteUrls } from "@/app/digital/lib/useCrossSiteUrls"; import DigitalThemeIcon, { type IconName } from "./DigitalThemeIcon"; function getAvatarLetter(email: string): string { const local = email.split("@")[0]; if (!local) return "?"; return local.slice(0, 1).toUpperCase(); } interface UserAvatarProps { email: string; vip?: boolean; onLogout?: () => void; onRefreshVip?: () => void; } type MenuLink = { href: string; label: string; icon: IconName; emoji: string; external?: boolean; }; /** 圆形头像 + 账户菜单,供 digital / meetup / vip 三站复用 */ export default function UserAvatar({ email, vip, onLogout }: UserAvatarProps) { const { t } = useTranslation("common"); const { vipUrl } = useCrossSiteUrls(); const [open, setOpen] = useState(false); const ref = useRef(null); const menuLinks: MenuLink[] = [ { href: "/profile", label: t("profile"), icon: "user", emoji: "👤" }, { href: "/course", label: t("course"), icon: "course", emoji: "🎓" }, { href: "/ebook", label: t("ebook"), icon: "book", emoji: "📚" }, { href: "/app", label: t("app"), icon: "phone", emoji: "📱" }, { href: vipUrl, label: t("community"), icon: "globe", emoji: "🌐", external: true }, ]; 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); if (typeof window !== "undefined") { window.dispatchEvent(new CustomEvent("auth:updated")); } onLogout?.(); }; return (
{open && (
{getAvatarLetter(email)}

{email}

{vip ? t("vipMember") : t("standardMember")}

{menuLinks.map((item) => item.external ? ( setOpen(false)} className="dn-profile-menu-item flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-medium text-slate-700 transition hover:bg-slate-50 dark:text-slate-300 dark:hover:bg-slate-700" > {item.label} ) : ( setOpen(false)} className="dn-profile-menu-item flex w-full items-center gap-3 rounded-lg px-3 py-2.5 text-left text-sm font-medium text-slate-700 transition hover:bg-slate-50 dark:text-slate-300 dark:hover:bg-slate-700" > {item.label} ) )}
)}
); }