From 4e0c246e05c6febf8896014ce69e18622e4e55f6 Mon Sep 17 00:00:00 2001 From: Jonas Francisco Date: Sat, 8 Nov 2025 01:08:10 -0300 Subject: [PATCH 1/3] =?UTF-8?q?fix(configuracao):=20exclui=20bot=C3=A3o=20?= =?UTF-8?q?de=20configura=C3=A7=C3=A3o=20que=20n=C3=A3o=20levava=20para=20?= =?UTF-8?q?nenhum=20lugar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- susconecta/components/features/dashboard/header.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/susconecta/components/features/dashboard/header.tsx b/susconecta/components/features/dashboard/header.tsx index c9587cf..5f26a0d 100644 --- a/susconecta/components/features/dashboard/header.tsx +++ b/susconecta/components/features/dashboard/header.tsx @@ -94,11 +94,9 @@ export function PagesHeader({ title = "", subtitle = "" }: { title?: string, sub }} className="w-full text-left px-4 py-2 text-sm hover:bg-accent cursor-pointer" > - 👤 Perfil - - +
From 68c38dba8837ae2e65e4827082d8bd943746c655 Mon Sep 17 00:00:00 2001 From: Jonas Francisco Date: Sat, 8 Nov 2025 01:22:29 -0300 Subject: [PATCH 2/3] =?UTF-8?q?feat(header):=20mostrar=20foto=20do=20usu?= =?UTF-8?q?=C3=A1rio=20no=20avatar=20do=20topo=20Usa=20profile.foto=5Furl|?= =?UTF-8?q?fotoUrl|avatar=5Furl=20como=20src=20e=20fallback=20com=20inicia?= =?UTF-8?q?is=20geradas=20a=20partir=20do=20nome/e-mail.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- susconecta/app/(main-routes)/perfil/page.tsx | 2 +- susconecta/app/paciente/page.tsx | 2 +- susconecta/app/profissional/page.tsx | 2 +- .../components/features/dashboard/header.tsx | 27 +++++++++++++++++-- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/susconecta/app/(main-routes)/perfil/page.tsx b/susconecta/app/(main-routes)/perfil/page.tsx index 0308815..734aa6f 100644 --- a/susconecta/app/(main-routes)/perfil/page.tsx +++ b/susconecta/app/(main-routes)/perfil/page.tsx @@ -296,7 +296,7 @@ export default function PerfilPage() { className="bg-blue-600 hover:bg-blue-700" onClick={handleEditClick} > - ✏️ Editar Perfil + Editar Perfil ) : (
diff --git a/susconecta/app/paciente/page.tsx b/susconecta/app/paciente/page.tsx index aadb86d..a8b4890 100644 --- a/susconecta/app/paciente/page.tsx +++ b/susconecta/app/paciente/page.tsx @@ -1562,7 +1562,7 @@ export default function PacientePage() { className="bg-blue-600 hover:bg-blue-700 w-full sm:w-auto whitespace-nowrap text-xs sm:text-sm" onClick={() => setIsEditingProfile(true)} > - ✏️ Editar Perfil + Editar Perfil ) : (
diff --git a/susconecta/app/profissional/page.tsx b/susconecta/app/profissional/page.tsx index bb715ad..34afd8a 100644 --- a/susconecta/app/profissional/page.tsx +++ b/susconecta/app/profissional/page.tsx @@ -2780,7 +2780,7 @@ const ProfissionalPage = () => { className="bg-blue-600 hover:bg-blue-700 text-xs sm:text-sm w-full sm:w-auto" onClick={() => setIsEditingProfile(true)} > - ✏️ Editar Perfil + Editar Perfil ) : (
diff --git a/susconecta/components/features/dashboard/header.tsx b/susconecta/components/features/dashboard/header.tsx index 5f26a0d..5b78f26 100644 --- a/susconecta/components/features/dashboard/header.tsx +++ b/susconecta/components/features/dashboard/header.tsx @@ -60,9 +60,32 @@ export function PagesHeader({ title = "", subtitle = "" }: { title?: string, sub className="relative h-8 w-8 rounded-full border-2 border-border hover:border-primary" onClick={() => setDropdownOpen(!dropdownOpen)} > + {/* Mostrar foto do usuário quando disponível; senão, mostrar fallback com iniciais */} - - RA + { + (() => { + const userPhoto = (user as any)?.profile?.foto_url || (user as any)?.profile?.fotoUrl || (user as any)?.profile?.avatar_url + const alt = user?.name || user?.email || 'Usuário' + + const getInitials = (name?: string, email?: string) => { + if (name) { + const parts = name.trim().split(/\s+/) + const first = parts[0]?.charAt(0) ?? '' + const second = parts[1]?.charAt(0) ?? '' + return (first + second).toUpperCase() || (email?.charAt(0) ?? 'U').toUpperCase() + } + if (email) return email.charAt(0).toUpperCase() + return 'U' + } + + return ( + <> + + {getInitials(user?.name, user?.email)} + + ) + })() + } From ca282e721e5d53ff6c36916479286fccadbe1964 Mon Sep 17 00:00:00 2001 From: Jonas Francisco Date: Sat, 8 Nov 2025 01:36:44 -0300 Subject: [PATCH 3/3] fix(consulta) corrigir o erro na parte de cancelar consulta --- susconecta/app/paciente/page.tsx | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/susconecta/app/paciente/page.tsx b/susconecta/app/paciente/page.tsx index a8b4890..d42f6c9 100644 --- a/susconecta/app/paciente/page.tsx +++ b/susconecta/app/paciente/page.tsx @@ -867,17 +867,33 @@ export default function PacientePage() { try { const ok = typeof window !== 'undefined' ? window.confirm('Deseja realmente cancelar esta consulta?') : true if (!ok) return - // call API to delete - await deletarAgendamento(consulta.id) - // Mark as deleted in cache so it won't appear again - addDeletedAppointmentId(consulta.id) - // remove from local list + + // Prefer PATCH to mark appointment as cancelled (safer under RLS) + try { + await atualizarAgendamento(consulta.id, { + cancelled_at: new Date().toISOString(), + status: 'cancelled', + cancellation_reason: 'Cancelado pelo paciente' + }) + } catch (patchErr) { + // Fallback: try hard delete if server allows it + try { + await deletarAgendamento(consulta.id) + } catch (delErr) { + // Re-throw original patch error if both fail + throw patchErr || delErr + } + } + + // remove from local list so UI updates immediately setAppointments((prev) => { if (!prev) return prev return prev.filter((a: any) => String(a.id) !== String(consulta.id)) }) // if modal open for this appointment, close it if (selectedAppointment && String(selectedAppointment.id) === String(consulta.id)) setSelectedAppointment(null) + // Optionally persist to deleted cache to help client-side filtering + try { addDeletedAppointmentId(consulta.id) } catch(e) {} setToast({ type: 'success', msg: 'Consulta cancelada.' }) } catch (err: any) { console.error('[Consultas] falha ao cancelar agendamento', err)