"use client"; import { useState } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { Button } from "~/components/ui/button"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { api } from "~/trpc/react"; const passwordSchema = z .object({ currentPassword: z.string().min(1, "Current password is required"), newPassword: z .string() .min(6, "Password must be at least 6 characters") .max(100, "Password is too long"), confirmPassword: z.string().min(1, "Please confirm your new password"), }) .refine((data) => data.newPassword === data.confirmPassword, { message: "Passwords don't match", path: ["confirmPassword"], }); type PasswordFormData = z.infer; export function PasswordChangeForm() { const [showForm, setShowForm] = useState(false); const form = useForm({ resolver: zodResolver(passwordSchema), defaultValues: { currentPassword: "", newPassword: "", confirmPassword: "", }, }); const changePassword = api.users.changePassword.useMutation({ onSuccess: () => { form.reset(); setShowForm(false); }, onError: (error) => { console.error("Error changing password:", error); }, }); const onSubmit = (data: PasswordFormData) => { changePassword.mutate({ currentPassword: data.currentPassword, newPassword: data.newPassword, }); }; const handleCancel = () => { form.reset(); setShowForm(false); }; if (!showForm) { return (

Change your account password for enhanced security

); } return (
{changePassword.error && (

Error changing password

{changePassword.error.message}

)} {changePassword.isSuccess && (

Password changed successfully

Your password has been updated.

)}
{form.formState.errors.currentPassword && (

{form.formState.errors.currentPassword.message}

)}
{form.formState.errors.newPassword && (

{form.formState.errors.newPassword.message}

)}
{form.formState.errors.confirmPassword && (

{form.formState.errors.confirmPassword.message}

)}
); }