diff --git a/app/login/page.tsx b/app/login/page.tsx index b193142..6232d58 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -1,82 +1,247 @@ // Caminho: app/login/page.tsx + +"use client"; + + +import {usersService} from "@/services/usersApi.mjs"; import { LoginForm } from "@/components/LoginForm"; import Link from "next/link"; import Image from "next/image"; import { Button } from "@/components/ui/button"; -import { ArrowLeft } from "lucide-react"; // Importa o ícone de seta +import { Input } from "@/components/ui/input"; +import { ArrowLeft, X } from "lucide-react"; +import { useState } from "react"; +import RenderFromTemplateContext from "next/dist/client/components/render-from-template-context"; + export default function LoginPage() { - return ( -
- - {/* PAINEL ESQUERDO: O Formulário */} -
- - {/* Link para Voltar */} -
- - - Voltar à página inicial - -
+ const [isModalOpen, setIsModalOpen] = useState(false); + const [email, setEmail] = useState(""); + const [isLoading, setIsLoading] = useState(false); + const [message, setMessage] = useState<{ type: "success" | "error"; text: string } | null>(null); - {/* O contêiner principal que agora terá a sombra e o estilo de card */} -
-
-

Acesse sua conta

-

Bem-vindo(a) de volta ao MedConnect!

+ + const handleOpenModal = () => { + // Tenta pegar o email do input do formulário de login + const emailInput = document.querySelector('input[type="email"]') as HTMLInputElement; + if (emailInput?.value) { + setEmail(emailInput.value); + } + setIsModalOpen(true); + }; + + + const handleResetPassword = async () => { + if (!email.trim()) { + setMessage({ type: "error", text: "Por favor, insira um e-mail válido." }); + return; + } + + + setIsLoading(true); + setMessage(null); + + + try { + // Chama o método que já faz o fetch corretamente + const data = await usersService.resetPassword(email); + + + console.log("Resposta resetPassword:", data); + + + setMessage({ + type: "success", + text: "E-mail de recuperação enviado! Verifique sua caixa de entrada.", + }); + + + setTimeout(() => { + setIsModalOpen(false); + setMessage(null); + setEmail(""); + }, 2000); + } catch (error) { + console.error("Erro no reset de senha:", error); + setMessage({ + type: "error", + text: + error instanceof Error + ? error.message + : "Erro ao enviar e-mail. Tente novamente.", + }); + } finally { + setIsLoading(false); + } +}; + + + + + const closeModal = () => { + setIsModalOpen(false); + setMessage(null); + setEmail(""); + }; + + + return ( + <> +
+ + {/* PAINEL ESQUERDO: O Formulário */} +
+ + {/* Link para Voltar */} +
+ + + Voltar à página inicial +
- - {/* Children para o LoginForm */} -
- - + + {/* O contêiner principal que agora terá a sombra e o estilo de card */} +
+
+

Acesse sua conta

+

Bem-vindo(a) de volta ao MedConnect!

+
+ + + + {/* Children para o LoginForm */} +
+ +
+
+ + +
+ Não tem uma conta de paciente? + + + Crie uma agora
- - -
- Não tem uma conta de paciente? - - - Crie uma agora - -
-
- {/* PAINEL DIREITO: A Imagem e Branding */} -
- {/* Usamos o componente para otimização e performance */} - Médica utilizando um tablet na clínica MedConnect - {/* Camada de sobreposição para escurecer a imagem e destacar o texto */} -
+ + {/* PAINEL DIREITO: A Imagem e Branding */} +
+ {/* Usamos o componente para otimização e performance */} + Médica utilizando um tablet na clínica MedConnect + {/* Camada de sobreposição para escurecer a imagem e destacar o texto */} +
{/* BLOCO DE NOME ADICIONADO */}
-

+

MedConnect -

+

- Tecnologia e Cuidado a Serviço da Sua Saúde. + Tecnologia e Cuidado a Serviço da Sua Saúde.

- Acesse seu portal para uma experiência de saúde integrada, segura e eficiente. + Acesse seu portal para uma experiência de saúde integrada, segura e eficiente.

+
+ +
-
+ + {/* Modal de Recuperação de Senha */} + {isModalOpen && ( +
+
+ {/* Botão de fechar */} + + + + {/* Cabeçalho */} +
+

Recuperar Senha

+

+ Insira seu e-mail e enviaremos um link para redefinir sua senha. +

+
+ + + {/* Input de e-mail */} +
+
+ + setEmail(e.target.value)} + placeholder="seu@email.com" + disabled={isLoading} + className="w-full" + /> +
+ + + {/* Mensagem de feedback */} + {message && ( +
+ {message.text} +
+ )} + + + {/* Botões */} +
+ + +
+
+
+
+ )} + ); -} \ No newline at end of file +} diff --git a/services/usersApi.mjs b/services/usersApi.mjs index ffebac4..fc9d0b9 100644 --- a/services/usersApi.mjs +++ b/services/usersApi.mjs @@ -61,4 +61,40 @@ export const usersService = { permissions, }; }, -}; \ No newline at end of file + async resetPassword(email) { + if (!email) throw new Error("Email é obrigatório para resetar a senha."); + + + try { + const res = await fetch( + `${process.env.NEXT_PUBLIC_SUPABASE_URL}/auth/v1/recover`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + apikey: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY, + }, + body: JSON.stringify({ email }), + } + ); + + + const data = await res.json().catch(() => ({})); + + + if (!res.ok) { + console.error("Erro no resetPassword:", res.status, data); + throw new Error(`Erro ${res.status}: ${data.message || "Falha ao resetar senha."}`); + } + + + console.log("✅ Reset de senha:", data); + return data; + } catch (err) { + console.error("❌ Erro na chamada resetPassword:", err); + throw new Error(err.message || "Erro inesperado na recuperação de senha."); + } +}, + + +};