import React, { useEffect, useState, useRef } from 'react'; import { useNavigate, useSearchParams, Link } from 'react-router-dom'; import axios from 'axios'; import { Button } from '../components/ui/button'; import { Card } from '../components/ui/card'; import { CheckCircle, XCircle, Loader2 } from 'lucide-react'; import PublicNavbar from '../components/PublicNavbar'; import PublicFooter from '../components/PublicFooter'; const API_URL = process.env.REACT_APP_BACKEND_URL; const VerifyEmail = () => { const navigate = useNavigate(); const [searchParams] = useSearchParams(); const [status, setStatus] = useState('loading'); const [message, setMessage] = useState(''); const token = searchParams.get('token'); const hasVerified = useRef(false); useEffect(() => { const verifyEmail = async () => { // Prevent double execution in React StrictMode if (hasVerified.current) { return; } hasVerified.current = true; if (!token) { setStatus('error'); setMessage('Invalid verification link.'); return; } try { const response = await axios.get(`${API_URL}/api/auth/verify-email?token=${token}`); setStatus('success'); setMessage(response.data.message); } catch (error) { setStatus('error'); setMessage(error.response?.data?.detail || 'Verification failed. Please try again.'); } }; verifyEmail(); }, [token]); return (
Please wait while we verify your email address.
> )} {status === 'success' && ( <>{message}
Next steps: Attend an event and meet a board member within 90 days. Once you've attended an event, our admin team will review your application.
> )} {status === 'error' && ( <>{message}
> )}