Add: User can change their password

This commit is contained in:
2021-12-13 16:18:02 +08:00
parent f1e8dcfad4
commit 1b0688e523
8 changed files with 301 additions and 10 deletions

View File

@@ -92,3 +92,8 @@ dialog {
display: flex;
justify-content: space-between;
}
.horizontal {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}

View File

@@ -17,6 +17,15 @@ function Manage(props) {
Login
</button>
)}
{props.user.role !== 0 && (
<button
onClick={() => {
navigate(`/manage/users/${props.user.id}`);
}}
>
Edit
</button>
)}
{props.user.role !== 0 && (
<button
onClick={() => {

View File

@@ -5,13 +5,22 @@ import ReviewEntry from "./ReviewEntry";
function UserProfile(props) {
let params = useParams();
const [reviews, setReviews] = useState([]);
const [oldPassword, setOldPassword] = useState("");
const [newPassword, setNewPassword] = useState("");
const [newPasswordConfirm, setNewPasswordConfirm] = useState("");
const [user, setUser] = useState({
id: "",
username: "",
role: "",
active: "",
avatar_id: "",
});
function getReviews() {
fetch("/api/v1/get_reviews_by_user", {
method: "POST",
headers: {
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({
id: parseInt(params.id),
@@ -27,23 +36,131 @@ function UserProfile(props) {
});
}
function getUserInfo() {
fetch("/api/v1/get_user_info", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
id: parseInt(params.id),
}),
})
.then((response) => response.json())
.then((data) => {
if (data.error) {
alert(data.error);
} else {
setUser(data.user);
}
});
}
useEffect(() => {
getReviews();
getUserInfo();
}, []);
return (
<div className="page">
<h3>User Profile</h3>
<div>
<h4>Reviews</h4>
{reviews.map((review) => (
<ReviewEntry
key={review.id}
review={review}
user={props.user}
/>
))}
<div className="horizontal">
<input
type="text"
value={user.username}
onChange={(e) => {
setUser({
...user,
username: e.target.value,
});
}}
/>
<button
onClick={() => {
fetch("/api/v1/update_username", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
id: parseInt(params.id),
username: user.username,
}),
})
.then((response) => response.json())
.then((data) => {
if (data.error) {
alert(data.error);
} else {
props.setUser({
...props.user,
username: user.username,
});
alert("Username updated successfully!");
getUserInfo();
}
});
}}
disabled={props.user.id !== user.id || props.user.role === 1}
>
Save Username
</button>
</div>
<div>
<input
type="password"
value={oldPassword}
placeholder="Old Password"
onChange={(e) => setOldPassword(e.target.value)}
/>
<input
type="password"
value={newPassword}
placeholder="New Password"
onChange={(e) => setNewPassword(e.target.value)}
/>
<input
type="password"
value={newPasswordConfirm}
placeholder="Confirm New Password"
onChange={(e) => setNewPasswordConfirm(e.target.value)}
/>
<button
onClick={() => {
fetch("/api/v1/update_user_password", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
id: parseInt(params.id),
old_password: oldPassword,
new_password: newPassword,
new_password_confirm: newPasswordConfirm,
}),
})
.then((response) => response.json())
.then((data) => {
if (data.error) {
alert(data.error);
} else {
alert("Password updated successfully!");
}
});
}}
disabled={
(props.user.id !== user.id ||
props.user.role !== 1) &&
newPassword !== newPasswordConfirm
}
>
Change Password
</button>
</div>
<h4>Reviews</h4>
{reviews.map((review) => (
<ReviewEntry key={review.id} review={review} user={props.user} />
))}
</div>
);
}