diff --git a/banban-mini/src/pages/login/index.tsx b/banban-mini/src/pages/login/index.tsx index 46aba92..c2214e6 100644 --- a/banban-mini/src/pages/login/index.tsx +++ b/banban-mini/src/pages/login/index.tsx @@ -5,19 +5,46 @@ import Taro from '@tarojs/taro' import { getToken, wechatLogin } from '@/services/auth' import './index.scss' +const LOGIN_PAGE_URL = '/pages/login/index' +const DEFAULT_POST_LOGIN_URL = '/pages/device/index' +const TAB_BAR_ROUTES = new Set([ + '/pages/device/index', + '/pages/chat/index', + '/pages/location/index', + '/pages/sleep/index', +]) + +function consumePostLoginRedirect(): string { + const storedUrl = String(Taro.getStorageSync('postLoginRedirect') || '').trim() + Taro.removeStorageSync('postLoginRedirect') + + if (!storedUrl || storedUrl === LOGIN_PAGE_URL || !storedUrl.startsWith('/pages/')) { + return DEFAULT_POST_LOGIN_URL + } + + return storedUrl +} + +function navigateAfterLogin(url: string): void { + const route = url.split('?')[0] + if (!TAB_BAR_ROUTES.has(route)) { + Taro.reLaunch({ url }) + return + } + + // Tab pages must be opened with switchTab so their lifecycle and custom tab bar refresh. + void Promise.resolve(Taro.switchTab({ url: route })).catch(() => { + Taro.reLaunch({ url: route }) + }) +} + export default function Login() { const [submitting, setSubmitting] = useState(false) const [agreementAccepted, setAgreementAccepted] = useState(false) useEffect(() => { if (getToken()) { - const redirectUrl = String(Taro.getStorageSync('postLoginRedirect') || '').trim() - if (redirectUrl) { - Taro.removeStorageSync('postLoginRedirect') - Taro.reLaunch({ url: redirectUrl }) - return - } - Taro.reLaunch({ url: '/pages/device/index' }) + navigateAfterLogin(consumePostLoginRedirect()) return } @@ -60,13 +87,7 @@ export default function Login() { Taro.showToast({ title: '登录成功', icon: 'success' }) setTimeout(() => { - const redirectUrl = String(Taro.getStorageSync('postLoginRedirect') || '').trim() - if (redirectUrl) { - Taro.removeStorageSync('postLoginRedirect') - Taro.reLaunch({ url: redirectUrl }) - return - } - Taro.reLaunch({ url: '/pages/device/index' }) + navigateAfterLogin(consumePostLoginRedirect()) }, 300) } catch (error: any) { console.error('[login] failed:', error)