"use client"; import { zodResolver } from "@hookform/resolvers/zod"; import { Loader2 } from "lucide-react"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { Controller, useForm } from "react-hook-form"; import { PasswordInput } from "@/components/password-input"; import { Button } from "@/components/ui/button"; import { Field, FieldError, FieldGroup, FieldLabel } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { tr } from "@/i18n/tr"; import { authClient } from "@/lib/auth-client"; import { looksLikeEmail, normalizeUsername } from "@/shared/schemas/common"; import { loginSchema, type LoginInput } from "@/shared/schemas/auth"; export function LoginForm() { const router = useRouter(); const [formError, setFormError] = useState(null); const form = useForm({ resolver: zodResolver(loginSchema), defaultValues: { identifier: "", password: "" }, }); async function onSubmit({ identifier, password }: LoginInput) { setFormError(null); const value = identifier.trim(); const { error } = looksLikeEmail(value) ? await authClient.signIn.email({ email: value.toLowerCase(), password }) : await authClient.signIn.username({ username: normalizeUsername(value), password }); if (error) { // Hangi bilginin yanlış olduğu söylenmez (hesap tahmini zorlaşır). if (error.status === 429) setFormError(tr.auth.tooManyAttempts); else if (error.code === "BANNED_USER") setFormError(tr.auth.banned); else setFormError(tr.auth.invalidCredentials); form.setValue("password", ""); return; } router.replace("/dashboard"); router.refresh(); } const submitting = form.formState.isSubmitting; return (
( {tr.auth.identifier} {fieldState.invalid ? : null} )} /> ( {tr.auth.password} {fieldState.invalid ? : null} )} /> {formError ? {formError} : null}
); }