From 985c655f6a5f86f893dc49c0e5c0273230d68a9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Ben=C3=ADtez?= Date: Sat, 20 Jun 2026 20:26:47 -0300 Subject: [PATCH] =?UTF-8?q?fix(sprint-5/etapa-4g):=20defer=20updateUser=20?= =?UTF-8?q?=E2=80=94=20evita=20overlay=20Radix=20stuck=20en=20DOM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/ProfileSheet.tsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/ProfileSheet.tsx b/src/components/ProfileSheet.tsx index fe59f82..263f442 100644 --- a/src/components/ProfileSheet.tsx +++ b/src/components/ProfileSheet.tsx @@ -48,12 +48,15 @@ export function ProfileSheet({ open, onOpenChange }: ProfileSheetProps) { const savedName = name.trim() const savedCompany = company.trim() || undefined - // Actualización optimista: aplicar cambios localmente y cerrar el Sheet de inmediato. - // El Sheet nunca queda abierto esperando la respuesta del servidor. - // La modal de Radix bloquea todo el UI mientras está abierta, así que cerramos - // ANTES del fetch para que el usuario pueda seguir trabajando sin demora. - updateUser({ name: savedName, company: savedCompany }) + // Cerramos el Sheet PRIMERO para que Radix inicie la animación de cierre en un + // render limpio. updateUser() se difiere al siguiente macrotask para evitar que + // el re-render de AuthContext (ancestor) interfiera con la animación: si ambas + // actualizaciones ocurren en el mismo tick, React las batchea pero Radix puede + // recibir un render intermedio con open=true que deja el overlay en el DOM. onOpenChange(false) + setTimeout(() => { + updateUser({ name: savedName, company: savedCompany }) + }, 0) // Persistir en Supabase en background — fire & forget. // Usamos raw fetch (no el cliente Supabase) para evitar contención con processLock.