La partie frontend est très simple par rapport à la partie backend. Tout ce que j'ai à faire est de créer un modal et de l'utiliser pour envoyer des données deux fois.
Pour créer le modal, j'ai copié du code, les classNames pour l'encapsulation d'un modal, à partir du composant MessageModal de mon projet précédent Chat-Nat.
J'ajouterai un message "Mot de passe oublié ?" sur la page de connexion et définissez le gestionnaire onClick pour ouvrir le modal
Je dois utiliser un état booléen pour indiquer si l'OTP a été envoyé à l'adresse e-mail de l'utilisateur avant de le demander. Je nomme l'état isOTPSent
Voici quelques composants et hooks que je réutilise à partir de l'interface existante de ce projet :
Voici le code complet du 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 && ( >)}
Et voici comment le rendu conditionnel du modal est géré dans le formulaire de connexion
// 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)} />
Nous avons terminé ! C'est du moins ce que je pensais.
Lors de l'exécution de l'application dans mon environnement de développement, j'ai découvert un bug empêchant les e-mails de passer si le backend fonctionnait depuis longtemps.
Nous corrigerons ce bug dans le prochain post
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3