fix:splash 界面重定向界面问题

This commit is contained in:
2026-06-11 16:06:36 +08:00
parent a6bc6941d4
commit e3d549d660
6 changed files with 30 additions and 66 deletions
+10 -1
View File
@@ -32,6 +32,14 @@ interface AuthState {
confirmPassword: string;
isLoading: boolean;
errorMessage: string | null;
/**
* 字段名 `isSuccess` 保留(接口兼容),语义改为:
* true = 用户**已登录**loginStatus ∈ {email, google, facebook, apple, guest}
* false = 未登录(loginStatus === "notLoggedIn"
*
* 之前用 `state.matches("success")` 当信号 —— 但 status check 流也会误入
* success,触发 splash-button 误跳 /chat。现改用 `loginStatus` 判定。
*/
isSuccess: boolean;
loginStatus: MachineContext["loginStatus"];
}
@@ -62,7 +70,8 @@ export function AuthProvider({ children }: AuthProviderProps) {
state.matches("loadingOAuth") ||
state.matches("loadingGuestLogin"),
errorMessage: state.context.errorMessage,
isSuccess: state.matches("success"),
// 改用 loginStatus 判断"已登录"(避开 success state 误触发)
isSuccess: state.context.loginStatus !== "notLoggedIn",
loginStatus: state.context.loginStatus,
}),
[state],
+11 -10
View File
@@ -150,6 +150,11 @@ const checkAuthStatusActor = fromPromise<LoginStatus, void>(async () => {
// ============================================================
// Machine
//
// 设计:所有登录/同步流跑完都回 `idle`(带正确 `loginStatus`)。
// **不**再设 `success` state —— 之前曾用 "success" 当"刚成功"信号,
// 但 status check 流也会误入 success,触发 splash-button 误跳 /chat。
// 现在改用 `loginStatus !== "notLoggedIn"` 作为"已登录"信号(见 auth-context.tsx)。
// ============================================================
export const authMachine = setup({
types: {
@@ -220,7 +225,7 @@ export const authMachine = setup({
invoke: {
src: "checkAuthStatus",
onDone: {
target: "success",
target: "idle", // ← status check 完回 idle**不**再假冒 success
actions: assign({
loginStatus: ({ event }) => event.output,
errorMessage: null,
@@ -241,7 +246,7 @@ export const authMachine = setup({
invoke: {
src: "guestLogin",
onDone: {
target: "success",
target: "idle", // ← 改自 "success"
actions: assign({
loginStatus: ({ event }) => event.output,
errorMessage: null,
@@ -266,7 +271,7 @@ export const authMachine = setup({
return { email: event.email, password: event.password };
},
onDone: {
target: "success",
target: "idle", // ← 改自 "success"
actions: assign({
loginStatus: ({ event }) => event.output,
errorMessage: null,
@@ -296,7 +301,7 @@ export const authMachine = setup({
};
},
onDone: {
target: "success",
target: "idle", // ← 改自 "success"
actions: assign({
loginStatus: ({ event }) => event.output,
errorMessage: null,
@@ -343,7 +348,7 @@ export const authMachine = setup({
return { idToken: event.idToken };
},
onDone: {
target: "success",
target: "idle", // ← 改自 "success"
actions: assign({
loginStatus: ({ event }) => event.output,
errorMessage: null,
@@ -368,7 +373,7 @@ export const authMachine = setup({
return { accessToken: event.accessToken };
},
onDone: {
target: "success",
target: "idle", // ← 改自 "success"
actions: assign({
loginStatus: ({ event }) => event.output,
errorMessage: null,
@@ -383,10 +388,6 @@ export const authMachine = setup({
},
},
},
success: {
// 终态:业务层通过 state.matches("success") 判断
},
},
});
+4 -20
View File
@@ -10,10 +10,10 @@
* → 业务 token 写入本地 storage
*
* 此组件**无可见 UI**(返回 null),仅作为 NextAuth session 与 auth state
* machine 之间的桥接器。挂在 RootProviders 内、AuthProvider 之后
*
* DEBUGclient 端**不**用 Loggerpino 引入会爆 client bundle),改用 console.log
* 临时调试,bug 修完即删。
* machine 之间的桥接器。挂在 RootProviders 内、AuthProvider 之后
* <AuthProvider> ← 提供 useAuthState / useAuthDispatch
* <OAuthSessionSync /> ← 用上面两个 hook
* </AuthProvider>
*/
import { useEffect } from "react";
import { useSession } from "next-auth/react";
@@ -26,22 +26,6 @@ export function OAuthSessionSync() {
const { loginStatus } = useAuthState();
useEffect(() => {
// DEBUG:每条 session 变化都打(区分 OAuth 残留 session 是否触发 sync
console.log("[OAuthSessionSync] session change", {
status,
hasSession: !!session,
provider: session?.provider,
idToken: session?.idToken ? `${session.idToken.slice(0, 8)}...` : null,
accessToken: session?.accessToken
? `${session.accessToken.slice(0, 8)}...`
: null,
loginStatus,
willDispatch:
status === "authenticated" &&
!!session?.provider &&
loginStatus !== session.provider,
});
// 1) NextAuth 还没就绪
if (status !== "authenticated" || !session) return;