import React, { useEffect, useState } from 'react'; import { Navigate } from 'react-router-dom'; import { useAuth } from '@/contexts/AuthContext'; import { usePezkuwi } from '@/contexts/PezkuwiContext'; import { Loader2, Wallet } from 'lucide-react'; import { Button } from '@/components/ui/button'; interface ProtectedRouteProps { children: React.ReactNode; requireAdmin?: boolean; allowTelegramSession?: boolean; } // Check if valid telegram session exists function getTelegramSession(): { telegram_id: string; wallet_address: string; username: string } | null { try { const session = localStorage.getItem('telegram_session'); if (!session) return null; const parsed = JSON.parse(session); // Session expires after 24 hours if (Date.now() - parsed.timestamp > 24 * 60 * 60 * 1000) { localStorage.removeItem('telegram_session'); return null; } return parsed; } catch { return null; } } export const ProtectedRoute: React.FC = ({ children, requireAdmin = false, allowTelegramSession = false }) => { const { user, loading, isAdmin } = useAuth(); const { selectedAccount, connectWallet } = usePezkuwi(); const [walletRestoreChecked, setWalletRestoreChecked] = useState(false); const [forceUpdate, setForceUpdate] = useState(0); const telegramSession = allowTelegramSession ? getTelegramSession() : null; // Listen for wallet changes useEffect(() => { const handleWalletChange = () => { setForceUpdate(prev => prev + 1); }; window.addEventListener('walletChanged', handleWalletChange); return () => window.removeEventListener('walletChanged', handleWalletChange); }, []); // Wait for wallet restoration (max 3 seconds) useEffect(() => { const timeout = setTimeout(() => { setWalletRestoreChecked(true); }, 3000); // If wallet restored earlier, clear timeout if (selectedAccount) { setWalletRestoreChecked(true); clearTimeout(timeout); } return () => clearTimeout(timeout); }, [selectedAccount, forceUpdate]); // Show loading while: // 1. Auth is loading, OR // 2. Wallet restoration not checked yet if (loading || !walletRestoreChecked) { return (

{!walletRestoreChecked ? 'Restoring wallet connection...' : 'Loading...'}

); } // For admin routes, require wallet connection if (requireAdmin && !selectedAccount) { const handleConnect = async () => { await connectWallet(); // Event is automatically dispatched by handleSetSelectedAccount wrapper }; return (

Connect Your Wallet

Admin panel requires wallet authentication. Please connect your wallet to continue.

); } // Allow access if user is logged in OR has valid telegram session if (!user && !telegramSession) { return ; } if (requireAdmin && !isAdmin) { return (

Access Denied

Your wallet ({selectedAccount?.address.slice(0, 8)}...) does not have admin privileges.

Only founder and commission members can access the admin panel.

); } return <>{children}; };