import { useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; import { Github, LogOut, ChevronDown, FolderGit2 } from "lucide-react"; import { navigateToLogin, navigateToLoginPopup, isEmbedded } from "../shared/api/client"; import { useLogout, useMe } from "../features/auth/useAuth"; /** * 顶栏登录态:未登录 = Sign in with GitHub;已登录 = 头像 + 下拉(Logout)。 * 浅色体系统一样式;appearance prop 仅为调用方兼容保留。 */ export function AuthButton({ appearance = "light" }: { appearance?: "light" | "dark" }) { void appearance; const meQ = useMe(); const logoutM = useLogout(); const nav = useNavigate(); const [open, setOpen] = useState(false); const rootRef = useRef(null); useEffect(() => { if (!open) return; const onDocDown = (e: MouseEvent) => { if (rootRef.current && !rootRef.current.contains(e.target as Node)) setOpen(false); }; const onKey = (e: KeyboardEvent) => { if (e.key === "Escape") setOpen(false); }; document.addEventListener("mousedown", onDocDown); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDocDown); document.removeEventListener("keydown", onKey); }; }, [open]); // 加载中/后端未接入 auth:按未登录渲染(不阻塞页面) const user = meQ.data?.authenticated ? meQ.data.user : null; if (!user) { return ( ); } return (
{open && (
{user.login}
{ e.preventDefault(); setOpen(false); nav("/my"); }} className="flex w-full items-center gap-2 px-3.5 py-2.5 text-left text-[13px] text-ink-secondary transition-colors hover:bg-surface-sunken hover:text-ink" > My submissions
)}
); }