expo-duooomi-app/hooks/core/use-route-guard.ts

51 lines
1.2 KiB
TypeScript

import { useRouter, useSegments } from 'expo-router'
import { useEffect } from 'react'
import { useAuth } from './use-auth'
const PUBLIC_ROUTES = [
'', // 根路径
'(tabs)', // tabs 布局
'index', // 首页(探索页)
'auth', // 登录注册页
'pointList', // 积分列表页
'explore',
]
function isPublicRoute(segments: string[]): boolean {
if (segments.length === 0) return true
const firstSegment = segments[0]
if (PUBLIC_ROUTES.includes(firstSegment)) return true
if (firstSegment === '(tabs)' && segments.length >= 2) {
const tabRoute = segments[1]
return tabRoute === 'index'
}
return false
}
export function useRouteGuard() {
const { isAuthenticated, isLoading } = useAuth()
const segments = useSegments()
const router = useRouter()
console.log('useAuth-----------------', { isAuthenticated, isLoading, segments })
useEffect(() => {
if (isLoading) return
const inPublicRoute = isPublicRoute(segments)
const inAuthRoute = segments[0] === 'auth'
if (!isAuthenticated && !inPublicRoute) {
router.replace('/auth')
} else if (isAuthenticated && inAuthRoute) {
router.replace('/(tabs)')
}
}, [isAuthenticated, isLoading, segments])
return { isAuthenticated, isLoading }
}