جزء الواجهة الأمامية سهل جدًا مقارنة بالجزء الخلفي. كل ما علي فعله هو إنشاء نموذج واستخدامه لإرسال البيانات مرتين.
لإنشاء النموذج، قمت بنسخ بعض التعليمات البرمجية، وهي classNames لتغليف النموذج، من مكون messageModal في مشروعي السابق Chat-Nat.
سأضيف "هل نسيت كلمة المرور؟" الموجود في صفحة تسجيل الدخول، وقم بتعيين معالج onClick لفتح الوضع المشروط
أحتاج إلى استخدام حالة منطقية للإشارة إلى ما إذا كان قد تم إرسال 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