fix:splash 界面重定向界面问题
This commit is contained in:
@@ -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],
|
||||
|
||||
@@ -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") 判断
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
* → 业务 token 写入本地 storage
|
||||
*
|
||||
* 此组件**无可见 UI**(返回 null),仅作为 NextAuth session 与 auth state
|
||||
* machine 之间的桥接器。挂在 RootProviders 内、AuthProvider 之后。
|
||||
*
|
||||
* DEBUG:client 端**不**用 Logger(pino 引入会爆 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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user