feat(auth): 分享卡直达详情页未登录时先跳登录,登录后回跳原页面

- 家庭详情页 useDidShow 检测无 token 时 reLaunch 登录页并携带 redirect 参数
- 登录页登录成功/已有 token 时优先回跳 redirect 目标,无参数仍进首页
This commit is contained in:
ozh 2026-09-17 14:05:36 +08:00
parent 7f82b2f132
commit a027c6ce2f
2 changed files with 20 additions and 4 deletions

View File

@ -1,6 +1,7 @@
import { useState } from 'react' import { useState } from 'react'
import { useRouter, useDidShow, useShareAppMessage } from '@tarojs/taro' import { useRouter, useDidShow, useShareAppMessage } from '@tarojs/taro'
import { View, Text, Button } from '@tarojs/components' import { View, Text, Button } from '@tarojs/components'
import { useAppSelector } from '@/store/hooks'
import { Navbar } from '@/components/navbar' import { Navbar } from '@/components/navbar'
import { Loading } from '@/components/loading' import { Loading } from '@/components/loading'
import { StateView } from '@/components/state-view' import { StateView } from '@/components/state-view'
@ -10,7 +11,7 @@ import { getHomeDetail, getHomeMemberList, type HomeInfo, type HomeMember } from
import { getCareMemberList, type CareMember } from '@/api/careMember' import { getCareMemberList, type CareMember } from '@/api/careMember'
import { MAX_CARED_PER_FAMILY } from '@/constants/family' import { MAX_CARED_PER_FAMILY } from '@/constants/family'
import { ROUTES } from '@/constants/routes' import { ROUTES } from '@/constants/routes'
import { navigateBack, navigateTo } from '@/utils/navigation' import { navigateBack, navigateTo, reLaunch } from '@/utils/navigation'
import { showToast } from '@/utils/toast' import { showToast } from '@/utils/toast'
import styles from './detail.module.scss' import styles from './detail.module.scss'
@ -29,6 +30,7 @@ const contactsSummary = (c: CareMember): string => {
export default function FamilyDetail() { export default function FamilyDetail() {
const router = useRouter() const router = useRouter()
const familyId = router.params.id ?? '' const familyId = router.params.id ?? ''
const token = useAppSelector((s) => s.auth.token)
const [loading, setLoading] = useState(true) const [loading, setLoading] = useState(true)
const [family, setFamily] = useState<HomeInfo | null>(null) const [family, setFamily] = useState<HomeInfo | null>(null)
@ -36,6 +38,12 @@ export default function FamilyDetail() {
const [caredList, setCaredList] = useState<CareMember[]>([]) const [caredList, setCaredList] = useState<CareMember[]>([])
const load = async () => { const load = async () => {
// 分享卡直达本页且未登录:先去登录,登录后回跳本页
if (!token) {
const target = encodeURIComponent(`${ROUTES.FAMILY_DETAIL}?id=${familyId}&invite=1`)
reLaunch(`${ROUTES.LOGIN}?redirect=${target}`)
return
}
setLoading(true) setLoading(true)
try { try {
const [home, memberList, careList] = await Promise.all([ const [home, memberList, careList] = await Promise.all([

View File

@ -1,6 +1,6 @@
import { useState } from 'react' import { useState } from 'react'
import { View, Text } from '@tarojs/components' import { View, Text } from '@tarojs/components'
import { useDidShow } from '@tarojs/taro' import { useRouter, useDidShow } from '@tarojs/taro'
import { useAppDispatch, useAppSelector } from '@/store/hooks' import { useAppDispatch, useAppSelector } from '@/store/hooks'
import { setAuth } from '@/store/authSlice' import { setAuth } from '@/store/authSlice'
import { performWxLogin, completeUserInfoLogin, getLoginSubState } from './wxLoginFlow' import { performWxLogin, completeUserInfoLogin, getLoginSubState } from './wxLoginFlow'
@ -14,15 +14,23 @@ import styles from './index.module.scss'
export default function Login() { export default function Login() {
const dispatch = useAppDispatch() const dispatch = useAppDispatch()
const toast = useToast() const toast = useToast()
const router = useRouter()
const token = useAppSelector((s) => s.auth.token) const token = useAppSelector((s) => s.auth.token)
const [loading, setLoading] = useState(false) const [loading, setLoading] = useState(false)
// 注册中间态:needUserInfo(待用户资料授权)→ null(初始/完成) // 注册中间态:needUserInfo(待用户资料授权)→ null(初始/完成)
const [needAuth, setNeedAuth] = useState(false) const [needAuth, setNeedAuth] = useState(false)
const [openId, setOpenId] = useState('') const [openId, setOpenId] = useState('')
// 登录后落地页:携带 redirect 参数时优先回跳(守卫踢登录/分享卡直达场景),否则进首页
const afterLoginUrl = () => {
const raw = router.params.redirect
const target = typeof raw === 'string' && raw.startsWith('/') ? decodeURIComponent(raw) : ''
return target || ROUTES.HOME
}
// 已有 token 直接进首页(本期不做 checkLogin 校验,spec D5) // 已有 token 直接进首页(本期不做 checkLogin 校验,spec D5)
useDidShow(() => { useDidShow(() => {
if (token && !loading) reLaunch(ROUTES.HOME) if (token && !loading) reLaunch(afterLoginUrl())
}) })
// 完整登录态校验与落地;未完成时推进授权态 // 完整登录态校验与落地;未完成时推进授权态
@ -49,7 +57,7 @@ export default function Login() {
console.log('[login-page] 登录完成,token 已落地') console.log('[login-page] 登录完成,token 已落地')
setNeedAuth(false) setNeedAuth(false)
dispatch(setAuth({ token, userInfo: result.userInfo })) dispatch(setAuth({ token, userInfo: result.userInfo }))
await reLaunch(ROUTES.HOME) await reLaunch(afterLoginUrl())
} }
const handleWxLogin = async () => { const handleWxLogin = async () => {