import React, { useEffect } from "react"; import { ActivityIndicator, View } from "react-native"; import { type Href } from "expo-router"; import { useNavigation } from "../../context/NavigationContext"; import { useColorScheme } from "nativewind"; import { useAuth, useRole } from "../../hooks/useAuth"; import { useAppConfig } from "../../context/AppConfigContext"; interface ProtectedRouteProps { children: React.ReactNode; requiredRole?: "Admin" | "User"; redirectTo?: Href; fallback?: React.ReactNode; } export function ProtectedRoute({ children, requiredRole, redirectTo, fallback, }: ProtectedRouteProps) { const { isAuthenticated, isLoading, user } = useAuth(); const router = useNavigation(); const { routes } = useAppConfig(); const hasRequiredRole = useRole(requiredRole || "User"); const { colorScheme } = useColorScheme(); const isDark = colorScheme === "dark"; useEffect(() => { if (!isLoading) { if (!isAuthenticated) { router.replace((redirectTo ?? routes.login) as Href); } else if (requiredRole && !hasRequiredRole) { router.replace(routes.home); } } }, [isAuthenticated, isLoading, hasRequiredRole, requiredRole, user, router, redirectTo, routes]); if (isLoading) { if (fallback) { return <>{fallback}; } return ( ); } if (!isAuthenticated || (requiredRole && !hasRequiredRole)) { return null; } return <>{children}; } export function withAuth

( Component: React.ComponentType

, options?: { requiredRole?: "Admin" | "User"; redirectTo?: Href; fallback?: React.ReactNode; } ) { const ProtectedComponent = function ProtectedComponent(props: P) { return ( ); }; ProtectedComponent.displayName = `withAuth(${Component.displayName || Component.name || "Component"})`; return ProtectedComponent; } export function useProtectedContent(requiredRole?: "Admin" | "User") { const { isAuthenticated, isLoading, user } = useAuth(); const hasRole = useRole(requiredRole || "User"); return { canAccess: isAuthenticated && (!requiredRole || hasRole), isLoading, user, }; } export default ProtectedRoute;