#Create a server action to change user password using prisma.
1 messages · Page 1 of 1 (latest)
To create a server action to change the user password using Prisma, you can follow these steps:
-
Create the Server Action: First, you need to create a server action that will handle the password change logic. This action will validate the current password, check if the new password and confirm password match, and then update the password in the database.
-
Integrate the Server Action with the Form: Next, you need to integrate this server action with your form in the edit profile modal.
Here is how you can do it:
Step 1: Create the Server Action
Create a new file, e.g., src/actions/user.action.ts, and add the following code:
"use server";
import { prisma } from "@/lib/prisma"; // Adjust the import based on your project structure
import bcrypt from "bcrypt";
export const changePasswordAction = async (userId: string, currentPassword: string, newPassword: string, confirmNewPassword: string) => {
// Validate new password and confirm password
if (newPassword !== confirmNewPassword) {
throw new Error("New password and confirm password do not match.");
}
// Fetch the user from the database
const user = await prisma.user.findUnique({
where: { id: userId },
});
if (!user) {
throw new Error("User not found.");
}
// Validate current password
const isPasswordValid = await bcrypt.compare(currentPassword, user.password);
if (!isPasswordValid) {
throw new Error("Current password is incorrect.");
}
// Hash the new password
const hashedPassword = await bcrypt.hash(newPassword, 10);
// Update the password in the database
await prisma.user.update({
where: { id: userId },
data: { password: hashedPassword },
});
return { success: true };
};
Step 2: Integrate the Server Action with the Form
In your edit profile modal, you need to call this server action when the form is submitted. Here is an example of how you can do this:
"use client";
import { useState } from "react";
import { useForm } from "react-hook-form";
import { changePasswordAction } from "@/actions/user.action"; // Adjust the import based on your project structure
export default function EditProfileModal() {
const { register, handleSubmit, formState: { errors } } = useForm();
const [serverError, setServerError] = useState<string | null>(null);
const onSubmit = async (data: any) => {
try {
const { currentPassword, newPassword, confirmNewPassword } = data;
await changePasswordAction("user-id", currentPassword, newPassword, confirmNewPassword); // Replace "user-id" with the actual user ID
// Handle success (e.g., show a success message, close the modal, etc.)
} catch (error: any) {
setServerError(error.message);
}
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<TabsContent value="password">
Change your password here.
<div className="mt-4">
<Input
id="currentPassword"
label="Current Password"
type="password"
required
register={register}
errors={errors}
/>
</div>
<div className="mt-4">
<Input
id="newPassword"
label="New Password"
type="password"
required
register={register}
errors={errors}
/>
</div>
<div className
----------------------
Note: you can ask me a follow up question by @ mentioning me again :speech_balloon:
----------------------