From 79eb63ad9629d8d31a73ea45dce3f40ef4037084 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Gustavo?= <166467972+JoaoGustavo-dev@users.noreply.github.com> Date: Mon, 27 Oct 2025 22:25:57 -0300 Subject: [PATCH] add-user-endpoint --- susconecta/app/agenda/page.tsx | 5 ++--- susconecta/hooks/useAuth.tsx | 37 +++++++++++++++++++++++++++++++++- susconecta/lib/env-config.ts | 15 ++++++++++++-- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/susconecta/app/agenda/page.tsx b/susconecta/app/agenda/page.tsx index 747b7d1..5a7630d 100644 --- a/susconecta/app/agenda/page.tsx +++ b/susconecta/app/agenda/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useRouter, useSearchParams } from "next/navigation"; +import { useRouter } from "next/navigation"; import { CalendarRegistrationForm } from "@/components/forms/calendar-registration-form"; import HeaderAgenda from "@/components/agenda/HeaderAgenda"; import FooterAgenda from "@/components/agenda/FooterAgenda"; @@ -38,7 +38,6 @@ interface FormData { export default function NovoAgendamentoPage() { const router = useRouter(); - const searchParams = useSearchParams(); const [formData, setFormData] = useState({}); const handleFormChange = (data: FormData) => { @@ -88,7 +87,7 @@ export default function NovoAgendamentoPage() { const handleCancel = () => { // If origin was provided (eg: consultas), return there. Default to calendar. try { - const origin = searchParams?.get?.('origin'); + const origin = (typeof window !== 'undefined') ? new URLSearchParams(window.location.search).get('origin') : null; if (origin === 'consultas') { router.push('/consultas'); return; diff --git a/susconecta/hooks/useAuth.tsx b/susconecta/hooks/useAuth.tsx index c0df897..fd79c8b 100644 --- a/susconecta/hooks/useAuth.tsx +++ b/susconecta/hooks/useAuth.tsx @@ -2,7 +2,7 @@ import { createContext, useContext, useEffect, useState, ReactNode, useCallback, useMemo, useRef } from 'react' import { useRouter } from 'next/navigation' import { loginUser, logoutUser, AuthenticationError } from '@/lib/auth' -import { getUserInfo } from '@/lib/api' +import { getUserInfo, getCurrentUser } from '@/lib/api' import { ENV_CONFIG } from '@/lib/env-config' import { isExpired, parseJwt } from '@/lib/jwt' import { httpClient } from '@/lib/http' @@ -132,6 +132,16 @@ export function AuthProvider({ children }: { children: ReactNode }) { // Restaurar sessão válida const userData = JSON.parse(storedUser) as UserData setToken(storedToken) + // Também buscar o usuário autenticado (/auth/v1/user) para garantir id/email atualizados + try { + const authUser = await getCurrentUser().catch(() => null) + if (authUser) { + userData.id = authUser.id ?? userData.id + userData.email = authUser.email ?? userData.email + } + } catch (e) { + console.warn('[AUTH] Falha ao buscar /auth/v1/user durante restauração de sessão:', e) + } // Tentar buscar profile consolidado (user-info) e mesclar try { const info = await getUserInfo() @@ -247,6 +257,31 @@ export function AuthProvider({ children }: { children: ReactNode }) { console.warn('[AUTH] Falha ao buscar user-info após login (não crítico):', err) } + // Também chamar /auth/v1/user para obter dados básicos do usuário autenticado + try { + const curRes = await fetch(`${ENV_CONFIG.SUPABASE_URL}/auth/v1/user`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + 'Accept': 'application/json', + 'Authorization': `Bearer ${response.access_token}`, + 'apikey': ENV_CONFIG.SUPABASE_ANON_KEY, + } + }) + if (curRes.ok) { + const cu = await curRes.json().catch(() => null) + if (cu && response.user) { + response.user.id = cu.id ?? response.user.id + response.user.email = cu.email ?? response.user.email + } + } else { + // não crítico + console.warn('[AUTH] /auth/v1/user retornou', curRes.status) + } + } catch (e) { + console.warn('[AUTH] Erro ao chamar /auth/v1/user após login (não crítico):', e) + } + saveAuthData( response.access_token, response.user, diff --git a/susconecta/lib/env-config.ts b/susconecta/lib/env-config.ts index cd41cda..ce60061 100644 --- a/susconecta/lib/env-config.ts +++ b/susconecta/lib/env-config.ts @@ -19,8 +19,19 @@ function extractProjectRef(url: string): string | null { */ function extractProjectRefFromKey(apiKey: string): string | null { try { - const payload = JSON.parse(atob(apiKey.split('.')[1])); - return payload.ref || null; + const part = apiKey.split('.')[1]; + if (!part) return null; + // Decode base64 payload in both browser and Node environments + let jsonStr: string | null = null; + if (typeof atob === 'function') { + try { jsonStr = atob(part); } catch (e) { jsonStr = null; } + } + if (!jsonStr && typeof Buffer !== 'undefined') { + try { jsonStr = Buffer.from(part, 'base64').toString('utf8'); } catch (e) { jsonStr = null; } + } + if (!jsonStr) return null; + const payload = JSON.parse(jsonStr); + return payload?.ref ?? payload?.project_ref ?? null; } catch { return null; }