La parte del frontend es muy sencilla en comparación con la parte del backend. Todo lo que necesito hacer es crear un modal y usarlo para enviar datos dos veces.
Para crear el modal, copié algo de código, los nombres de clase para la encapsulación de un modal, del componente MessageModal en mi proyecto anterior Chat-Nat.
Agregaré el mensaje "¿Olvidaste tu contraseña?" en la página de inicio de sesión y configure el controlador onClick para abrir el modal
Necesito usar un estado booleano para indicar si la OTP se envió al correo electrónico del usuario antes de solicitarla. Estoy nombrando el estado isOTPSent
Aquí hay algunos componentes y ganchos que estoy reutilizando de la interfaz existente de este proyecto:
Aquí está el código completo del modal:
// src/components/PasswordResetModal.tsx import React, { useState } from "react" import AuthForm from "./AuthForm"; import FormInput from "./FormInput"; import Box from "./Box"; import { useAxios } from "../hooks/useAxios"; interface FormData { email: string, new_password: string, otp: string, } interface Props { isVisible: boolean, onClose: () => void, } const PasswordResetModal: React.FC= ({ isVisible, onClose }) => { const [formData, setFormData] = useState ({ email: "", new_password: "", otp: "" }); const [isLoading, setLoading] = useState (false); const [isOTPSent, setOTPSent] = useState (false); const { apiReq } = useAxios(); const handleClose = (e: React.MouseEvent ) => { if ((e.target as HTMLElement).id === "wrapper") { onClose(); // could have setOTPSent(false), but avoiding it in case user misclicks outside } }; const handleChange = (e: React.ChangeEvent ) => { const { name, value } = e.target; setFormData({ ...formData, [name]: value, }); }; const handleSubmit = async (e: React.FormEvent ) => { e.preventDefault(); setLoading(true); if (!isOTPSent) { // first request for sending otp, const response = await apiReq ("post", "/api/reset-password", formData) if (response) { alert("OTP has been sent to your email"); setOTPSent(true); } } else { // then using otp to change password const response = await apiReq ("put", "/api/reset-password", formData) if (response) { alert("Password has been successfully reset\nPlease log in again"); // clear the form setFormData({ email: "", otp: "", new_password: "", }) // close modal onClose(); } } setLoading(false); }; if (!isVisible) return null; return ( ) } export default PasswordResetModal{isOTPSent && ( >)}
Y así es como se maneja la representación condicional del modal en el formulario de inicio de sesión
// src/pages/auth/Login.tsx import PasswordResetModal from "../../components/PasswordResetModal"; const Login: React.FC = () => { const [showModal, setShowModal] = useState(false); return ( ) {/* link to the register page here */}setShowModal(false)} />
¡Hemos terminado! O eso pensé.
Mientras ejecutaba la aplicación en mi entorno de desarrollo, descubrí un error por el cual los correos electrónicos no se enviaban si el backend había estado ejecutándose durante mucho tiempo.
Arreglaremos este error en la próxima publicación
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3