"use client"; import { useState, useEffect, useRef } from "react"; import { 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; vip?: boolean; onLogout?: () => void; onRefreshVip?: () => void; } /** 圆形头像 + VIP 标识 + 点击展开退出按钮,供 digital / meetup / vip 三站复用 */ export default function UserAvatar({ email, vip, onLogout }: UserAvatarProps) { const { t } = useTranslation("common"); 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 (
{open && (
{vip && (
👑 VIP
)}
)}
); }