fix: clean stale auth state on login/setup, unify language switcher

- LoginPage/SetupPage: clear localStorage auth tokens on mount
- AuthContext: clear onboarding state on register, invalidate config on logout
- Extract shared LanguageSwitcher component for consistent UI
- Merge duplicate config import in AuthContext
This commit is contained in:
shinchan-zhai
2026-03-31 15:23:00 +08:00
parent 1d6e99c74a
commit 608f02ed67
4 changed files with 65 additions and 30 deletions

View File

@@ -5,6 +5,7 @@ import { useAuth } from '../../contexts/AuthContext'
import { useLanguage } from '../../contexts/LanguageContext'
import { t } from '../../i18n/translations'
import { DeepVoidBackground } from '../common/DeepVoidBackground'
import { LanguageSwitcher } from '../common/LanguageSwitcher'
import { OnboardingModeSelector } from './OnboardingModeSelector'
import type { UserMode } from '../../lib/onboarding'
@@ -19,6 +20,14 @@ export function LoginPage() {
const [expiredToastId, setExpiredToastId] = useState<string | number | null>(null)
const [mode, setMode] = useState<UserMode>('beginner')
// Clean up stale auth state once on mount
useEffect(() => {
localStorage.removeItem('auth_token')
localStorage.removeItem('auth_user')
localStorage.removeItem('user_id')
}, [])
// Show session-expired toast (re-runs on language change to update text)
useEffect(() => {
if (sessionStorage.getItem('from401') === 'true') {
const id = toast.warning(t('sessionExpired', language), { duration: Infinity })
@@ -44,6 +53,8 @@ export function LoginPage() {
return (
<DeepVoidBackground disableAnimation>
<LanguageSwitcher />
<div className="flex-1 flex items-center justify-center px-4 py-16">
<div className="w-full max-w-sm">