diff --git a/src/frontend/src/auth/AuthContext.tsx b/src/frontend/src/auth/AuthContext.tsx index 13a6654..37f53dd 100644 --- a/src/frontend/src/auth/AuthContext.tsx +++ b/src/frontend/src/auth/AuthContext.tsx @@ -54,6 +54,11 @@ export function AuthProvider({ children }: { children: ReactNode }) { const changePassword = useCallback(async (currentPassword: string, newPassword: string) => { const u = await api.changePassword(currentPassword, newPassword) setUser(u) + // El Set-Cookie de la respuesta a veces no está visible para el fetch + // siguiente en el mismo microtask (Chrome/Firefox). Confirmamos con + // un round-trip al backend antes de soltar el control, asi React + // monta AuthenticatedApp con la cookie ya lista para los fetches internos. + await api.me() }, []) return ( diff --git a/src/frontend/src/hooks/usePersistedState.ts b/src/frontend/src/hooks/usePersistedState.ts index 268ab47..c42d73d 100644 --- a/src/frontend/src/hooks/usePersistedState.ts +++ b/src/frontend/src/hooks/usePersistedState.ts @@ -29,7 +29,8 @@ export function usePersistedState(): UsePersistedStateResult { setStateInternal(loaded ?? makeDefaultAppState()) } catch (err) { if (err instanceof ApiError && err.status === 401) { - setStateInternal(null) + // No bloquear la UI en 401. Cargar default state. + setStateInternal(makeDefaultAppState()) } else { setErrorMessage(err instanceof Error ? err.message : 'Error cargando estado') }