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:
+23
-1
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user