fix(auth): sincronizar user Logto → profiles Supabase ao logar

- Profiles Supabase estavam sem user.id do Logto (sub)
- Por isso queries .eq('id', user.id) retornavam 400 Bad Request
- Adiciona syncUserToProfile() que faz upsert em profiles ao logar
- Evita quebra de hooks como UserInfo, useTasks, useObra, etc
This commit is contained in:
2026-08-18 10:36:54 +00:00
parent 397d2e1e34
commit b845623714
+23 -1
View File
@@ -9,6 +9,7 @@ import React, {
useCallback, useCallback,
ReactNode, ReactNode,
} from 'react'; } from 'react';
import { supabase } from '@/integrations/supabase/client';
import { import {
LogtoUser, LogtoUser,
signIn as logtoSignIn, signIn as logtoSignIn,
@@ -19,6 +20,23 @@ import {
requestPasswordReset, requestPasswordReset,
} from '@/lib/logto/client'; } from '@/lib/logto/client';
// Sincroniza user Logto com profiles Supabase
async function syncUserToProfile(user: LogtoUser): Promise<void> {
if (!user?.sub) return;
try {
await supabase.from('profiles').upsert(
{
id: user.sub,
full_name: user.name || user.email || user.username || 'Usuário',
email: user.email || null,
},
{ onConflict: 'id', ignoreDuplicates: false }
);
} catch (err) {
console.warn('Erro ao sincronizar profile Supabase:', err);
}
}
export interface UseAuthReturn { export interface UseAuthReturn {
user: LogtoUser | null; user: LogtoUser | null;
loading: boolean; loading: boolean;
@@ -46,7 +64,10 @@ export function AuthProvider({ children }: { children: ReactNode }) {
setLoading(true); setLoading(true);
handleCallback().then((ok) => { handleCallback().then((ok) => {
if (ok) { if (ok) {
logtoGetUser().then(setUser); logtoGetUser().then((u) => {
setUser(u);
if (u) syncUserToProfile(u);
});
} }
setAuthInitialized(true); setAuthInitialized(true);
setLoading(false); setLoading(false);
@@ -56,6 +77,7 @@ export function AuthProvider({ children }: { children: ReactNode }) {
if (isAuthenticated()) { if (isAuthenticated()) {
logtoGetUser().then((u) => { logtoGetUser().then((u) => {
setUser(u); setUser(u);
if (u) syncUserToProfile(u);
setLoading(false); setLoading(false);
}); });
} else { } else {