import React, { useState, useEffect } from "react"; import './Recuperar.css'; import { FaUser, FaLock, FaHome } from "react-icons/fa"; import { TextField, Button, Box } from "@mui/material"; import axios from "axios"; import { useNavigate } from "react-router-dom"; import emailjs from 'emailjs-com'; import PopupActualizar from "/src/Popups/PopupActualizar"; import PopupActualizarInv from "/src/Popups/PopupActualizarInv.jsx"; import PopupV from "/src/Popups/PopupLoginValido.jsx"; import PopupIv from "/src/Popups/PopupLoginInvalido.jsx"; import Swal from 'sweetalert2'; function RecuperarContra(props) { const navigate = useNavigate(); const [Cargando, setCargando] = useState(false); const [datosFormulario, setDatosFormulario] = useState({ correo: '', password: '', codigo: '' }); const [codigoAleatorio, setCodigoAleatorio] = useState(null); const [mostrarCodigo, setMostrarCodigo] = useState(false); const [codigoVerificado, setCodigoVerificado] = useState(false); useEffect(() => { const codigo = Math.floor(100000 + Math.random() * 900000); setCodigoAleatorio(codigo); console.log("Código aleatorio:", codigo); }, []); const mostrarAlertaCambioContraExitoso = () => { Swal.fire({ title: "Cambio de contraseña", text: "Credenciales actualizadas correctamente", icon: "success", button: "Aceptar" }).then(respuesta => { if (respuesta) { redirectToLogin(); } }); }; const mostrarAlertaCambioContraFallido = () => { Swal.fire({ title: "Correo no encontrado", text: "El correo que introdujo no existe o se escribió incorrectamente.", icon: "error", button: "Aceptar" }); }; const mostrarAlertaCodigoInvalido = () => { Swal.fire({ title: "Código incorrecto", text: "El código ingresado no es válido. Inténtelo de nuevo.", icon: "error", button: "Aceptar" }); }; const [desactivarCorreo, setDesactivarCorreo] = useState(false); const [cambio, setCambio] = useState(0); const enviarCorreo = (correo, codigo) => { const serviceID = "service_bx84r3q"; const templateID = "template_11jpkjs"; const userID = "AOcEsViQIfZLeg0HL"; const templateParams = { to: correo, subject: "Recuperación de contraseña", replyto: "no-reply@example.com", message: `Su código de verificación es: ${codigo}` }; emailjs.send(serviceID, templateID, templateParams, userID) .then((response) => { console.log('Correo enviado', response.status, response.text); }) .catch((err) => { console.error('Error al enviar el correo', err); }); }; const loginUsuario = async (evento) => { evento.preventDefault(); if (cambio === 0) { try { const response = await axios.post('http://localhost:4567/frontend/RecuperarContra', { datosFormulario }); console.log(response.data); if (response.data === 'Usuario encontrado') { console.log("Sí se encontró"); enviarCorreo(datosFormulario.correo, codigoAleatorio); // Enviar correo con el código aleatorio setMostrarCodigo(true); setDesactivarCorreo(true); setCambio(1); } else { console.log("No se encontró"); mostrarAlertaCambioContraFallido(); } return response.data; } catch (error) { throw error; } } else if (cambio === 1) { if (parseInt(datosFormulario.codigo) === codigoAleatorio) { setCodigoVerificado(true); setCambio(2); } else { mostrarAlertaCodigoInvalido(); } } else if (cambio === 2) { try { const response = await axios.post('http://localhost:4567/frontend/ColocarContra2', { datosFormulario }); console.log(response.data); console.log(datosFormulario); enviarCorreo(datosFormulario.correo, codigoAleatorio); // Enviar correo confirmando el cambio de contraseña mostrarAlertaCambioContraExitoso(); } catch (error) { throw error; } } }; const [nombre, setNombre] = useState(''); const [mostrarPopupActualizarInv, setMostrarPopupActualizarInv] = useState(false); const abrirPopupActualizarInv = () => { setMostrarPopupActualizarInv(true); }; const [mostrarPopupVeri, setMostrarPopupVeri] = useState(false); const abrirPopupVeri = () => { setMostrarPopupVeri(true); }; const [mostrarPopupV, setMostrarPopupV] = useState(false); const abrirPopupV = () => { setMostrarPopupV(true); }; const [mostrarPopupIv, setMostrarPopupIv] = useState(false); const abrirPopupIv = () => { setMostrarPopupIv(true); }; const cambiosFormulario = (evento) => { const { name, value } = evento.target; setDatosFormulario({ ...datosFormulario, [name]: value }); setMostrarPopupActualizarInv(false); }; const redirectToHome = () => { navigate("/"); }; const redirectToLogin = () => { navigate("/Login"); }; return ( <> <div className="cuerpo"> <div className="wrapper"> <form> <div className="boton1"> <button type="button" className="button first-button" onClick={redirectToHome}> <span className="button-text"></span> <FaHome /> </button> </div> <h1>Recuperar Contraseña</h1> <label htmlFor="correo" className={`label-correo ${desactivarCorreo ? 'desactivado' : ''}`}>Ingrese su correo:</label> <div className={`input-box ${desactivarCorreo ? 'desactivado' : ''}`}> <input type="text" placeholder="Correo" onChange={cambiosFormulario} name="correo" value={datosFormulario.correo} disabled={desactivarCorreo} /> <FaUser className="icon" /> </div> {mostrarCodigo && ( <div> <label htmlFor="codigo" className="label-correo">Ingrese el código enviado a su correo:</label> <div className="input-box"> <input type="text" placeholder="Código" onChange={cambiosFormulario} name="codigo" value={datosFormulario.codigo} /> <FaLock className="icon" /> </div> </div> )} {codigoVerificado && ( <div> <label htmlFor="password" className="label-correo">Nueva contraseña:</label> <div className="input-box"> <input type="password" placeholder="Contraseña" onChange={cambiosFormulario} name="password" value={datosFormulario.password} /> <FaLock className="icon" /> </div> </div> )} <button className="Entrar" onClick={loginUsuario} disabled={Cargando}> Entrar </button> <Box m={5}> {mostrarPopupV && <PopupV nombre={nombre} onClose={() => setMostrarPopupV(false)} />} </Box> <Box m={5}> {mostrarPopupIv && <PopupIv nombre={nombre} onClose={() => setMostrarPopupIv(false)} />} </Box> <Box m={5}> {mostrarPopupVeri && <PopupActualizar nombre={nombre} onClose={() => setMostrarPopupVeri(false)} />} </Box> <Box m={5}> {mostrarPopupActualizarInv && <PopupActualizarInv nombre={nombre} onClose={() => setMostrarPopupActualizarInv(false)} />} </Box> </form> </div> </div> </> ); } export default RecuperarContra;