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:
2026-06-17 09:52:45 +08:00
parent 2acc005809
commit e85963e7bf
5 changed files with 25 additions and 69 deletions
+1 -1
View File
@@ -5,7 +5,7 @@
*
* 把所有功能 Provider 串起来:
* AuthProvider → UserProvider → SidebarProvider → ChatProvider
* + AuthStatusChecker(启动时一次:派发 AuthStatusCheckSubmitted
* + AuthStatusChecker(启动时一次:派发 AuthInit
* + OAuthSessionSync (持续监听 NextAuth session → auth machine
*
* 它们始终挂载,保证各页面直接 `use*State()` / `use*Dispatch()` 即可,