From 1c5329915aca39fa32b9b7b211c5db7efad392f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Ben=C3=ADtez?= Date: Sat, 20 Jun 2026 19:06:30 -0300 Subject: [PATCH] =?UTF-8?q?fix(sprint-5/etapa-4f):=20||=20fallback=20en=20?= =?UTF-8?q?name=20vac=C3=ADo=20=E2=80=94=20bot=C3=B3n=20Guardar=20habilita?= =?UTF-8?q?do=20cuando=20Google=20devuelve=20full=5Fname:=20""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El operador ?? solo hace fallback con null/undefined, no con cadena vacía. Si Google devuelve user_metadata.full_name: "", la cadena de propagación es: buildAuthUser → name="" → upsertUserOnLogin inserta "" → syncProfileFromDB devuelve "" → AuthContext setUser → "" ?? prev.name = "" → ProfileSheet setName("") → name.trim() === '' → botón disabled → click no hace nada. Fix: cambiar ?? por || en todos los puntos donde full_name o name de DB se propagan al estado: buildAuthUser, syncProfileFromDB, getUserFromStorage, useEffect IIFE en AuthContext. Agregar fallback a email en ProfileSheet setName() para usuarios cuya fila en DB ya tiene name="" de sesiones anteriores. Co-Authored-By: Claude Sonnet 4.6 --- src/auth/AuthContext.tsx | 4 ++-- src/auth/SupabaseAuthService.ts | 4 ++-- src/components/ProfileSheet.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/auth/AuthContext.tsx b/src/auth/AuthContext.tsx index 421aa18..b810971 100644 --- a/src/auth/AuthContext.tsx +++ b/src/auth/AuthContext.tsx @@ -30,7 +30,7 @@ function getUserFromStorage(): AuthUser | null { return { id: u.id as string, email, - name: (u.user_metadata?.full_name as string) ?? email, + name: (u.user_metadata?.full_name as string | undefined) || email, avatarUrl: u.user_metadata?.avatar_url as string | undefined, platformRole: email.endsWith('@inquality.com.py') ? 'platform_admin' : 'guest', } @@ -95,7 +95,7 @@ export function AuthProvider({ children }: { children: ReactNode }) { if (profile) { setUser((prev) => prev?.id === userId - ? { ...prev, company: profile.company, name: profile.name ?? prev.name } + ? { ...prev, company: profile.company, name: profile.name || prev.name } : prev ) } diff --git a/src/auth/SupabaseAuthService.ts b/src/auth/SupabaseAuthService.ts index d88212f..9ab9398 100644 --- a/src/auth/SupabaseAuthService.ts +++ b/src/auth/SupabaseAuthService.ts @@ -65,7 +65,7 @@ export class SupabaseAuthService implements AuthService { const { data } = await (signal ? base.abortSignal(signal) : base).maybeSingle() if (!data) return null return { - name: (data.name as string | null) ?? undefined as unknown as string, + name: ((data.name as string | null | undefined) || undefined) as unknown as string, company: (data.company as string | null) ?? undefined, } } @@ -94,7 +94,7 @@ export class SupabaseAuthService implements AuthService { return { id: supabaseUser.id, email, - name: supabaseUser.user_metadata?.full_name as string ?? email, + name: (supabaseUser.user_metadata?.full_name as string | undefined) || email, avatarUrl: supabaseUser.user_metadata?.avatar_url as string ?? undefined, platformRole: email.endsWith('@inquality.com.py') ? 'platform_admin' : 'guest', } diff --git a/src/components/ProfileSheet.tsx b/src/components/ProfileSheet.tsx index 64a1ebe..1842e7c 100644 --- a/src/components/ProfileSheet.tsx +++ b/src/components/ProfileSheet.tsx @@ -37,7 +37,7 @@ export function ProfileSheet({ open, onOpenChange }: ProfileSheetProps) { useEffect(() => { if (open && user) { - setName(user.name) + setName(user.name || user.email || '') setCompany(user.company ?? '') setError(null) }