diff --git a/app/context/AccessibilityContext.tsx b/app/context/AccessibilityContext.tsx index 1594f2e..ae52c99 100644 --- a/app/context/AccessibilityContext.tsx +++ b/app/context/AccessibilityContext.tsx @@ -19,20 +19,25 @@ interface AccessibilityContextProps { const AccessibilityContext = createContext(undefined); export const AccessibilityProvider = ({ children }: { children: ReactNode }) => { - const [theme, setThemeState] = useState('light'); - const [contrast, setContrastState] = useState('normal'); - const [fontSize, setFontSize] = useState(16); - - useEffect(() => { - const storedTheme = (localStorage.getItem('accessibility-theme') as Theme) || 'light'; - const storedContrast = (localStorage.getItem('accessibility-contrast') as Contrast) || 'normal'; - const storedSize = localStorage.getItem('accessibility-font-size'); - setThemeState(storedTheme); - setContrastState(storedContrast); - if (storedSize) { - setFontSize(parseFloat(storedSize)); + const [theme, setThemeState] = useState(() => { + if (typeof window !== 'undefined') { + return (localStorage.getItem('accessibility-theme') as Theme) || 'light'; } - }, []); + return 'light'; + }); + const [contrast, setContrastState] = useState(() => { + if (typeof window !== 'undefined') { + return (localStorage.getItem('accessibility-contrast') as Contrast) || 'normal'; + } + return 'normal'; + }); + const [fontSize, setFontSize] = useState(() => { + if (typeof window !== 'undefined') { + const storedSize = localStorage.getItem('accessibility-font-size'); + return storedSize ? parseFloat(storedSize) : 16; + } + return 16; + }); useEffect(() => { const root = document.documentElement; diff --git a/app/doctor/dashboard/page.tsx b/app/doctor/dashboard/page.tsx index a018dfd..cf855dc 100644 --- a/app/doctor/dashboard/page.tsx +++ b/app/doctor/dashboard/page.tsx @@ -21,7 +21,7 @@ import { } from "@/components/ui/alert-dialog"; import Link from "next/link"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useMemo } from "react"; // Adicionado useMemo import { toast } from "@/hooks/use-toast"; import { useAuthLayout } from "@/hooks/useAuthLayout"; @@ -38,7 +38,6 @@ import Sidebar from "@/components/Sidebar"; import WeeklyScheduleCard from "@/components/ui/WeeklyScheduleCard"; -// --- TIPOS ADICIONADOS PARA CORREÇÃO --- type Appointment = { id: string; doctor_id: string; @@ -50,7 +49,6 @@ type Appointment = { type EnrichedAppointment = Appointment & { patientName: string; }; -// --- FIM DOS TIPOS ADICIONADOS --- type Availability = { id: string; @@ -142,14 +140,17 @@ interface Exception { created_by: string; } -// Minimal type for Patient, adjust if more fields are needed type Patient = { id: string; full_name: string; }; -export default function PatientDashboard() { - const { user } = useAuthLayout({ requiredRole: ['medico'] }); +export default function DoctorDashboard() { + // --- CORREÇÃO CRÍTICA DO LOOP --- + // Usamos useMemo para garantir que o array de roles seja uma referência estável + // e não dispare o useEffect do useAuthLayout infinitamente. + const requiredRoles = useMemo(() => ['medico'], []); + const { user } = useAuthLayout({ requiredRole: requiredRoles }); const [loggedDoctor, setLoggedDoctor] = useState(null); const [userData, setUserData] = useState(); @@ -218,7 +219,7 @@ export default function PatientDashboard() { }; fetchData(); - }, [user]); + }, [user?.id]); function findDoctorById(id: string, doctors: Doctor[]) { return doctors.find((doctor) => doctor.user_id === id); @@ -264,8 +265,8 @@ export default function PatientDashboard() {
-

Dashboard

-

+

Dashboard

+

Bem-vindo ao seu portal de consultas médicas

@@ -325,7 +326,7 @@ export default function PatientDashboard() { Acesse rapidamente as principais funcionalidades - +
@@ -390,7 +391,7 @@ export default function PatientDashboard() { ); }) ) : ( -

Nenhuma exceção registrada.

+

Nenhuma exceção registrada.

)} @@ -403,7 +404,7 @@ export default function PatientDashboard() { Cancelar - exceptionToDelete && handleDeleteException(exceptionToDelete)} className="bg-red-600 hover:bg-red-700"> + exceptionToDelete && handleDeleteException(exceptionToDelete)} className="bg-destructive hover:bg-destructive/90"> Excluir diff --git a/app/doctor/disponibilidade/excecoes/page.tsx b/app/doctor/disponibilidade/excecoes/page.tsx index 932cb3f..212aa33 100644 --- a/app/doctor/disponibilidade/excecoes/page.tsx +++ b/app/doctor/disponibilidade/excecoes/page.tsx @@ -149,12 +149,12 @@ export default function ExceptionPage() {
-

Adicione exceções

-

Altere a disponibilidade em casos especiais para o Dr. João Silva

+

Adicione exceções

+

Altere a disponibilidade em casos especiais para o Dr. João Silva

-

Consultas para: {displayDate}

+

Consultas para: {displayDate}

-
diff --git a/app/doctor/disponibilidade/page.tsx b/app/doctor/disponibilidade/page.tsx index 9dd35b8..a7052c2 100644 --- a/app/doctor/disponibilidade/page.tsx +++ b/app/doctor/disponibilidade/page.tsx @@ -379,23 +379,23 @@ export default function AvailabilityPage() {
-

+

Definir Disponibilidade

-

+

Defina sua disponibilidade para consultas{" "}

-
-

Dados

+
+

Dados

{/* **AJUSTE DE RESPONSIVIDADE: DIAS DA SEMANA** */}
- @@ -414,7 +414,7 @@ export default function AvailabilityPage() { type="radio" name="weekday" value="tuesday" - className="text-blue-600" + className="text-primary" /> Terça @@ -423,7 +423,7 @@ export default function AvailabilityPage() { type="radio" name="weekday" value="wednesday" - className="text-blue-600" + className="text-primary" /> Quarta @@ -432,7 +432,7 @@ export default function AvailabilityPage() { type="radio" name="weekday" value="thursday" - className="text-blue-600" + className="text-primary" /> Quinta @@ -441,7 +441,7 @@ export default function AvailabilityPage() { type="radio" name="weekday" value="friday" - className="text-blue-600" + className="text-primary" /> Sexta @@ -450,7 +450,7 @@ export default function AvailabilityPage() { type="radio" name="weekday" value="saturday" - className="text-blue-600" + className="text-primary" /> Sábado @@ -459,7 +459,7 @@ export default function AvailabilityPage() { type="radio" name="weekday" value="sunday" - className="text-blue-600" + className="text-primary" /> Domingo @@ -472,7 +472,7 @@ export default function AvailabilityPage() {
@@ -487,7 +487,7 @@ export default function AvailabilityPage() {
@@ -502,9 +502,9 @@ export default function AvailabilityPage() {
@@ -551,7 +551,7 @@ export default function AvailabilityPage() { -
@@ -571,15 +571,15 @@ export default function AvailabilityPage() { const times = schedule[day] || []; return (
-
-

{weekdaysPT[day]}

-
+
+

{weekdaysPT[day]}

+
{times.length > 0 ? ( times.map((t, i) => (
-

+

{formatTime(t.start)} - {formatTime(t.end)}

@@ -590,7 +590,7 @@ export default function AvailabilityPage() { openDeleteDialog(t, day)} - className="text-red-600 focus:bg-red-50 focus:text-red-600"> + className="text-destructive focus:bg-destructive/10 focus:text-destructive"> Excluir @@ -599,7 +599,7 @@ export default function AvailabilityPage() {
)) ) : ( -

Sem horário

+

Sem horário

)}
@@ -619,7 +619,7 @@ export default function AvailabilityPage() { Cancelar - selectedAvailability && handleDeleteAvailability(selectedAvailability.id)} className="bg-red-600 hover:bg-red-700"> + selectedAvailability && handleDeleteAvailability(selectedAvailability.id)} className="bg-destructive hover:bg-destructive/90"> Excluir diff --git a/app/globals.css b/app/globals.css index 95ff1b4..d34f124 100644 --- a/app/globals.css +++ b/app/globals.css @@ -16,8 +16,8 @@ --muted-foreground: oklch(0.556 0 0); --accent: oklch(0.97 0 0); --accent-foreground: oklch(0.205 0 0); - --destructive: oklch(0.577 0.245 27.325); - --destructive-foreground: oklch(0.577 0.245 27.325); + --destructive: oklch(0.637 0.237 25.331); + --destructive-foreground: oklch(0.985 0 0); --border: oklch(0.922 0 0); --input: oklch(0.922 0 0); --ring: oklch(0.708 0 0); @@ -52,8 +52,8 @@ --muted-foreground: oklch(0.708 0 0); --accent: oklch(0.269 0 0); --accent-foreground: oklch(0.985 0 0); - --destructive: oklch(0.396 0.141 25.723); - --destructive-foreground: oklch(0.637 0.237 25.331); + --destructive: oklch(0.7 0.25 25); + --destructive-foreground: oklch(0.985 0 0); --border: oklch(0.269 0 0); --input: oklch(0.269 0 0); --ring: oklch(0.439 0 0); @@ -87,7 +87,7 @@ --muted-foreground: oklch(1 0.5 100); --accent: oklch(0 0 0); --accent-foreground: oklch(1 0.5 100); - --destructive: oklch(0.5 0.3 30); + --destructive: oklch(0.8 0.5 25); --destructive-foreground: oklch(0 0 0); --border: oklch(1 0.5 100); --input: oklch(0 0 0); diff --git a/app/layout.tsx b/app/layout.tsx index 797f31e..b358dcd 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -4,11 +4,7 @@ import { GeistMono } from "geist/font/mono"; import { Analytics } from "@vercel/analytics/next"; import "./globals.css"; import { Toaster } from "@/components/ui/toaster"; -// [PASSO 1.2] - Importando o nosso provider -import { AppointmentsProvider } from "./context/AppointmentsContext"; -import { AccessibilityProvider } from "./context/AccessibilityContext"; -import { AccessibilityModal } from "@/components/accessibility-modal"; -import { ThemeInitializer } from "@/components/theme-initializer"; +import { Providers } from "./providers"; export default function RootLayout({ children, @@ -18,12 +14,7 @@ export default function RootLayout({ return ( - {/* [PASSO 1.2] - Envolvendo a aplicação com o provider */} - - - {children} - - + {children} diff --git a/app/login/page.tsx b/app/login/page.tsx index 4af96d9..951e3ba 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -97,7 +97,7 @@ export default function LoginPage() {
{/* O contêiner principal que agora terá a sombra e o estilo de card */} -
+
{/* NOVO: Bloco da Logo e Nome (Painel Esquerdo) */}
{/* Camada de sobreposição para escurecer a imagem e destacar o texto */}
diff --git a/app/manager/dashboard/page.tsx b/app/manager/dashboard/page.tsx index 11f5c19..1d29623 100644 --- a/app/manager/dashboard/page.tsx +++ b/app/manager/dashboard/page.tsx @@ -94,8 +94,8 @@ export default function ManagerDashboard() {
{/* Cabeçalho */}
-

Dashboard

-

+

Dashboard

+

Bem-vindo ao seu portal de consultas médicas

@@ -114,7 +114,7 @@ export default function ManagerDashboard() { {loadingUser ? ( -
+
Carregando usuário...
) : firstUser ? ( @@ -127,7 +127,7 @@ export default function ManagerDashboard() {

) : ( -
+
Nenhum usuário encontrado
)} @@ -159,15 +159,15 @@ export default function ManagerDashboard() { - - + Página {page} de {totalPages} diff --git a/app/manager/home/[id]/editar/page.tsx b/app/manager/home/[id]/editar/page.tsx index 1cce7a8..b2a5a8f 100644 --- a/app/manager/home/[id]/editar/page.tsx +++ b/app/manager/home/[id]/editar/page.tsx @@ -209,8 +209,8 @@ export default function EditarMedicoPage() { return (
- -

Carregando dados do médico...

+ +

Carregando dados do médico...

); @@ -221,10 +221,10 @@ export default function EditarMedicoPage() {
-

- Editar Médico: {formData.nomeCompleto} +

+ Editar Médico: {formData.nomeCompleto}

-

+

Atualize as informações do médico

@@ -239,14 +239,14 @@ export default function EditarMedicoPage() { {error && ( -
+

Erro na Atualização:

{error}

)} -
-

+
+

Dados Principais e Pessoais

@@ -348,8 +348,8 @@ export default function EditarMedicoPage() {
-
-

+
+

Contato e Endereço

@@ -452,8 +452,8 @@ export default function EditarMedicoPage() {
-
-

+
+

Observações (Apenas internas)