フロントエンド部分はバックエンド部分に比べて非常に簡単です。必要なのは、モーダルを作成し、それを使用してデータを 2 回送信することだけです。
モーダルを作成するために、以前のプロジェクト Chat-Nat の MessageModal コンポーネントからコード、モーダルをカプセル化するための classNames をコピーしました。
「パスワードをお忘れですか?」を追加します。ログイン ページのボタンをクリックし、モーダル
を開くように onClick ハンドラーを設定します。OTP を要求する前に、ユーザーの電子メールに OTP が送信されたかどうかをブール状態を使用して示す必要があります。状態に isOTPSent
という名前を付けますこのプロジェクトの既存のフロントエンドから再利用しているコンポーネントとフックをいくつか示します:
モーダルのコード全体は次のとおりです:
// 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 && ( >)}
モーダルの条件付きレンダリングがログイン フォームでどのように処理されるかは次のとおりです
// 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)} />
完了です!そうかと思いました。
開発環境でアプリを実行しているときに、バックエンドが長時間実行されていると電子メールが送信されないというバグを発見しました。
このバグは次の投稿で修正します
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3