refactor(auth): rename AuthStatusCheckSubmitted → AuthInit (init-only)
The previous event name implied "re-check status", but the actual
semantics is just "read storage on app start and sync loginStatus into
the machine". It was being dispatched from three sites:
1. AuthStatusChecker mount useEffect (the legit one-time init)
2. AuthStatusChecker loginStatus-watching useEffect (dead code — the
machine's onDone already writes loginStatus, re-reading storage
just returns the same value as a no-op)
3. Sidebar post-logout effect (also dead code — AuthReset directly
sets loginStatus to initialState's "notLoggedIn", and
userLogoutActor already cleared storage, so the values are
already aligned)
This commit:
- Renames event AuthStatusCheckSubmitted → AuthInit in:
* auth-events.ts (type union)
* auth-machine.ts (handler + transition target: checkingAuthStatus →
initializing, mirroring UserInit / initializing in user-machine)
* auth-status-checker.tsx (single dispatch site)
* root-providers.tsx (one comment)
- Simplifies auth-status-checker.tsx from 74 → ~40 lines:
* Removes useEffect ② (loginStatus-watching re-check)
* Removes prevLoginStatusRef + skipNextChangeRef + useAuthState
(dead loop-guard machinery no longer needed)
- Removes the post-logout re-check dispatch from sidebar-screen.tsx:
* AuthReset alone is sufficient — userLogoutActor cleared storage
and AuthReset writes back initialState, so they match by
construction. No re-verification needed.
Net: -44 lines, no behavior change for the happy paths (startup,
login, logout), one fewer source of false re-checks.
This commit is contained in:
@@ -31,7 +31,7 @@ export type { AuthEvent } from "./auth-events";
|
||||
// 在登录成功的 onDone 里自动置 true:
|
||||
// splash / auth screen 看到 `pendingRedirect && loginStatus !== "notLoggedIn"` 跳 /chat
|
||||
// 跳完派 `AuthClearPendingRedirect` 置 false
|
||||
// checkingAuthStatus 不设 flag —— 被动查 token 不算"用户意图"。
|
||||
// `initializing` 不设 flag —— 启动 init 是被动读 token,不算"用户意图"。
|
||||
// ============================================================
|
||||
export const authMachine = setup({
|
||||
types: {
|
||||
@@ -48,6 +48,7 @@ export const authMachine = setup({
|
||||
checkAuthStatus: checkAuthStatusActor,
|
||||
},
|
||||
}).createMachine({
|
||||
/** @xstate-layout N4IgpgJg5mDOIC5QEMCuAXAFgOgJYQBswBiAQQ0wAVkA7MAgWQHsIwBhTWmCAbQAYAuolAAHJrFzpcTGsJAAPRABYAHNgDMAVgCMmzepUB2AGwAmLUu1KANCACeiXYe0bthlQE4PxlUp2GlAF9A2zQsPEIScixmVg4uSH4hJBAxCSkZOUUEH2w+dQ8+E2Ntb3VjTVNbBwQrQ01scw9DQs0ldXVdYNCKCKIyCgAxJgAnAFs2ImQRxME5NMlpWRTsw3Vsbz4PUxN6v0rDasd1FuxtEp8rPlNtbVNTbpAwnHx+6MwAJTgwdCT58UWmRWiC8GxuRm82i27iKR1qphU6z4iM0hnuxi20Mezz6UQoAGV0Mh0KhYBwwABjADW+NQACMxpJ0LNkqIARllqBskpChoEXdTB5bkolHwlMY4R4VKZsG0fFpNMY-IY0djeq88VgAOKoODoAAyTCguBotIZTJZ-3SSyyyl56n59yFVlF4rhmi2jXU7TaKuM2xumjV4Q1AywAFExshcARDcbTfTGehmbw5ikFhzbQgeXw+SoBc6RWKJfZEAEGp4+JoPP4ijzDMGXpEw5hI9GCF9jbBmSMzUmU390+ybcDs-bHYLha6SzVzttZbo9MYAhjqw2Qk91c33lqmEaiHGTX2LanWalh0CuXbcw7806p8W4W4lLL3HdysirPcVI3cS3BsgFJgHSe5UoeCbmsmlpDtal4KNeeYFg+bqlgg9wNEUd5WNW9YPBuOKhu8pAiCIB5GkeiYnoObKwZy8HZjKlTepUIraFonRPtoRh5FW4qdKUhhFHhPQhtuFC7vuYD4nYNAUseUGnlagJ0dy453pOLqPqh2EVtWnTGFo9wOuov6EUMgHAaB0myfJA5pjRylZjmiH3ppKGzjcHiNPkRTVpovhiuuIlNm8FCTGA0yUGANAQCaUBfLFMwUr89nnrRTlVNpmJgms+jNCoHpKEFm7hBSmCUlScXvISxKksQEAyGAeA0AAbkwVJNTiZUVVVBJEiSsAICabUUsSSxJNRaWOaOeiGNgLQ+Gs+TGP6qJwionjYOKRhfh4HSih4v7ddSvVYDVA3EGAIwjKM2CkcSABmoxjNgXXlSdNBQNV-WkkNrVMKNHITalGYjleCB6GoSp8CU3imDo5iHKhC0aK0e3XDcxa-gQTDILFn06nq4H1Y1zVtR1r29DjeNxYT3bgX9I1jTIwNnqDcHZHpYJcQZ7QOtcSM1JYxhnIq5haFWPj+djuP41AdMGuRNCXddt33egT3jJT4TU3LCsM8NAPMzQrNKZmM0eC+JiKlC1znOosKocZeRvgK3oipbxgyzTn1tjGxMNXQZPtZ1VOy3FfuxkrjNG0DgiTezKmIH5Gww+YYpbP6yJwhUMp3kVBheDo3re3LkfE1dN0jHdBCPc92s4LrEdRv70eG4D43xyDF5JxD3jzTyzT+lKtwbe61bzd6hlmNKKraKXzftp2uDdldJNB4bFM4k3vstx2YBdj2McdyzXdsz3WY6CLfC6GYbGWyqNjadWXntAEFgBNKJf4WHPtQJHy9V4jBVlXGudctbb3DrvJeB8V5H3bsbU2MFprgyvtgAqe1lxSn5plWcHoRZaD2l+fI-liqQL-gAeXeOvJqm9Q46ygVAKhFBj6ILPmbMG9F-JqClO0REBQ0TnBnIgHYDRUT5lKJ0ZElR54-wYZQ6hlc1a1w1vXchctmFYFYXHAQCcL4zU2tKO8XgCpKncogfMso+DWOuB0LOOFfywBkhSWme4oBEAAEKAQ6jFGhwct69CcbJVxkkvHUmihAbRnddHd3SjNE4Gg9JGFYgYRUT5ygyldjWZEWxvCOOcSE9xYAwk+IgCA5R4CXo4iCS4gmbjPHeIiVE0+MTz5xNQQYbynRvTXBHicJ8ph-TzR8msFQ0JqxezkTgGpcUAJARAu1EpES-F0IbtgGZn05mWUWY0mKzSTbsOQebVBNwNgnHwYqEo9R1CcUGWcUwPI5Q7R8EEKZ6yCmbIsgsqkSzfFKOrurTWVTAkfKgFs75vzIkIJ0Xo9pXD7jzTvPoXQ4p8g3Kyh0PI219q6D2nhDcNAWBwDkM8DhHNEAAFphEIApQ0Lw9KGUMqVEGN5GoyW9zuC+c4oo2gGDFOcfMT5lwygKBiZE0pUTCRKjgY6lVPrfVqvAI5nDVhjNcA8wohd7ginWiqRoqITC6HKN6KV6jaa6npkrdlWYYTqpzFqh5T8hb5A2H4BEdYVA+C9QvaBrd4zWtHLazoGr8ieG1U6xA0NsAYkXJUfyWI3k73-nvQBPYA3gyDZyzVYbHVPlIY0QZV9+GijIb-DR7x030UzSGh1OrtImC2vyN1BwOimpBcEupoTdkQEraqm8WbQ0BjrbOCWr4BZKgKKiPJbyNlgq+aBSFvayxquDfanNw7HC3HWEKUUH5lSVGCMEIAA */
|
||||
id: "auth",
|
||||
initial: "idle",
|
||||
context: initialState,
|
||||
@@ -78,8 +79,8 @@ export const authMachine = setup({
|
||||
AuthReset: {
|
||||
actions: assign(() => initialState),
|
||||
},
|
||||
// 启动 / 恢复时检查登录态 —— 由 <AuthStatusChecker /> 派发
|
||||
AuthStatusCheckSubmitted: "checkingAuthStatus",
|
||||
// 启动一次性 init:从 storage 同步 loginStatus 到状态机 —— 由 <AuthStatusChecker /> 派发
|
||||
AuthInit: "initializing",
|
||||
|
||||
AuthGuestLoginSubmitted: "loadingGuestLogin",
|
||||
AuthEmailLoginSubmitted: "loadingEmailLogin",
|
||||
@@ -102,12 +103,12 @@ export const authMachine = setup({
|
||||
},
|
||||
},
|
||||
|
||||
checkingAuthStatus: {
|
||||
initializing: {
|
||||
entry: assign({ errorMessage: null }),
|
||||
invoke: {
|
||||
src: "checkAuthStatus",
|
||||
onDone: {
|
||||
target: "idle", // ← status check 完回 idle(不再假冒 success)
|
||||
target: "idle", // ← init 完回 idle(从 storage 拿到 loginStatus 后落地)
|
||||
actions: assign({
|
||||
loginStatus: ({ event }) => event.output,
|
||||
// 不置 pendingRedirect —— 状态查询是被动读 token,不算"用户意图"
|
||||
|
||||
Reference in New Issue
Block a user