From cbcb7b54fd6d2b4ec43db5284aaf74476ab9daaa Mon Sep 17 00:00:00 2001 From: m1guelmcf Date: Mon, 17 Nov 2025 22:19:36 -0300 Subject: [PATCH] Alteracao da pagina inicial e na pagina de login --- app/login/page.tsx | 9 +- app/page.tsx | 175 ++++++++++++---------- components/LoginForm.tsx | 307 ++++++++++++++++++++++++--------------- 3 files changed, 298 insertions(+), 193 deletions(-) diff --git a/app/login/page.tsx b/app/login/page.tsx index 4be0708..4af96d9 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -138,7 +138,7 @@ export default function LoginPage() { Não tem uma conta de paciente?{" "} - + Crie uma agora @@ -232,18 +232,21 @@ export default function LoginPage() { {/* Botões */}
+ {/* Botão Cancelar – Azul contornado */} + + {/* Botão Resetar Senha – Azul sólido */} diff --git a/app/page.tsx b/app/page.tsx index fcefd3c..a21a053 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,50 +3,49 @@ import Link from "next/link"; import { Button } from "@/components/ui/button"; import { useState } from "react"; +import { Stethoscope, Baby, Microscope } from "lucide-react"; export default function InicialPage() { const [isMenuOpen, setIsMenuOpen] = useState(false); return ( -
- {/* Barra superior de informações */} -
+
+ {/* Barra superior */} +
Horário: 08h00 - 21h00 - Email: contato@mediconnect.com + + Email: contato@mediconnect.com +
- - {/* Header principal - Com Logo REAL */} -
- {/* Agrupamento do Logo e Nome do Site */} - - {/* 1. IMAGEM/LOGO REAL: Referenciando o arquivo placeholder-logo.png na pasta public */} + {/* Header */} +
+ Logo MediConnect - - {/* 2. NOME DO SITE */} -

MediConnect

+

+ MediConnect +

- {/* Botão do menu hambúrguer para telas menores */} + {/* Menu Mobile */}
- {/* O botão de login agora estará sempre aqui, fora do menu */}
- {/* Navegação principal */} + {/* Navegação */} - {/* Botão de Login para telas maiores (md e acima) */} + {/* Login Desktop */}
- - {/* Seção principal de destaque */} -
+ {/* Hero Section */} +
-

+

Bem-vindo à Saúde Digital

-

+

Soluções Médicas
& Cuidados com a Saúde

-

+

Excelência em saúde há mais de 25 anos. Atendimento médico com qualidade, segurança e carinho.

-
- - +
+ +
Médico
- - {/* Seção de serviços */} -
-

+ {/* Serviços */} +
+

Cuidados completos para a sua saúde

-

+

Serviços médicos que oferecemos

-
-
-

- Clínica Geral -

-

- Seu primeiro passo para o cuidado. Atendimento focado na prevenção - e no diagnóstico inicial. -

- -
-
-

Pediatria

-

- Cuidado gentil e especializado para garantir a saúde e o - desenvolvimento de crianças e adolescentes. -

- -
-
-

Exames

-

- Resultados rápidos e precisos em exames laboratoriais e de imagem - essenciais para seu diagnóstico. -

- -
+
+ {/* Card */} + {[ + { + title: "Clínica Geral", + desc: "Seu primeiro passo para o cuidado. Atendimento focado na prevenção e no diagnóstico inicial.", + Icon: Stethoscope, + }, + { + title: "Pediatria", + desc: "Cuidado gentil e especializado para garantir a saúde e o desenvolvimento de crianças e adolescentes.", + Icon: Baby, + }, + { + title: "Exames", + desc: "Resultados rápidos e precisos em exames laboratoriais e de imagem essenciais para seu diagnóstico.", + Icon: Microscope, + }, + ].map(({ title, desc, Icon }, index) => ( +
+
+ +

{title}

+
+

+ {desc} +

+ +
+ ))}
- {/* Footer */} -

); } diff --git a/components/LoginForm.tsx b/components/LoginForm.tsx index 420ab39..6a85022 100644 --- a/components/LoginForm.tsx +++ b/components/LoginForm.tsx @@ -16,138 +16,215 @@ import { Eye, EyeOff, Mail, Lock, Loader2 } from "lucide-react"; import { usersService } from "@/services/usersApi.mjs"; interface LoginFormProps { - children?: React.ReactNode; + children?: React.ReactNode; } interface FormState { - email: string; - password: string; + email: string; + password: string; } export function LoginForm({ children }: LoginFormProps) { - const [form, setForm] = useState({ email: "", password: "" }); - const [showPassword, setShowPassword] = useState(false); - const [isLoading, setIsLoading] = useState(false); - const router = useRouter(); - const { toast } = useToast(); + const [form, setForm] = useState({ email: "", password: "" }); + const [showPassword, setShowPassword] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const router = useRouter(); + const { toast } = useToast(); - const [userRoles, setUserRoles] = useState([]); - const [authenticatedUser, setAuthenticatedUser] = useState(null); + const [userRoles, setUserRoles] = useState([]); + const [authenticatedUser, setAuthenticatedUser] = useState(null); - /** - * --- NOVA FUNÇÃO --- - * Finaliza o login com o perfil de dashboard escolhido e redireciona. - */ - const handleRoleSelection = (selectedDashboardRole: string, user: any) => { - if (!user) { - toast({ title: "Erro de Sessão", description: "Não foi possível encontrar os dados do usuário. Tente novamente.", variant: "destructive" }); - setUserRoles([]); - return; - } + /** + * --- NOVA FUNÇÃO --- + * Finaliza o login com o perfil de dashboard escolhido e redireciona. + */ + const handleRoleSelection = (selectedDashboardRole: string, user: any) => { + if (!user) { + toast({ + title: "Erro de Sessão", + description: + "Não foi possível encontrar os dados do usuário. Tente novamente.", + variant: "destructive", + }); + setUserRoles([]); + return; + } - const roleInLowerCase = selectedDashboardRole.toLowerCase(); - console.log("Salvando no localStorage com o perfil:", roleInLowerCase); + const roleInLowerCase = selectedDashboardRole.toLowerCase(); + console.log("Salvando no localStorage com o perfil:", roleInLowerCase); - const completeUserInfo = { ...user, user_metadata: { ...user.user_metadata, role: roleInLowerCase } }; - localStorage.setItem("user_info", JSON.stringify(completeUserInfo)); - - let redirectPath = ""; - switch (selectedDashboardRole) { - case "gestor": redirectPath = "/manager/dashboard"; break; - case "admin": redirectPath = "/manager/dashboard"; break; - case "medico": redirectPath = "/doctor/dashboard"; break; - case "secretaria": redirectPath = "/secretary/dashboard"; break; - case "paciente": redirectPath = "/patient/dashboard"; break; - } - - if (redirectPath) { - toast({ title: `Entrando como ${selectedDashboardRole}...` }); - router.push(redirectPath); - } else { - toast({ title: "Erro", description: "Perfil selecionado inválido.", variant: "destructive" }); - } + const completeUserInfo = { + ...user, + user_metadata: { ...user.user_metadata, role: roleInLowerCase }, }; + localStorage.setItem("user_info", JSON.stringify(completeUserInfo)); - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - setIsLoading(true); - localStorage.removeItem("token"); - localStorage.removeItem("user_info"); + let redirectPath = ""; + switch (selectedDashboardRole) { + case "gestor": + redirectPath = "/manager/dashboard"; + break; + case "admin": + redirectPath = "/manager/dashboard"; + break; + case "medico": + redirectPath = "/doctor/dashboard"; + break; + case "secretaria": + redirectPath = "/secretary/dashboard"; + break; + case "paciente": + redirectPath = "/patient/dashboard"; + break; + } - try { - const authData = await login(form.email, form.password); - const user = authData.user; - if (!user || !user.id) { - throw new Error("Resposta de autenticação inválida."); - } + if (redirectPath) { + toast({ title: `Entrando como ${selectedDashboardRole}...` }); + router.push(redirectPath); + } else { + toast({ + title: "Erro", + description: "Perfil selecionado inválido.", + variant: "destructive", + }); + } + }; - const rolesData = await api.get(`/rest/v1/user_roles?user_id=eq.${user.id}&select=role`); + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + setIsLoading(true); + localStorage.removeItem("token"); + localStorage.removeItem("user_info"); - const me = await usersService.getMeSimple() - console.log(me.roles) + try { + const authData = await login(form.email, form.password); + const user = authData.user; + if (!user || !user.id) { + throw new Error("Resposta de autenticação inválida."); + } - if (!me.roles || me.roles.length === 0) { - throw new Error("Nenhum perfil de acesso foi encontrado para este usuário."); - } + const rolesData = await api.get( + `/rest/v1/user_roles?user_id=eq.${user.id}&select=role` + ); - handleRoleSelection(me.roles[0], user); + const me = await usersService.getMeSimple(); + console.log(me.roles); - } catch (error) { - localStorage.removeItem("token"); - localStorage.removeItem("user_info"); - toast({ - title: "Erro no Login", - description: error instanceof Error ? error.message : "Ocorreu um erro inesperado.", - variant: "destructive", - }); - setIsLoading(false); - } - }; + if (!me.roles || me.roles.length === 0) { + throw new Error( + "Nenhum perfil de acesso foi encontrado para este usuário." + ); + } - // Estado para guardar os botões de seleção de perfil - const [roleSelectionUI, setRoleSelectionUI] = useState(null); + handleRoleSelection(me.roles[0], user); + } catch (error) { + localStorage.removeItem("token"); + localStorage.removeItem("user_info"); + toast({ + title: "Erro no Login", + description: + error instanceof Error + ? error.message + : "Ocorreu um erro inesperado.", + variant: "destructive", + }); + setIsLoading(false); + } + }; - return ( - - - {!roleSelectionUI ? ( -
-
- -
- - setForm({ ...form, email: e.target.value })} className="pl-10 h-11" required disabled={isLoading} autoComplete="username" /> -
-
-
- -
- - setForm({ ...form, password: e.target.value })} className="pl-10 pr-12 h-11" required disabled={isLoading} autoComplete="current-password" /> - -
-
- -
- ) : ( -
-

Você tem múltiplos perfis

-

Selecione com qual perfil deseja entrar:

-
- {userRoles.map((role) => ( - - ))} -
-
- )} - {children} -
-
- ); -} \ No newline at end of file + // Estado para guardar os botões de seleção de perfil + const [roleSelectionUI, setRoleSelectionUI] = + useState(null); + + return ( + + + {!roleSelectionUI ? ( +
+
+ +
+ + setForm({ ...form, email: e.target.value })} + className="pl-10 h-11 focus-visible:ring-blue-600 focus-visible:ring-2" + required + disabled={isLoading} + autoComplete="username" + /> +
+
+
+ +
+ + + setForm({ ...form, password: e.target.value }) + } + className="pl-10 pr-12 h-11 focus-visible:ring-blue-600 focus-visible:ring-2" + required + disabled={isLoading} + autoComplete="current-password" + /> + +
+
+ +
+ ) : ( +
+

+ Você tem múltiplos perfis +

+

+ Selecione com qual perfil deseja entrar: +

+
+ {userRoles.map((role) => ( + + ))} +
+
+ )} + {children} +
+
+ ); +}