"use client"; import { useState } from "react"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useQuery } from "@tanstack/react-query"; import { CheckCircle2, Loader2, ShieldCheck, Timer, Zap } from "lucide-react"; import { BrandMark } from "@/components/brand-mark"; import { useAuth } from "@/lib/auth-store"; import { ApiError, http, toUserError } from "@/lib/api"; import type { User } from "@/lib/types"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { PasswordInput } from "@/components/ui/password-input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { CaptchaField, type CaptchaChallenge } from "@/components/captcha-field"; const perks = [ { icon: Timer, text: "زمان تماشای راستی‌آزمایی‌شده — بدون میان‌بر" }, { icon: ShieldCheck, text: "قفل‌شدن پس از سه اشتباه، تا وقتی واقعاً یاد بگیرید" }, { icon: CheckCircle2, text: "لیگ هفتگی، رویداد زنده و منتور یک‌به‌یک" }, ]; export default function LoginPage() { const router = useRouter(); const setSession = useAuth((s) => s.setSession); const [email, setEmail] = useState(""); const [password, setPassword] = useState(""); const [captchaAnswer, setCaptchaAnswer] = useState(""); const [challenge, setChallenge] = useState(null); const [captchaKey, setCaptchaKey] = useState(0); const [rememberMe, setRememberMe] = useState(false); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [captchaError, setCaptchaError] = useState(null); const { data: registerStatus } = useQuery({ queryKey: ["auth", "register-status"], queryFn: () => http.get<{ enabled: boolean }>("/api/auth/register-status"), }); const submit = async (e: React.FormEvent) => { e.preventDefault(); if (!challenge) { setCaptchaError("ابتدا کد امنیتی را بارگذاری کنید"); setCaptchaKey((k) => k + 1); return; } setLoading(true); setError(null); try { const data = await http.post<{ accessToken: string; refreshToken: string; user: User }>("/api/auth/login", { username: email, password, challengeId: challenge.challengeId, captchaAnswer, rememberMe, }); setSession(data.accessToken, data.refreshToken, data.user); router.push("/cap"); } catch (err) { setError(toUserError(err, "ورود ناموفق بود")); // 429 is returned before the captcha is consumed, so keep this challenge. if (!(err instanceof ApiError) || err.status !== 429) { setCaptchaKey((k) => k + 1); } } finally { setLoading(false); } }; return (
{/* brand panel */} {/* form panel */}
خوش برگشتید برای ادامه مسیر خود وارد شوید.
setEmail(e.target.value)} required dir="ltr" className="text-left" />
setPassword(e.target.value)} required placeholder="رمز عبور" />
{(error || captchaError) && (

{error || captchaError}

)}

{registerStatus?.enabled ? ( <> حساب ندارید؟{" "} ثبت‌نام ) : ( "حساب شما توسط متصدی بوت‌کمپ ساخته و اعلام می‌شود." )}

); }