riseup-squad22/src/pages/Login/Acessounico.jsx
2025-12-04 21:37:25 -03:00

147 lines
5.0 KiB
JavaScript

import { useState } from "react";
import { useNavigate } from "react-router-dom";
import { getAccessToken } from "../../utils/auth.js";
import { useResponsive } from '../../utils/useResponsive';
export default function MagicLink() {
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL;
const supabaseAK = import.meta.env.VITE_SUPABASE_ANON_KEY;
const navigate = useNavigate();
const [email, setEmail] = useState("");
const [emailError, setEmailError] = useState('');
const [isTouched, setIsTouched] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [serverError, setServerError] = useState('');
const [serverSucsess, setServerSucsess] = useState('');
const tokenUsuario =getAccessToken()
const handleSubmit = async (e) => {
e.preventDefault();
const emailValidation = validateEmail(email);
if (emailValidation) {
// Se houver erros locais, para a execução antes do fetch
return;
}
try {
const myHeaders = new Headers();
myHeaders.append("apikey", supabaseAK);
myHeaders.append("Authorization", `Bearer ${tokenUsuario}`);
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
email: email,
options: {
emailRedirectTo: "https://mediconnect-neon.vercel.app/"
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
const response = await fetch(
`${supabaseUrl}/auth/v1/otp`, requestOptions
);
const result = await response.json();
console.log("🔗 Retorno da API de acesso único:", result);
serverSucsess("Se o e-mail estiver cadastrado, enviamos um link de acesso!");
setEmail("");
} catch (error) {
console.error("❌ Erro ao enviar magic link:", error);
serverError("Erro ao enviar o link de acesso. Tente novamente.");
}
};
const validateEmail = (emailValue) => {
let error = '';
if (emailValue.trim() === '') {
error = 'O e-mail não pode ficar vazio.';
} else if (!emailValue.includes('@') || !emailValue.includes('.')) {
error = 'O e-mail deve conter o símbolo "@" e um ponto (".") seguido por uma extensão.';
}
// Atualiza o estado de erro específico para o email
setEmailError(error);
return error;
};
const handleEmailChange = (e) => {
const newValue = e.target.value;
setEmail(newValue);
if (isTouched) {
validateEmail(newValue); // Valida em tempo real
}
const { name, value } = e.target;
setConta((prev) => ({
...prev,
[name]: value
}));
};
const handleEmailBlur = (e) => {
setIsTouched(true);
validateEmail(e.target.value); // Valida ao perder o foco
};
return (
<div class="login-body">
<div class="container">
<div class="image-section">
<div class="content-section doctor-info">
<div class="image-box doctor-box">
<div class="doctor-image"></div>
</div>
<div class="text-box doctor-text">
<h3>Você mais próximo de seu médico</h3>
<p>Consultas online e acompanhamento em tempo real.</p>
</div>
</div>
<div class="content-section patient-info">
<div class="image-box patient-box">
<div class="patient-image"></div>
</div>
<div class="text-box patient-text">
<h3>Agende sem sair de casa</h3>
<p>O seu atendimento, na medida da sua agenda.</p>
</div>
</div>
</div>
<div class="login-section">
<header class="app-header">
<span class="app-name">MediConnect</span>
</header>
<div class="login-form-container">
<h1 class="login-title">Entre para iniciar a sessão.</h1>
<p class="login-subtitle">Digite seu e-mail para receber um link de acesso seguro.</p>
<form onSubmit={handleSubmit} noValidate>
<label for="email" class="input-label">E-mail</label>
<div class="input-group phone-input">
<input type="email" id="email" name="email" value={email} onChange={handleEmailChange} onBlur={handleEmailBlur} placeholder="seuemail@dominio.com" required></input>
</div>
{emailError && <p style={{ color: 'red', margin: '5px 0' }}>{emailError}</p>}
{serverError && <p style={{ color: 'green', margin: '5px 0' }}>{serverSucsess}</p>}
{serverError && <p style={{ color: 'red', margin: '5px 0' }}>{serverError}</p>}
<button id="button" type="submit" class="login-button">Enviar Link Mágico</button>
<a href="#" class="login-with-code" onClick={() => navigate("/Login")}>Entrar com Senha</a>
</form>
</div>
</div>
</div>
</div>
);
};