import React from 'react'; import { Navigate } from 'react-router-dom'; import { useAuth } from '@clerk/clerk-react'; import { Box, CircularProgress, Typography, Alert, Button } from '@mui/material'; import { Refresh as RefreshIcon } from '@mui/icons-material'; import { useOnboarding } from '../../contexts/OnboardingContext'; interface ProtectedRouteProps { children: React.ReactNode; } const ProtectedRoute: React.FC = ({ children }) => { const { isLoaded, isSignedIn } = useAuth(); // Use onboarding context instead of making API calls const { loading, error, isOnboardingComplete, refresh, clearError } = useOnboarding(); // Local fallback (in case context hasn't refreshed yet right after completion) const localComplete = (() => { try { return localStorage.getItem('onboarding_complete') === 'true'; } catch { return false; } })(); const allowAccess = isOnboardingComplete || localComplete; // Wait for Clerk to load before any redirect decisions if (!isLoaded) { return ( ); } // Loading state from context - show spinner unless local flag says complete if (loading && !localComplete) { console.log('ProtectedRoute: Loading onboarding state from context...'); return ( Verifying access... ); } // Error state - show error with retry (unless local flag allows pass-through) if (error && !localComplete) { console.error('ProtectedRoute: Error from context:', error); return ( Access Error { clearError(); refresh(); }} startIcon={} > Retry } > {error} Please try refreshing or complete the setup process first. ); } // Not signed in - redirect to landing if (isLoaded && !isSignedIn) { console.log('ProtectedRoute: Not signed in, redirecting to landing'); return ; } // Onboarding not complete - redirect to onboarding if (!allowAccess) { console.log('ProtectedRoute: Onboarding not complete (context/local), redirecting'); return ; } // All checks passed - render protected component console.log('ProtectedRoute: Access granted (context/local), rendering component'); return <>{children}; }; export default ProtectedRoute;