diff --git a/susconecta/app/(main-routes)/doutores/page.tsx b/susconecta/app/(main-routes)/doutores/page.tsx
index 3e958f7..5038403 100644
--- a/susconecta/app/(main-routes)/doutores/page.tsx
+++ b/susconecta/app/(main-routes)/doutores/page.tsx
@@ -623,7 +623,7 @@ export default function DoutoresPage() {
size="sm"
onClick={() => setCurrentPage(1)}
disabled={currentPage === 1}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Primeira
@@ -632,7 +632,7 @@ export default function DoutoresPage() {
size="sm"
onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))}
disabled={currentPage === 1}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Anterior
@@ -644,7 +644,7 @@ export default function DoutoresPage() {
size="sm"
onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))}
disabled={currentPage === totalPages || totalPages === 0}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Próxima
@@ -653,7 +653,7 @@ export default function DoutoresPage() {
size="sm"
onClick={() => setCurrentPage(totalPages)}
disabled={currentPage === totalPages || totalPages === 0}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Última
diff --git a/susconecta/app/(main-routes)/pacientes/page.tsx b/susconecta/app/(main-routes)/pacientes/page.tsx
index df77a10..32ee249 100644
--- a/susconecta/app/(main-routes)/pacientes/page.tsx
+++ b/susconecta/app/(main-routes)/pacientes/page.tsx
@@ -320,7 +320,7 @@ export default function PacientesPage() {
size="sm"
onClick={() => setCurrentPage(1)}
disabled={currentPage === 1}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Primeira
@@ -329,7 +329,7 @@ export default function PacientesPage() {
size="sm"
onClick={() => setCurrentPage((prev) => Math.max(1, prev - 1))}
disabled={currentPage === 1}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Anterior
@@ -341,7 +341,7 @@ export default function PacientesPage() {
size="sm"
onClick={() => setCurrentPage((prev) => Math.min(totalPages, prev + 1))}
disabled={currentPage === totalPages || totalPages === 0}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Próxima
@@ -350,7 +350,7 @@ export default function PacientesPage() {
size="sm"
onClick={() => setCurrentPage(totalPages)}
disabled={currentPage === totalPages || totalPages === 0}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Última
diff --git a/susconecta/app/login-admin/page.tsx b/susconecta/app/login-admin/page.tsx
index f99f365..544ef43 100644
--- a/susconecta/app/login-admin/page.tsx
+++ b/susconecta/app/login-admin/page.tsx
@@ -154,7 +154,7 @@ export default function LoginAdminPage() {
-
+
Voltar ao Início
diff --git a/susconecta/app/login-paciente/page.tsx b/susconecta/app/login-paciente/page.tsx
index 2d125ab..b2dc8cf 100644
--- a/susconecta/app/login-paciente/page.tsx
+++ b/susconecta/app/login-paciente/page.tsx
@@ -240,7 +240,7 @@ export default function LoginPacientePage() {
-
+
Voltar ao Início
diff --git a/susconecta/app/login/page.tsx b/susconecta/app/login/page.tsx
index 2a9f105..23384fc 100644
--- a/susconecta/app/login/page.tsx
+++ b/susconecta/app/login/page.tsx
@@ -164,7 +164,7 @@ export default function LoginPage() {
-
+
Voltar ao Início
diff --git a/susconecta/app/paciente/page.tsx b/susconecta/app/paciente/page.tsx
index fd7d9bc..5e73f98 100644
--- a/susconecta/app/paciente/page.tsx
+++ b/susconecta/app/paciente/page.tsx
@@ -650,7 +650,7 @@ export default function PacientePage() {
-
+
Pesquisar Médicos
@@ -677,7 +677,7 @@ export default function PacientePage() {
size="icon"
onClick={(e: any) => { e.stopPropagation(); e.preventDefault(); navigateDate('prev') }}
aria-label="Dia anterior"
- className={`group shadow-sm hover:!bg-primary hover:!text-white hover:!border-primary transition-all ${hoverPrimaryIconClass}`}
+ className={`group shadow-sm hover:bg-primary! hover:text-white! hover:border-primary! transition-all ${hoverPrimaryIconClass}`}
>
@@ -688,7 +688,7 @@ export default function PacientePage() {
size="icon"
onClick={(e: any) => { e.stopPropagation(); e.preventDefault(); navigateDate('next') }}
aria-label="Próximo dia"
- className={`group shadow-sm hover:!bg-primary hover:!text-white hover:!border-primary transition-all ${hoverPrimaryIconClass}`}
+ className={`group shadow-sm hover:bg-primary! hover:text-white! hover:border-primary! transition-all ${hoverPrimaryIconClass}`}
>
@@ -780,7 +780,7 @@ export default function PacientePage() {
Detalhes
@@ -788,7 +788,7 @@ export default function PacientePage() {
Reagendar
@@ -797,7 +797,7 @@ export default function PacientePage() {
Cancelar
@@ -1312,8 +1312,8 @@ export default function PacientePage() {
Data: {new Date(r.report_date || r.created_at || Date.now()).toLocaleDateString('pt-BR')}
- { setSelectedReport(r); }}>{strings.visualizarLaudo}
- { try { await navigator.clipboard.writeText(JSON.stringify(r)); setToast({ type: 'success', msg: 'Laudo copiado.' }) } catch { setToast({ type: 'error', msg: 'Falha ao copiar.' }) } }}>{strings.compartilhar}
+ { setSelectedReport(r); }}>{strings.visualizarLaudo}
+ { try { await navigator.clipboard.writeText(JSON.stringify(r)); setToast({ type: 'success', msg: 'Laudo copiado.' }) } catch { setToast({ type: 'error', msg: 'Falha ao copiar.' }) } }}>{strings.compartilhar}
))}
@@ -1543,7 +1543,7 @@ export default function PacientePage() {
-
+
Início
@@ -1553,7 +1553,7 @@ export default function PacientePage() {
variant="outline"
aria-label={strings.sair}
disabled={loading}
- className="text-destructive border-destructive hover:!bg-destructive hover:!text-white hover:!border-destructive transition-colors"
+ className="text-destructive border-destructive hover:bg-destructive! hover:text-white! hover:border-destructive! transition-colors"
>
{strings.sair}
@@ -1569,7 +1569,7 @@ export default function PacientePage() {
variant={tab==='dashboard'?'default':'ghost'}
aria-current={tab==='dashboard'}
onClick={()=>setTab('dashboard')}
- className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
+ className={`w-full justify-start transition-colors hover:bg-primary! hover:text-white! cursor-pointer`}
>
{strings.dashboard}
@@ -1577,7 +1577,7 @@ export default function PacientePage() {
variant={tab==='consultas'?'default':'ghost'}
aria-current={tab==='consultas'}
onClick={()=>setTab('consultas')}
- className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
+ className={`w-full justify-start transition-colors hover:bg-primary! hover:text-white! cursor-pointer`}
>
{strings.consultas}
@@ -1585,7 +1585,7 @@ export default function PacientePage() {
variant={tab==='exames'?'default':'ghost'}
aria-current={tab==='exames'}
onClick={()=>setTab('exames')}
- className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
+ className={`w-full justify-start transition-colors hover:bg-primary! hover:text-white! cursor-pointer`}
>
{strings.exames}
@@ -1594,7 +1594,7 @@ export default function PacientePage() {
variant={tab==='perfil'?'default':'ghost'}
aria-current={tab==='perfil'}
onClick={()=>setTab('perfil')}
- className={`w-full justify-start transition-colors hover:!bg-primary hover:!text-white cursor-pointer`}
+ className={`w-full justify-start transition-colors hover:bg-primary! hover:text-white! cursor-pointer`}
>
{strings.perfil}
diff --git a/susconecta/app/profissional/page.tsx b/susconecta/app/profissional/page.tsx
index 74794b5..9e36aaf 100644
--- a/susconecta/app/profissional/page.tsx
+++ b/susconecta/app/profissional/page.tsx
@@ -690,7 +690,7 @@ const ProfissionalPage = () => {
variant="outline"
size="sm"
onClick={() => navigateDate('prev')}
- className="p-2 hover:!bg-primary hover:!text-white cursor-pointer transition-colors"
+ className="p-2 hover:bg-primary! hover:text-white! cursor-pointer transition-colors"
>
@@ -701,7 +701,7 @@ const ProfissionalPage = () => {
variant="outline"
size="sm"
onClick={() => navigateDate('next')}
- className="p-2 hover:!bg-primary hover:!text-white cursor-pointer transition-colors"
+ className="p-2 hover:bg-primary! hover:text-white! cursor-pointer transition-colors"
>
@@ -900,7 +900,7 @@ const ProfissionalPage = () => {
variant={selectedRange === 'todos' ? 'default' : 'outline'}
size="sm"
onClick={() => setSelectedRange('todos')}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Todos
@@ -908,7 +908,7 @@ const ProfissionalPage = () => {
variant={selectedRange === 'semana' ? 'default' : 'outline'}
size="sm"
onClick={() => setSelectedRange('semana')}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Semana
@@ -916,7 +916,7 @@ const ProfissionalPage = () => {
variant={selectedRange === 'mes' ? 'default' : 'outline'}
size="sm"
onClick={() => setSelectedRange('mes')}
- className="hover:!bg-primary hover:!text-white transition-colors"
+ className="hover:bg-primary! hover:text-white! transition-colors"
>
Mês
@@ -1077,7 +1077,7 @@ const ProfissionalPage = () => {
Buscar
-
+
Limpar
@@ -1383,7 +1383,7 @@ const ProfissionalPage = () => {
setIsViewing(true);
}
}}
- className="flex items-center gap-1 hover:!bg-primary hover:!text-white transition-colors"
+ className="flex items-center gap-1 hover:bg-primary! hover:text-white! transition-colors"
>
Ver Laudo
@@ -2457,7 +2457,7 @@ const ProfissionalPage = () => {
Este editor permite escrever relatórios de forma livre, com formatação de texto rica.
-
+
Cancelar
{/* botão 'Salvar Rascunho' removido por não ser utilizado */}
@@ -2656,7 +2656,7 @@ const ProfissionalPage = () => {
Salvar
-
+
Cancelar
@@ -2779,7 +2779,7 @@ const ProfissionalPage = () => {
{isEditingProfile && (
-
+
Alterar Foto
@@ -2875,7 +2875,7 @@ const ProfissionalPage = () => {
setActiveSection('calendario')}
>
@@ -2883,7 +2883,7 @@ const ProfissionalPage = () => {
setActiveSection('pacientes')}
>
@@ -2891,7 +2891,7 @@ const ProfissionalPage = () => {
setActiveSection('laudos')}
>
@@ -2899,7 +2899,7 @@ const ProfissionalPage = () => {
setActiveSection('comunicacao')}
>
@@ -2907,7 +2907,7 @@ const ProfissionalPage = () => {
setActiveSection('perfil')}
>
@@ -2957,7 +2957,7 @@ const ProfissionalPage = () => {
setShowPopup(false)}
variant="outline"
- className="flex-1 hover:!bg-primary hover:!text-white transition-colors"
+ className="flex-1 hover:bg-primary! hover:text-white! transition-colors"
>
Cancelar
@@ -3072,7 +3072,7 @@ const ProfissionalPage = () => {
setShowActionModal(false)}
variant="outline"
- className="w-full mt-2 hover:!bg-primary hover:!text-white transition-colors"
+ className="w-full mt-2 hover:bg-primary! hover:text-white! transition-colors"
>
Cancelar
diff --git a/susconecta/app/resultados/ResultadosClient.tsx b/susconecta/app/resultados/ResultadosClient.tsx
index 58e0000..632668c 100644
--- a/susconecta/app/resultados/ResultadosClient.tsx
+++ b/susconecta/app/resultados/ResultadosClient.tsx
@@ -655,7 +655,7 @@ export default function ResultadosClient() {
Ajustar filtros
@@ -699,7 +699,7 @@ export default function ResultadosClient() {
-
+
@@ -713,7 +713,7 @@ export default function ResultadosClient() {
-
+
@@ -758,7 +758,7 @@ export default function ResultadosClient() {
) : (
Mais filtros
@@ -768,7 +768,7 @@ export default function ResultadosClient() {
router.back()}
>
Voltar
@@ -827,7 +827,7 @@ export default function ResultadosClient() {
{
setMedicoSelecionado(medico)
setAbaDetalhe('experiencia')
@@ -898,12 +898,12 @@ export default function ResultadosClient() {
>
Agendar consulta
-
+
Enviar mensagem
{
const willOpen = !agendasExpandida[id]
setAgendasExpandida(prev => ({ ...prev, [id]: !prev[id] }))
@@ -947,11 +947,11 @@ export default function ResultadosClient() {
- setCurrentPage(1)} disabled={currentPage === 1} className="hover:!bg-primary hover:!text-white">Primeira
- setCurrentPage(p => Math.max(1, p - 1))} disabled={currentPage === 1} className="hover:!bg-primary hover:!text-white">Anterior
+ setCurrentPage(1)} disabled={currentPage === 1} className="hover:bg-primary! hover:text-white!">Primeira
+ setCurrentPage(p => Math.max(1, p - 1))} disabled={currentPage === 1} className="hover:bg-primary! hover:text-white!">Anterior
Página {currentPage} de {totalPages}
- setCurrentPage(p => Math.min(totalPages, p + 1))} disabled={currentPage === totalPages} className="hover:!bg-primary hover:!text-white">Próxima
- setCurrentPage(totalPages)} disabled={currentPage === totalPages} className="hover:!bg-primary hover:!text-white">Última
+ setCurrentPage(p => Math.min(totalPages, p + 1))} disabled={currentPage === totalPages} className="hover:bg-primary! hover:text-white!">Próxima
+ setCurrentPage(totalPages)} disabled={currentPage === totalPages} className="hover:bg-primary! hover:text-white!">Última
)}
diff --git a/susconecta/components/dashboard/header.tsx b/susconecta/components/dashboard/header.tsx
index 9963776..6398686 100644
--- a/susconecta/components/dashboard/header.tsx
+++ b/susconecta/components/dashboard/header.tsx
@@ -43,7 +43,7 @@ export function PagesHeader({ title = "", subtitle = "" }: { title?: string, sub
-
+
diff --git a/susconecta/components/simple-theme-toggle.tsx b/susconecta/components/simple-theme-toggle.tsx
index 3f96dcd..0c45ca0 100644
--- a/susconecta/components/simple-theme-toggle.tsx
+++ b/susconecta/components/simple-theme-toggle.tsx
@@ -17,7 +17,7 @@ export function SimpleThemeToggle() {
variant="outline"
size="icon"
onClick={toggleTheme}
- className="hover:!bg-primary hover:!text-white hover:!border-primary cursor-pointer !shadow-sm !shadow-black/10 !border-2 !border-black dark:!shadow-none dark:!border-border transition-colors"
+ className="hover:bg-primary! hover:text-white! hover:border-primary! cursor-pointer shadow-sm! shadow-black/10! border-2! border-black! dark:shadow-none! dark:border-border! transition-colors"
>
diff --git a/susconecta/components/ui/sidebar.tsx b/susconecta/components/ui/sidebar.tsx
index 4409ae3..3b8e753 100644
--- a/susconecta/components/ui/sidebar.tsx
+++ b/susconecta/components/ui/sidebar.tsx
@@ -266,7 +266,7 @@ function SidebarTrigger({
data-slot="sidebar-trigger"
variant="ghost"
size="icon"
- className={cn("size-7 hover:!bg-primary hover:!text-white transition-colors", className)}
+ className={cn("size-7 hover:bg-primary! hover:text-white! transition-colors", className)}
onClick={(event) => {
onClick?.(event)
toggleSidebar()
diff --git a/susconecta/lib/api.ts b/susconecta/lib/api.ts
index 9ecf796..0b17857 100644
--- a/susconecta/lib/api.ts
+++ b/susconecta/lib/api.ts
@@ -238,7 +238,7 @@ export async function criarDisponibilidade(input: DoctorAvailabilityCreate): Pro
// Normalize weekday to integer expected by the OpenAPI (0=Sunday .. 6=Saturday)
const mapWeekdayToInt = (w?: string | number): number | null => {
- if (w === null || typeof w === 'undefined') return null;
+ if (w === null || w === undefined) return null;
if (typeof w === 'number') return Number(w);
const s = String(w).toLowerCase().trim();
const map: Record = {
@@ -270,7 +270,7 @@ export async function criarDisponibilidade(input: DoctorAvailabilityCreate): Pro
end_time: input.end_time,
slot_minutes: input.slot_minutes ?? 30,
appointment_type: input.appointment_type ?? 'presencial',
- active: typeof input.active === 'undefined' ? true : input.active,
+ active: input.active === undefined ? true : input.active,
created_by: createdBy,
};
@@ -307,7 +307,7 @@ export async function criarDisponibilidade(input: DoctorAvailabilityCreate): Pro
end_time: end,
slot_minutes: input.slot_minutes ?? 30,
appointment_type: input.appointment_type ?? 'presencial',
- active: typeof input.active === 'undefined' ? true : input.active,
+ active: input.active === undefined ? true : input.active,
created_by: createdBy,
};
@@ -349,7 +349,7 @@ export async function criarDisponibilidade(input: DoctorAvailabilityCreate): Pro
end_time: end,
slot_minutes: input.slot_minutes ?? 30,
appointment_type: input.appointment_type ?? 'presencial',
- active: typeof input.active === 'undefined' ? true : input.active,
+ active: input.active === undefined ? true : input.active,
created_by: createdBy,
};
try {
@@ -381,7 +381,7 @@ export async function criarDisponibilidade(input: DoctorAvailabilityCreate): Pro
export async function listarDisponibilidades(params?: { doctorId?: string; active?: boolean }): Promise {
const qs = new URLSearchParams();
if (params?.doctorId) qs.set('doctor_id', `eq.${encodeURIComponent(String(params.doctorId))}`);
- if (typeof params?.active !== 'undefined') qs.set('active', `eq.${params.active ? 'true' : 'false'}`);
+ if (params?.active !== undefined) qs.set('active', `eq.${params.active ? 'true' : 'false'}`);
const url = `${REST}/doctor_availability${qs.toString() ? `?${qs.toString()}` : ''}`;
const res = await fetch(url, { method: 'GET', headers: baseHeaders() });
@@ -616,9 +616,19 @@ function buildRedirectUrl(target?: 'paciente' | 'medico' | 'admin' | 'default',
const base = DEFAULT_REDIRECT_BASE.replace(/\/$/, '');
let path = '/';
- if (target === 'paciente') path = '/paciente';
- else if (target === 'medico') path = '/profissional';
- else if (target === 'admin') path = '/dashboard';
+ switch (target) {
+ case 'paciente':
+ path = '/paciente';
+ break;
+ case 'medico':
+ path = '/profissional';
+ break;
+ case 'admin':
+ path = '/dashboard';
+ break;
+ default:
+ path = '/';
+ }
return `${base}${path}`;
}
@@ -866,7 +876,7 @@ export async function buscarPacientes(termo: string): Promise {
try {
const [key, val] = String(query).split('=');
const params = new URLSearchParams();
- if (key && typeof val !== 'undefined') params.set(key, val);
+ if (key && val !== undefined) params.set(key, val);
params.set('limit', '10');
const url = `${REST}/patients?${params.toString()}`;
const headers = baseHeaders();
@@ -1115,23 +1125,21 @@ export async function criarAgendamento(input: AppointmentCreate): Promise {
- if (!t) return null;
- const parts = String(t).split(':').map((p) => Number(p));
- if (parts.length >= 2 && !Number.isNaN(parts[0]) && !Number.isNaN(parts[1])) return parts[0] * 60 + parts[1];
- return null;
- };
- const exStart = parseToMinutes(ex.start_time ?? undefined);
- const exEnd = parseToMinutes(ex.end_time ?? undefined);
+ const parseToMinutes = (t?: string | null) => {
+ if (!t) return null;
+ const parts = String(t).split(':').map(Number);
+ if (parts.length >= 2 && !Number.isNaN(parts[0]) && !Number.isNaN(parts[1])) return parts[0] * 60 + parts[1];
+ return null;
+ };
+ const exStart = parseToMinutes(ex.start_time ?? undefined);
+ const exEnd = parseToMinutes(ex.end_time ?? undefined);
const sched = new Date(input.scheduled_at);
const schedMinutes = sched.getHours() * 60 + sched.getMinutes();
const schedDuration = input.duration_minutes ?? 30;
const schedEndMinutes = schedMinutes + Number(schedDuration);
- if (exStart != null && exEnd != null) {
- if (schedMinutes < exEnd && exStart < schedEndMinutes) {
- const reason = ex.reason ? ` Motivo: ${ex.reason}` : '';
- throw new Error(`Não é possível agendar neste horário por uma exceção que bloqueia parte do dia.${reason}`);
- }
+ if (exStart != null && exEnd != null && schedMinutes < exEnd && exStart < schedEndMinutes) {
+ const reason = ex.reason ? ` Motivo: ${ex.reason}` : '';
+ throw new Error(`Não é possível agendar neste horário por uma exceção que bloqueia parte do dia.${reason}`);
}
} catch (inner) {
// Propagate the exception as user-facing error
@@ -1767,9 +1775,9 @@ export async function buscarMedicos(termo: string): Promise {
try {
// Build the URL safely using URLSearchParams so special characters (like @) are encoded correctly
// query is like 'nome_social=ilike.*something*' -> split into key/value
- const [key, val] = String(query).split('=');
- const params = new URLSearchParams();
- if (key && typeof val !== 'undefined') params.set(key, val);
+ const [key, val] = String(query).split('=');
+ const params = new URLSearchParams();
+ if (key && val !== undefined) params.set(key, val);
params.set('limit', '10');
const url = `${REST}/doctors?${params.toString()}`;
const headers = baseHeaders();
@@ -1800,7 +1808,7 @@ export async function buscarMedicoPorId(id: string | number): Promise v.replace(/"/g, '\\"');
+ const escapeQuotes = (v: string) => JSON.stringify(v).slice(1, -1);
try {
// 1) Se parece UUID, busca por id direto
@@ -2085,9 +2093,9 @@ export async function criarMedico(input: MedicoInput): Promise {
crm_uf: crmUf,
create_user: false,
};
- if (input.specialty) fallbackPayload.specialty = input.specialty;
- if (input.phone_mobile) fallbackPayload.phone_mobile = input.phone_mobile;
- if (typeof input.phone2 !== 'undefined') fallbackPayload.phone2 = input.phone2;
+ if (input.specialty) fallbackPayload.specialty = input.specialty;
+ if (input.phone_mobile) fallbackPayload.phone_mobile = input.phone_mobile;
+ if (input.phone2 !== undefined) fallbackPayload.phone2 = input.phone2;
const url = `${API_BASE}/functions/v1/create-doctor`;
const headers = { ...baseHeaders(), 'Content-Type': 'application/json' } as Record;
@@ -2685,7 +2693,8 @@ export async function criarUsuarioPaciente(paciente: { email: string; full_name:
const parsed = await parse(res as Response);
// Attach the generated password so callers (UI) can display it if necessary
- return { ...(parsed || {}), password };
+ if (parsed && typeof parsed === 'object') return { ...(parsed as any), password };
+ return { password };
}