"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { ActionButton } from "@/components/ui/action-button"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { api } from "@/lib/trpc"; import { zodResolver } from "@hookform/resolvers/zod"; import { TRPCClientError } from "@trpc/client"; import { AlertCircle, CheckCircle } from "lucide-react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zResetPasswordSchema } from "@karakeep/shared/types/users"; const resetPasswordSchema = z .object({ confirmPassword: z.string(), }) .merge(zResetPasswordSchema.pick({ newPassword: true })) .refine((data) => data.newPassword === data.confirmPassword, { message: "Passwords don't match", path: ["confirmPassword"], }); interface ResetPasswordFormProps { token: string; } export default function ResetPasswordForm({ token }: ResetPasswordFormProps) { const [isSuccess, setIsSuccess] = useState(false); const [errorMessage, setErrorMessage] = useState(""); const router = useRouter(); const form = useForm>({ resolver: zodResolver(resetPasswordSchema), }); const resetPasswordMutation = api.users.resetPassword.useMutation(); const onSubmit = async (values: z.infer) => { try { setErrorMessage(""); await resetPasswordMutation.mutateAsync({ token, newPassword: values.newPassword, }); setIsSuccess(true); } catch (error) { if (error instanceof TRPCClientError) { setErrorMessage(error.message); } else { setErrorMessage("An unexpected error occurred. Please try again."); } } }; return ( {isSuccess ? "Password reset successful" : "Reset your password"} {isSuccess ? "Your password has been successfully reset. You can now sign in with your new password." : "Enter your new password below."} {isSuccess ? ( <>
Your password has been successfully reset. You can now sign in with your new password. router.push("/signin")} className="w-full" > Go to Sign In ) : ( <>
{errorMessage && ( {errorMessage} )} ( New Password )} /> ( Confirm New Password )} /> Reset Password
router.push("/signin")} className="w-full" > Back to Sign In
)}
); }