iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Web 3

I have an AI ,I have a React, Ugh ,AI -React 系列 第 12

[Day12] 會員頁面 修改密碼

  • 分享至 

  • xImage
  •  

咒語:請幫我用mui 幫我完成會員頁面 包含 更改密碼(fetch("http://localhost:3310/users") 包含邏輯 以及登出按鈕
其中內容要繁體中文

import React, { useState, useEffect } from "react";
import {
  Button,
  Container,
  CssBaseline,
  Grid,
  Paper,
  TextField,
  Typography,
} from "@mui/material";
import { useNavigate } from "react-router-dom";

const Member = () => {
  const navigate = useNavigate();
  const [password, setPassword] = useState("");
  const [newPassword, setNewPassword] = useState("");
  const [confirmNewPassword, setConfirmNewPassword] = useState("");
  const [passwordError, setPasswordError] = useState("");
  const [message, setMessage] = useState("");
  const [isLoading, setIsLoading] = useState(false);

  useEffect(() => {
    // 在此處添加獲取用戶信息的邏輯,可以使用 fetch 請求獲取用戶數據
    // 範例:fetchUserData();
  }, []);
  const updatedUser = {
    password: newPassword, // 更新新密碼
    // 這裡可以包含其他字段,例如 email
  };
  const handleChangePassword = async () => {
    // 驗證密碼是否為空
    if (!password || !newPassword || !confirmNewPassword) {
      setPasswordError("所有字段都必填");
      return;
    }

    // 驗證新密碼和確認密碼是否匹配
    if (newPassword !== confirmNewPassword) {
      setPasswordError("新密碼和確認密碼不匹配");
      return;
    }

    // 獲取當前用戶的 ID,你可以使用 localStorage 中的 token 來識別當前用戶
    const userId = localStorage.getItem("token");

    // 發送更改密碼請求
    try {
      setIsLoading(true);
      const response = await fetch(`http://localhost:3310/users/${userId}`, {
        method: "PUT", // 使用 PUT 請求來更新密碼
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(updatedUser),
      });

      if (response.status === 200) {
        setMessage("密碼已成功更改");
        setPassword("");
        setNewPassword("");
        setConfirmNewPassword("");
        setPasswordError("");
      } else {
        const data = await response.json();
        setMessage(`更改密碼失敗: ${data.message}`);
      }
    } catch (error) {
      console.error("更改密碼時出錯:", error);
      setMessage("更改密碼時出錯");
    } finally {
      setIsLoading(false);
    }
  };

  const handleLogout = () => {
    // 移除本地存儲中的 token
    localStorage.removeItem("token");
    navigate("/");
    // 在此處可以執行其他登出操作,例如重定向到登入頁面等
  };

  return (
    <Container component="main" maxWidth="xs">
      <CssBaseline />
      <Paper
        elevation={3}
        sx={{
          padding: 4,
          display: "flex",
          flexDirection: "column",
          alignItems: "center",
        }}
      >
        <Typography variant="h5" gutterBottom>
          會員頁面
        </Typography>
        <Grid container spacing={2}>
          <Grid item xs={12}>
            <TextField
              fullWidth
              name="password"
              label="當前密碼"
              type="password"
              value={password}
              onChange={(e) => setPassword(e.target.value)}
            />
          </Grid>
          <Grid item xs={12}>
            <TextField
              fullWidth
              name="newPassword"
              label="新密碼"
              type="password"
              value={newPassword}
              onChange={(e) => setNewPassword(e.target.value)}
            />
          </Grid>
          <Grid item xs={12}>
            <TextField
              fullWidth
              name="confirmNewPassword"
              label="確認新密碼"
              type="password"
              value={confirmNewPassword}
              onChange={(e) => setConfirmNewPassword(e.target.value)}
              error={passwordError !== ""}
              helperText={passwordError}
            />
          </Grid>
        </Grid>
        <Button
          fullWidth
          variant="contained"
          color="primary"
          onClick={handleChangePassword}
          disabled={isLoading}
        >
          更改密碼
        </Button>
        <Typography variant="body2" color="textSecondary" sx={{ marginTop: 2 }}>
          {message}
        </Typography>
        <Button
          fullWidth
          variant="contained"
          color="secondary"
          onClick={handleLogout}
          sx={{ marginTop: 2 }}
        >
          登出
        </Button>
      </Paper>
    </Container>
  );
};

export default Member;

UI建構好了 發現邏輯有問題沒辦法發送
咒語:根據localStorage 的token 為Json的Id 要去更改相對應的password

const handleChangePassword = async () => {
  // 驗證密碼是否為空
  if (!password || !newPassword || !confirmNewPassword) {
    setPasswordError("所有字段都必填");
    return;
  }

  // 驗證新密碼和確認密碼是否匹配
  if (newPassword !== confirmNewPassword) {
    setPasswordError("新密碼和確認密碼不匹配");
    return;
  }

  // 獲取當前用戶的 ID,你可以使用 localStorage 中的 token 來識別當前用戶
  const userId = localStorage.getItem("token");

  // 構建要更新的用戶對象
  const updatedUser = {
    password: newPassword, // 更新新密碼
    // 這裡可以包含其他字段,例如 email
  };

  // 發送更改密碼請求
  try {
    setIsLoading(true);
    const response = await fetch(`http://localhost:3310/users/${userId}`, {
      method: "PUT", // 使用 PUT 請求來更新密碼
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(updatedUser), // 傳遞整個用戶對象
    });

    if (response.status === 200) {
      setMessage("密碼已成功更改");
      setPassword("");
      setNewPassword("");
      setConfirmNewPassword("");
      setPasswordError("");
    } else {
      const data = await response.json();
      setMessage(`更改密碼失敗: ${data.message}`);
    }
  } catch (error) {
    console.error("更改密碼時出錯:", error);
    setMessage("更改密碼時出錯");
  } finally {
    setIsLoading(false);
  }
};

這樣的邏輯就可以更改JSON裡的密碼了


上一篇
[Day11] 驗證信箱
下一篇
[Day13]首頁更新 模仿IT 邦
系列文
I have an AI ,I have a React, Ugh ,AI -React 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言