import '../global.css'
import { DarkTheme, DefaultTheme, ThemeProvider } from '@react-navigation/native'
import { Stack, usePathname, useRouter } from 'expo-router'
import { StatusBar } from 'expo-status-bar'
import { useEffect } from 'react'
import 'react-native-reanimated'
import { GestureHandlerRootView } from 'react-native-gesture-handler'
import { View, ActivityIndicator } from 'react-native'
import { useColorScheme } from '@/hooks/use-color-scheme'
import { KeyboardProvider } from 'react-native-keyboard-controller'
import { SafeAreaProvider } from 'react-native-safe-area-context'
import { ModalPortal } from '@/components/ui'
import '@/lib/i18n'
import { useSession } from '@/lib/auth'
export const unstable_settings = {
anchor: '(tabs)',
}
// 受保护的路由(需要登录才能访问)
const PROTECTED_ROUTES = [
'/(tabs)',
'/channels',
'/generateVideo',
'/generationRecord',
'/worksList',
'/membership',
'/changePassword',
]
// 公开路由(无需登录)
const PUBLIC_ROUTES = [
'/auth',
'/modal',
'/searchTemplate',
'/searchResults',
'/searchWorks',
'/searchWorksResults',
'/templateDetail',
'/terms',
'/privacy',
]
// 认证守卫组件
function AuthGuard({ children }: { children: React.ReactNode }) {
const pathname = usePathname()
const router = useRouter()
const { data: session, isPending } = useSession()
useEffect(() => {
// 加载中不处理
if (isPending) return
// 检查是否在受保护路由
const isProtectedRoute = PROTECTED_ROUTES.some(route => pathname?.startsWith(route))
// 未登录访问受保护路由 -> 跳转到登录页
if (isProtectedRoute && !session?.user) {
router.replace('/auth')
return
}
// 已登录访问登录页 -> 跳转到首页
if (pathname === '/auth' && session?.user) {
router.replace('/(tabs)')
return
}
}, [pathname, session, isPending, router])
// 加载中显示 loading
if (isPending) {
return (
)
}
return <>{children}>
}
// 路由层
export default function RootLayout() {
return (
)
}
function Providers({ children }: { children: React.ReactNode }) {
const colorScheme = useColorScheme()
return (
{children}
{/* modals */}
{/* 挂载全局方法 */}
((global as any).actionSheet = ref)} />
((global as any).modal = ref)} />
((global as any).loading = ref)} />
((global as any).toast = ref)} />
)
}