"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 (
بازیابی حساب بدون ایمیل بازیابی رمز عبور اکنون با موبایل و کد پیامکی انجام می‌شود. اگر به موبایل ثبت‌شده هم دسترسی ندارید، از همان حساب گوگلی که قبلاً با ایمیل‌تان استفاده می‌کردید کمک بگیرید.

اگر رمز را فراموش کرده‌اید

می‌توانید از مسیر ورود با گوگل ادامه دهید؛ به شرطی که حساب گوگل شما با ایمیل قدیمی‌تان یکسان باشد.

گام‌های بازیابی

  1. ۱. موبایل ثبت‌شده را وارد کنید.
  2. ۲. کد پیامکی را دریافت و ثبت کنید.
  3. ۳. رمز عبور جدید را تعیین کنید.
تغییر رمز عبور با کد پیامکی این فرم جایگزین کامل بازیابی ایمیلی است.
setMobile(sanitizeMobile(event.target.value))} placeholder="09xxxxxxxxx" className="h-12 rounded-2xl" />
setCode(normalizeDigits(value))} disabled={loading} />
setNewPassword(event.target.value)} className="h-12 rounded-2xl" />
setConfirmPassword(event.target.value)} className="h-12 rounded-2xl" />
بازگشت به صفحه ورود
); }