import { useEffect, useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Alert, AlertDescription } from '@/components/ui/alert'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Separator } from '@/components/ui/separator'; import { Progress } from '@/components/ui/progress'; import { Mail, Info, CheckCircle2, Circle, Loader2 } from 'lucide-react'; import { supabase } from '@/lib/supabaseClient'; import { handleError, handleSuccess } from '@/lib/errorHandler'; interface EmailChangeStatusProps { currentEmail: string; pendingEmail: string; onCancel: () => void; } type EmailChangeData = { has_pending_change: boolean; current_email?: string; new_email?: string; current_email_verified?: boolean; new_email_verified?: boolean; change_sent_at?: string; }; export function EmailChangeStatus({ currentEmail, pendingEmail, onCancel }: EmailChangeStatusProps) { const [verificationStatus, setVerificationStatus] = useState({ oldEmailVerified: false, newEmailVerified: false }); const [loading, setLoading] = useState(true); const [resending, setResending] = useState(false); const checkVerificationStatus = async () => { try { const { data, error } = await supabase.rpc('get_email_change_status'); if (error) throw error; const emailData = data as EmailChangeData; if (emailData.has_pending_change) { setVerificationStatus({ oldEmailVerified: emailData.current_email_verified || false, newEmailVerified: emailData.new_email_verified || false }); } } catch (error: unknown) { handleError(error, { action: 'Check verification status' }); } finally { setLoading(false); } }; useEffect(() => { checkVerificationStatus(); // Poll every 30 seconds const interval = setInterval(checkVerificationStatus, 30000); return () => clearInterval(interval); }, []); const handleResendVerification = async () => { setResending(true); try { const { error } = await supabase.auth.updateUser({ email: pendingEmail }); if (error) throw error; handleSuccess( 'Verification emails resent', 'Check your inbox for the verification links.' ); } catch (error: unknown) { handleError(error, { action: 'Resend verification emails' }); } finally { setResending(false); } }; const verificationProgress = (verificationStatus.oldEmailVerified ? 50 : 0) + (verificationStatus.newEmailVerified ? 50 : 0); if (loading) { return ( ); } return ( Email Change in Progress To complete your email change, both emails must be verified. {/* Progress indicator */} {verificationStatus.oldEmailVerified ? ( ) : ( )} Current Email {currentEmail} {verificationStatus.oldEmailVerified && ( Verified )} {verificationStatus.newEmailVerified ? ( ) : ( )} New Email {pendingEmail} {verificationStatus.newEmailVerified && ( Verified )} {/* Action buttons */} {resending ? ( <> Resending... > ) : ( 'Resend Verification Emails' )} Cancel Change {/* Progress bar */} Progress {verificationProgress}% ); }
Current Email
{currentEmail}
New Email
{pendingEmail}