Bug
ログイン済みの状態で/mypage等の認証必須ページをreloadすると、トークンはlocalStorageに残っているにもかかわらず/loginにリダイレクトされてしまう。
Root cause
<StrictMode>により開発時はAuthProviderのuseEffectが2回実行される。1回目のgetCurrentUser呼び出しはReactのStrict Mode cleanupで即座にabortされるが、AuthProviderはabortされたリクエストかどうかを判定せずにsetUser(null)/setLoading(false)してしまっていた。1回目(abortされた方)のcatchが先に発火して一瞬isLoading=false, user=nullになり、RequireAuthがその状態を見て/loginにリダイレクトする。2回目の本物のリクエストは後で成功するが、その時には手遅れ。
他のhooks(useCreateUser等)はisAbortErrorでabort済みリクエストの結果を無視する実装になっているが、AuthProviderだけこのガードが漏れていた。
Fix
AuthProvider.tsxのgetCurrentUser呼び出しにisAbortErrorガードを追加し、abortされたリクエストの結果で状態を上書きしないようにする。
Acceptance criteria
Bug
ログイン済みの状態で
/mypage等の認証必須ページをreloadすると、トークンはlocalStorageに残っているにもかかわらず/loginにリダイレクトされてしまう。Root cause
<StrictMode>により開発時はAuthProviderのuseEffectが2回実行される。1回目のgetCurrentUser呼び出しはReactのStrict Mode cleanupで即座にabortされるが、AuthProviderはabortされたリクエストかどうかを判定せずにsetUser(null)/setLoading(false)してしまっていた。1回目(abortされた方)のcatchが先に発火して一瞬isLoading=false, user=nullになり、RequireAuthがその状態を見て/loginにリダイレクトする。2回目の本物のリクエストは後で成功するが、その時には手遅れ。他のhooks(
useCreateUser等)はisAbortErrorでabort済みリクエストの結果を無視する実装になっているが、AuthProviderだけこのガードが漏れていた。Fix
AuthProvider.tsxのgetCurrentUser呼び出しにisAbortErrorガードを追加し、abortされたリクエストの結果で状態を上書きしないようにする。Acceptance criteria
/mypageをreloadしても/loginにリダイレクトされない