"use client"; import { useState, useEffect, useCallback } from "react"; import { Link, useLocale, usePathname, useRouter, useTranslation } from "@/i18n/navigation"; import { getStoredUserEmail } from "@/app/lib/pocketbase"; import { useCrossSiteUrls } from "@/app/lib/useCrossSiteUrls"; import AuthModal from "./AuthModal"; import ThemeToggle from "./ThemeToggle"; import UserAvatar from "./UserAvatar"; export default function Header() { const { t } = useTranslation("common"); const { t: tNav } = useTranslation("nav"); const locale = useLocale(); const pathname = usePathname(); const router = useRouter(); const [mobileOpen, setMobileOpen] = useState(false); const [scrolled, setScrolled] = useState(false); const [authOpen, setAuthOpen] = useState(false); const [userEmail, setUserEmail] = useState(null); const [vip, setVip] = useState(false); const { vipUrl } = useCrossSiteUrls(); const navLinks = [ { labelKey: "roadmap" as const, href: "#roadmap" }, { labelKey: "tools" as const, href: "#tools" }, { labelKey: "community" as const, href: vipUrl, external: true }, { labelKey: "resources" as const, href: "#resources" }, ]; const fetchAuthAndVip = useCallback(async () => { try { const meRes = await fetch("/api/auth/me", { credentials: "include" }); const meData = await meRes.json(); if (meData?.user && meData?.token) { const { pbSaveAuth } = await import("@/app/lib/pocketbase"); pbSaveAuth(meData.token, { id: meData.user.id, email: meData.user.email }); setUserEmail(meData.user.email); // 用邮箱查 VIP,比 cookie userId 更可靠 const vipRes = await fetch(`/api/vip/check?email=${encodeURIComponent(meData.user.email)}`, { credentials: "include" }); const vipData = await vipRes.json(); setVip(vipData?.vip === true); } else { setUserEmail(getStoredUserEmail()); setVip(false); } } catch { /* ignore */ } }, []); useEffect(() => { fetchAuthAndVip(); }, [fetchAuthAndVip]); useEffect(() => { const onVipUpdated = () => fetchAuthAndVip(); const onAuthSuccess = () => fetchAuthAndVip(); window.addEventListener("vip:updated", onVipUpdated); window.addEventListener("auth:success", onAuthSuccess); return () => { window.removeEventListener("vip:updated", onVipUpdated); window.removeEventListener("auth:success", onAuthSuccess); }; }, [fetchAuthAndVip]); return (
🌍 {t("siteName")} {t("siteNameShort")}
{userEmail ? ( { setUserEmail(null); setVip(false); router.replace("/"); }} /> ) : ( )} {t("explore")}
{mobileOpen && (
)} setAuthOpen(false)} onSuccess={() => fetchAuthAndVip()} />
); }