/* ┌──────────────────────────────────────────────────────────────────────────────┐ │ @author: Davidson Gomes │ │ @file: /app/security/reset-password/page.tsx │ │ Developed by: Davidson Gomes │ │ Creation date: May 13, 2025 │ │ Contact: contato@evolution-api.com │ ├──────────────────────────────────────────────────────────────────────────────┤ │ @copyright © Evolution API 2025. All rights reserved. │ │ Licensed under the Apache License, Version 2.0 │ │ │ │ You may not use this file except in compliance with the License. │ │ You may obtain a copy of the License at │ │ │ │ http://www.apache.org/licenses/LICENSE-2.0 │ │ │ │ Unless required by applicable law or agreed to in writing, software │ │ distributed under the License is distributed on an "AS IS" BASIS, │ │ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. │ │ See the License for the specific language governing permissions and │ │ limitations under the License. │ ├──────────────────────────────────────────────────────────────────────────────┤ │ @important │ │ For any future changes to the code in this file, it is recommended to │ │ include, together with the modification, the information of the developer │ │ who changed it and the date of modification. │ └──────────────────────────────────────────────────────────────────────────────┘ */ "use client"; import { useState, useEffect, Suspense } from "react"; import { useRouter, useSearchParams } from "next/navigation"; import { Card, CardHeader, CardTitle, CardContent, CardFooter, } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Button } from "@/components/ui/button"; import { Alert, AlertTitle, AlertDescription } from "@/components/ui/alert"; import { Loader2, CheckCircle2, XCircle } from "lucide-react"; import { resetPassword } from "@/services/authService"; import Link from "next/link"; export default function ResetPasswordPageWrapper() { return ( ); } function ResetPasswordPage() { const router = useRouter(); const searchParams = useSearchParams(); const tokenFromUrl = searchParams.get("token") || ""; const [form, setForm] = useState({ token: tokenFromUrl, password: "", confirmPassword: "", }); const [status, setStatus] = useState< "idle" | "loading" | "success" | "error" >("idle"); const [error, setError] = useState(null); const [redirectSeconds, setRedirectSeconds] = useState(5); const handleChange = (e: React.ChangeEvent) => { setForm({ ...form, [e.target.name]: e.target.value }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setError(null); if (!form.token) { setError("Recovery token is required."); setStatus("error"); return; } if (form.password !== form.confirmPassword) { setError("Passwords do not match."); setStatus("error"); return; } setStatus("loading"); try { await resetPassword({ token: form.token, new_password: form.password }); setStatus("success"); } catch (err: any) { setError(err?.response?.data?.message || "Failed to reset password."); setStatus("error"); } }; useEffect(() => { if (status === "success" && redirectSeconds > 0) { const timer = setTimeout(() => { setRedirectSeconds((s) => s - 1); }, 1000); return () => clearTimeout(timer); } if (status === "success" && redirectSeconds === 0) { router.push("/login"); } }, [status, redirectSeconds, router]); return (
Reset Password {status === "success" ? ( Password reset! Your password has been updated.
Redirecting to login in {redirectSeconds} seconds...
) : ( <> {status === "error" && ( Reset failed {error} )}
)}
{status !== "success" && ( )}
Go to Login
); }