import React from 'react'; import { View, StyleSheet } from 'react-native'; import { useAuth } from '@/hooks/use-auth'; import { useAuthGuard } from '@/hooks/use-auth-guard'; import { ThemedText } from '@/components/themed-text'; interface AuthGuardProps { children: React.ReactNode; fallback?: React.ReactNode; showLoginPrompt?: boolean; title?: string; subtitle?: string; } /** * 认证守卫组件 * 用于包装需要登录才能访问的内容 * * @param children - 需要保护的内容 * @param fallback - 未登录时显示的自定义内容(可选) * @param showLoginPrompt - 是否显示默认的登录提示(默认true) * @param title - 自定义提示标题 * @param subtitle - 自定义提示副标题 * * @example * ```typescript * * * * * // 自定义提示 * * * * ``` */ export function AuthGuard({ children, fallback, showLoginPrompt = true, title = '需要登录', subtitle = '请先登录以继续使用', }: AuthGuardProps) { const { isAuthenticated, isLoading } = useAuth(); const { requireAuth } = useAuthGuard(); if (isLoading) { return ; } if (!isAuthenticated) { if (fallback) { return <>{fallback}; } if (showLoginPrompt) { return ( 🔒 {title} {subtitle} ); } return null; } return <>{children}; } const styles = StyleSheet.create({ loadingContainer: { flex: 1, }, promptContainer: { flex: 1, alignItems: 'center', justifyContent: 'center', padding: 32, }, iconContainer: { width: 80, height: 80, borderRadius: 40, backgroundColor: 'rgba(0, 122, 255, 0.1)', alignItems: 'center', justifyContent: 'center', marginBottom: 24, }, lockIcon: { fontSize: 40, }, title: { fontSize: 24, fontWeight: '700', marginBottom: 12, textAlign: 'center', }, subtitle: { fontSize: 16, opacity: 0.7, textAlign: 'center', lineHeight: 24, }, });