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 (
( Component: React.ComponentType
,
options?: {
requiredRole?: "Admin" | "User";
redirectTo?: Href;
fallback?: React.ReactNode;
}
) {
const ProtectedComponent = function ProtectedComponent(props: P) {
return (