From d00b830e0af1d2d5499de7a8f465d3847bda8ab6 Mon Sep 17 00:00:00 2001 From: Kurdistan Tech Ministry Date: Wed, 29 Oct 2025 03:59:06 +0300 Subject: [PATCH] fix: Sync email verification status from Supabase Auth MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root Cause: - Dashboard was checking profiles.email_verified column - But Supabase Auth uses user.email_confirmed_at field - This caused verified emails to show as "Unverified" Changes: 1. Dashboard now checks BOTH sources: - Primary: user.email_confirmed_at (Supabase Auth) - Fallback: profile.email_verified (profiles table) 2. Auto-sync profiles table: - When loading profile, sync email_verified from Auth - Updates profiles table if verification status differs 3. UI Improvements: - Show verification date in Account Status card - Display "Verified" badge next to email instead of button - Hide warning message if email is verified - Only show "Verify Email" button if truly unverified This ensures consistent verification status across: - Account Status card (top) - Profile tab (email field) - Security tab (warning message) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- src/pages/Dashboard.tsx | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/pages/Dashboard.tsx b/src/pages/Dashboard.tsx index a423b1fc..0c6ab90d 100644 --- a/src/pages/Dashboard.tsx +++ b/src/pages/Dashboard.tsx @@ -31,7 +31,7 @@ export default function Dashboard() { const fetchProfile = async () => { if (!user) return; - + try { const { data, error } = await supabase .from('profiles') @@ -40,6 +40,20 @@ export default function Dashboard() { .single(); if (error) throw error; + + // Sync email_verified from Supabase Auth + const isEmailVerified = !!user.email_confirmed_at; + + // Update profile with Auth's verification status if different + if (data && data.email_verified !== isEmailVerified) { + await supabase + .from('profiles') + .update({ email_verified: isEmailVerified }) + .eq('id', user.id); + + data.email_verified = isEmailVerified; + } + setProfile(data); } catch (error) { console.error('Error fetching profile:', error); @@ -165,14 +179,16 @@ export default function Dashboard() {
- {profile?.email_verified ? ( + {user?.email_confirmed_at || profile?.email_verified ? ( Verified ) : ( Unverified )}

- Email verification status + {user?.email_confirmed_at + ? `Verified on ${new Date(user.email_confirmed_at).toLocaleDateString()}` + : 'Email verification status'}

@@ -248,7 +264,9 @@ export default function Dashboard() { Email: {user?.email} - {!profile?.email_verified && ( + {user?.email_confirmed_at || profile?.email_verified ? ( + Verified + ) : ( @@ -258,7 +276,7 @@ export default function Dashboard() { Recovery Email: {profile?.recovery_email || 'Not set'} - {profile?.recovery_email_verified && ( + {profile?.recovery_email_verified && profile?.recovery_email && ( Verified )} @@ -383,7 +401,7 @@ export default function Dashboard() { - {!profile?.email_verified && ( + {!user?.email_confirmed_at && !profile?.email_verified && (