All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m44s
- useSyncMe: 登录后拉 /api/me 用 votedArtists 覆盖本地 store,登出清本地 - Providers: SyncMeBridge 接入 SessionProvider - Logo v3 替换登录页/弹窗/Footer 的旧 <Logo> 组件 - Footer 删除 logo,简化为版权行 - Navigation 删除 mobile 第二行 NavLinks,合并到第一行 - NavLinks 统一布局,响应式 gap+字号(gap-5 sm:gap-8 / text-[13px] sm:text-sm) - HeroVoteProgress 窄屏(< md)隐藏 12 格点,只留文字 - scripts/screenshot-narrow.mjs 验证脚本(可配宽高) Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
62 lines
1.7 KiB
TypeScript
62 lines
1.7 KiB
TypeScript
"use client";
|
|
|
|
import { SessionProvider } from "next-auth/react";
|
|
import { Toaster } from "react-hot-toast";
|
|
import GlobalLoginModal from "@/components/auth/GlobalLoginModal";
|
|
import { useSyncMe } from "@/hooks/useSyncMe";
|
|
|
|
/**
|
|
* 登录后把服务端 /api/me 同步到本地 vote store 的隐形组件。
|
|
* 必须放在 SessionProvider 内部才能拿到 useSession。
|
|
*/
|
|
function SyncMeBridge() {
|
|
useSyncMe();
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 客户端全局 Provider 集合
|
|
* - SessionProvider: 让 client 组件能用 useSession()
|
|
* - SyncMeBridge: 登录后用 /api/me 覆盖本地票数态(跨设备同步关键)
|
|
* - Toaster: 全站 toast 容器(紫调样式,自动叠加)
|
|
*/
|
|
export default function Providers({ children }: { children: React.ReactNode }) {
|
|
return (
|
|
<SessionProvider>
|
|
<SyncMeBridge />
|
|
{children}
|
|
<GlobalLoginModal />
|
|
<Toaster
|
|
position="top-center"
|
|
toastOptions={{
|
|
duration: 2800,
|
|
style: {
|
|
background: "rgba(34, 29, 74, 0.95)",
|
|
backdropFilter: "blur(16px)",
|
|
color: "#fff",
|
|
border: "1px solid rgba(139, 92, 246, 0.4)",
|
|
boxShadow:
|
|
"0 12px 32px rgba(0,0,0,0.5), 0 0 24px rgba(139,92,246,0.25)",
|
|
fontSize: "13px",
|
|
letterSpacing: "0.5px",
|
|
padding: "10px 16px",
|
|
borderRadius: "12px",
|
|
},
|
|
success: {
|
|
iconTheme: {
|
|
primary: "#a78bfa",
|
|
secondary: "#fff",
|
|
},
|
|
},
|
|
error: {
|
|
iconTheme: {
|
|
primary: "#f472b6",
|
|
secondary: "#fff",
|
|
},
|
|
},
|
|
}}
|
|
/>
|
|
</SessionProvider>
|
|
);
|
|
}
|