backup/agendamento #60
@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { useRouter, useSearchParams } from "next/navigation";
|
import { useRouter } from "next/navigation";
|
||||||
import { CalendarRegistrationForm } from "@/components/forms/calendar-registration-form";
|
import { CalendarRegistrationForm } from "@/components/forms/calendar-registration-form";
|
||||||
import HeaderAgenda from "@/components/agenda/HeaderAgenda";
|
import HeaderAgenda from "@/components/agenda/HeaderAgenda";
|
||||||
import FooterAgenda from "@/components/agenda/FooterAgenda";
|
import FooterAgenda from "@/components/agenda/FooterAgenda";
|
||||||
@ -38,7 +38,6 @@ interface FormData {
|
|||||||
|
|
||||||
export default function NovoAgendamentoPage() {
|
export default function NovoAgendamentoPage() {
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const searchParams = useSearchParams();
|
|
||||||
const [formData, setFormData] = useState<FormData>({});
|
const [formData, setFormData] = useState<FormData>({});
|
||||||
|
|
||||||
const handleFormChange = (data: FormData) => {
|
const handleFormChange = (data: FormData) => {
|
||||||
@ -88,7 +87,7 @@ export default function NovoAgendamentoPage() {
|
|||||||
const handleCancel = () => {
|
const handleCancel = () => {
|
||||||
// If origin was provided (eg: consultas), return there. Default to calendar.
|
// If origin was provided (eg: consultas), return there. Default to calendar.
|
||||||
try {
|
try {
|
||||||
const origin = searchParams?.get?.('origin');
|
const origin = (typeof window !== 'undefined') ? new URLSearchParams(window.location.search).get('origin') : null;
|
||||||
if (origin === 'consultas') {
|
if (origin === 'consultas') {
|
||||||
router.push('/consultas');
|
router.push('/consultas');
|
||||||
return;
|
return;
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
import { createContext, useContext, useEffect, useState, ReactNode, useCallback, useMemo, useRef } from 'react'
|
import { createContext, useContext, useEffect, useState, ReactNode, useCallback, useMemo, useRef } from 'react'
|
||||||
import { useRouter } from 'next/navigation'
|
import { useRouter } from 'next/navigation'
|
||||||
import { loginUser, logoutUser, AuthenticationError } from '@/lib/auth'
|
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 { ENV_CONFIG } from '@/lib/env-config'
|
||||||
import { isExpired, parseJwt } from '@/lib/jwt'
|
import { isExpired, parseJwt } from '@/lib/jwt'
|
||||||
import { httpClient } from '@/lib/http'
|
import { httpClient } from '@/lib/http'
|
||||||
@ -132,6 +132,16 @@ export function AuthProvider({ children }: { children: ReactNode }) {
|
|||||||
// Restaurar sessão válida
|
// Restaurar sessão válida
|
||||||
const userData = JSON.parse(storedUser) as UserData
|
const userData = JSON.parse(storedUser) as UserData
|
||||||
setToken(storedToken)
|
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
|
// Tentar buscar profile consolidado (user-info) e mesclar
|
||||||
try {
|
try {
|
||||||
const info = await getUserInfo()
|
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)
|
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(
|
saveAuthData(
|
||||||
response.access_token,
|
response.access_token,
|
||||||
response.user,
|
response.user,
|
||||||
|
|||||||
@ -19,8 +19,19 @@ function extractProjectRef(url: string): string | null {
|
|||||||
*/
|
*/
|
||||||
function extractProjectRefFromKey(apiKey: string): string | null {
|
function extractProjectRefFromKey(apiKey: string): string | null {
|
||||||
try {
|
try {
|
||||||
const payload = JSON.parse(atob(apiKey.split('.')[1]));
|
const part = apiKey.split('.')[1];
|
||||||
return payload.ref || null;
|
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 {
|
} catch {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user