"use client"; import { useEffect, useState } from "react"; import { AlertTriangle, Loader2, ShieldCheck } from "lucide-react"; import OtpCodeField from "@/components/OtpCodeField"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useToast } from "@/hooks/use-toast"; import { api } from "@/lib/api"; import { Link } from "@/lib/router"; import { resolveErrorMessage } from "@/lib/utils"; const normalizeDigits = (value: string) => value .replace(/[\u06F0-\u06F9]/g, (digit) => String(digit.charCodeAt(0) - 0x06f0)) .replace(/[\u0660-\u0669]/g, (digit) => String(digit.charCodeAt(0) - 0x0660)); const sanitizeMobile = (value: string) => normalizeDigits(value).replace(/[^\d]/g, ""); export default function ResetPasswordRequest() { const { toast } = useToast(); const [mobile, setMobile] = useState(""); const [code, setCode] = useState(""); const [newPassword, setNewPassword] = useState(""); const [confirmPassword, setConfirmPassword] = useState(""); const [loading, setLoading] = useState(false); const [cooldown, setCooldown] = useState(0); useEffect(() => { if (cooldown <= 0) { return; } const timer = window.setTimeout(() => setCooldown((current) => current - 1), 1000); return () => window.clearTimeout(timer); }, [cooldown]); const handleSendOtp = async () => { try { setLoading(true); const response = await api.sendOtp({ mobile: sanitizeMobile(mobile), mode: "reset_password", }); setCooldown(Math.min(response.expires_in_seconds, 120)); toast({ title: "کد بازیابی ارسال شد", description: response.message, variant: "success", }); } catch (error: unknown) { toast({ title: "ارسال کد انجام نشد", description: resolveErrorMessage(error, "امکان ارسال پیامک بازیابی وجود ندارد."), variant: "destructive", }); } finally { setLoading(false); } }; const handleResetPassword = async (event: React.FormEvent) => { event.preventDefault(); if (newPassword.length < 8) { toast({ title: "رمز عبور کوتاه است", description: "رمز جدید باید حداقل ۸ کاراکتر داشته باشد.", variant: "destructive", }); return; } if (newPassword !== confirmPassword) { toast({ title: "عدم تطابق رمزها", description: "تکرار رمز عبور با رمز جدید یکسان نیست.", variant: "destructive", }); return; } try { setLoading(true); await api.resetPassword({ mobile: sanitizeMobile(mobile), code: normalizeDigits(code), new_password: newPassword, }); toast({ title: "رمز عبور تغییر کرد", description: "اکنون میتوانید با رمز جدید وارد شوید.", variant: "success", }); setCode(""); setNewPassword(""); setConfirmPassword(""); } catch (error: unknown) { toast({ title: "بازیابی ناموفق بود", description: resolveErrorMessage(error, "کد تأیید یا رمز جدید قابل پذیرش نیست."), variant: "destructive", }); } finally { setLoading(false); } }; return (
اگر رمز را فراموش کردهاید
میتوانید از مسیر ورود با گوگل ادامه دهید؛ به شرطی که حساب گوگل شما با ایمیل قدیمیتان یکسان باشد.
گامهای بازیابی