「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パスワード リセット機能: フロントエンド

パスワード リセット機能: フロントエンド

2024 年 11 月 1 日に公開
ブラウズ:723

Password Reset Feature: Frontend

フロントエンド

フロントエンド部分はバックエンド部分に比べて非常に簡単です。必要なのは、モーダルを作成し、それを使用してデータを 2 回送信することだけです。

  • まず OTP を送信する電子メールを送信します
  • その後、OTP と新しいパスワードを送信して変更します

モーダルを作成するために、以前のプロジェクト Chat-Nat の MessageModal コンポーネントからコード、モーダルをカプセル化するための classNames をコピーしました。

企画

「パスワードをお忘れですか?」を追加します。ログイン ページのボタンをクリックし、モーダル

を開くように onClick ハンドラーを設定します。

OTP を要求する前に、ユーザーの電子メールに OTP が送信されたかどうかをブール状態を使用して示す必要があります。状態に isOTPSent

という名前を付けます
  • !isOTPSent -> メール アドレスを尋ねるだけで、API 要求を送信し、成功した場合は setOTPSent(true)
  • isOTPSent の場合 -> OTP と新しいパスワードも要求し、成功した場合はモーダルを閉じます

このプロジェクトの既存のフロントエンドから再利用しているコンポーネントとフックをいくつか示します:

  • ボックス -> ログインページと登録ページをカードにきちんと包み込み、ページの中央に配置し、ここでは「パスワードのリセット」というタイトルで再利用しました
  • AuthForm -> ただのフォームですが、サーバーからの応答を待っているときに送信ボタンを無効にし、ボタンのテキストを「読み込み中...」に設定するようにコーディングしました。
  • FormInput -> 独自のラベルを持つ入力フィールド、値セッターと onChange ハンドラー、オプションで isRequired ブール値を持つ
  • useAxios -> トークンの更新が必要なサーバーからの応答を処理するカスタム フック。通常のリクエスト送信用の apiReq 関数、alert() とリフレッシュ トークンを表示するためのカスタム エラー処理、認証トークンをリフレッシュして最初のリクエストを再試行するための freshReq 関数。

モーダルのコード全体は次のとおりです:

// 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 (
        
{isOTPSent && ( >)}
) } export default PasswordResetModal

モーダルの条件付きレンダリングがログイン フォームでどのように処理されるかは次のとおりです

// 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)} />
)

完了です!そうかと思いました。

開発環境でアプリを実行しているときに、バックエンドが長時間実行されていると電子メールが送信されないというバグを発見しました。

このバグは次の投稿で修正します

リリースステートメント この記事は次の場所に転載されています: https://dev.to/bitorsic/3-password-reset-feature-frontend-3623?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3