refactor(auth): migrate social login to next-auth

This commit is contained in:
2026-06-10 10:26:45 +08:00
parent 109a3e3855
commit a4b902893e
34 changed files with 572 additions and 1421 deletions
+15 -14
View File
@@ -6,16 +6,12 @@
* `Row(children: [Skip 文本, SizedBox 26, Facebook 登录按钮])`
*
* 本组件是 splash 鉴权流程的**自治单元**
* - 直接消费 `useAuthGate` / `useAuthState` / `useAuthDispatch`
* - 直接消费 `useChatDispatch` / `useUserDispatch`登录成功后初始化
* - 消费 `useAuthGate`(内部用 useSession 监听 NextAuth session
* - 消费 `useAuthState` / `useAuthDispatch`邮箱登录流程
* - 消费 `useChatDispatch` / `useUserDispatch`(登录成功后初始化)
* - 自管路由跳转(已登录 / 登录成功 → /chat)
* - Skip 用 `<Link>` 保留 SPA 体验
*
* 设计要点:
* - 仅两个元素:Skip 文本 + Facebook 登录按钮
* - 居中布局 (MainAxisAlignment.center)
* - Facebook 按钮:带渐变(primaryGradient+ 圆角 24 + 高度 48
* - 加载中:按钮内显示 spinner
* - 社交登录按钮直接调 `nextauth.facebookLogin()`NextAuth 流程)
*/
import Link from "next/link";
import { useRouter } from "next/navigation";
@@ -24,7 +20,7 @@ import { useEffect, useRef } from "react";
import { useAuthState, useAuthDispatch } from "@/stores/auth/auth-context";
import { useChatDispatch } from "@/stores/chat/chat-context";
import { useUserDispatch } from "@/stores/user/user-context";
import { useAuthGate } from "@/lib/auth/use-auth-gate";
import { facebookLogin, useAuthGate } from "@/lib/auth/nextauth";
import { ROUTES } from "@/lib/routes";
import { LoadingIndicator } from "@/app/_components/core/loading-indicator";
import styles from "./splash-button.module.css";
@@ -52,7 +48,7 @@ export function SplashButton({ skipHref = ROUTES.chat }: SplashButtonProps) {
if (isAuthed) router.replace(ROUTES.chat);
}, [isAuthed, router]);
// 登录成功跳 /chat + 通知 chat/user 初始化
// 邮箱登录成功跳 /chat + 通知 chat/user 初始化
useEffect(() => {
if (state.isSuccess && !wasSuccess.current) {
wasSuccess.current = true;
@@ -62,6 +58,13 @@ export function SplashButton({ skipHref = ROUTES.chat }: SplashButtonProps) {
}
}, [state.isSuccess, chatDispatch, userDispatch, router]);
const handleFacebookLogin = async () => {
const r = await facebookLogin();
if (!r.success) {
console.error("[splash-button] Facebook login failed", r.error);
}
};
return (
<div className={styles.wrapper}>
{/* Skip 文本链接(next/link 渲染为 <a>,保留 SPA 体验) */}
@@ -77,12 +80,10 @@ export function SplashButton({ skipHref = ROUTES.chat }: SplashButtonProps) {
<div className={styles.separator} aria-hidden="true" />
{/* Facebook 登录按钮(带渐变 */}
{/* 社交登录按钮(NextAuth Facebook OAuth */}
<button
type="button"
onClick={() => {
authDispatch({ type: "AuthFacebookLoginSubmitted" });
}}
onClick={handleFacebookLogin}
disabled={isLoading}
className={styles.facebookButton}
>