A parte de frontend é muito fácil em comparação com a parte de backend. Tudo que preciso fazer é criar um modal e usá-lo para enviar dados duas vezes.
Para criar o modal, copiei alguns códigos, os classNames para o encapsulamento de um modal, do componente MessageModal em meu projeto anterior Chat-Nat.
Adicionarei uma mensagem "Esqueceu a senha?" botão na página de login e defina o manipulador onClick para abrir o modal
Preciso usar um estado booleano para indicar se o OTP foi enviado para o e-mail do usuário antes de solicitá-lo. Estou nomeando o estado como isOTPSent
Aqui estão alguns componentes e ganchos que estou reutilizando do frontend existente deste projeto:
Aqui está o código completo do 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 && ( >)}
E aqui está como a renderização condicional do modal é tratada no formulário de Login
// 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)} />
Terminamos! Ou foi o que pensei.
Ao executar o aplicativo em meu ambiente de desenvolvimento, descobri um bug em que os e-mails não seriam enviados se o back-end estivesse em execução há muito tempo.
Corrigiremos esse bug na próxima postagem
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3