UI-UX/src/components/Providers.tsx
iye 8b99c2f091
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 4m44s
feat: 跨设备同步 + Logo v3 + 导航合并 + 窄屏适配 (v0.3.4)
- 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>
2026-05-18 14:56:42 +08:00

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>
);
}