import { createFileRoute, redirect, useNavigate } from '@tanstack/react-router' import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, } from '@/components/ui/card' import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Button } from '@/components/ui/button' import { formOptions, useForm, } from '@tanstack/react-form' import { useLogin } from '@/hooks/queries' import { toast } from 'sonner' interface LoginFormProps { username: string password: string } const defaultInput: LoginFormProps = { username: '', password: '', } const formOpts = formOptions({ defaultValues: defaultInput, }) export const Route = createFileRoute('/(auth)/login/')({ beforeLoad: async ({ context }) => { const { token } = context.auth if (token) throw redirect({ to: '/' }) }, component: LoginForm, }) function LoginForm() { const navigate = useNavigate() const loginMutation = useLogin() const form = useForm({ ...formOpts, onSubmit: async ({ value }) => { try { await loginMutation.mutateAsync({ username: value.username, password: value.password, }) toast.success('Đăng nhập thành công!') navigate({ to: '/' }) } catch (error: any) { console.error('Login error:', error) toast.error( error.response?.data?.message || 'Tài khoản hoặc mật khẩu không đúng.' ) } }, }) return ( Đăng nhập Vui lòng nhập thông tin đăng nhập của bạn.
{ e.preventDefault() form.handleSubmit() }} className="space-y-4" > {/* Username */} {(field) => (
field.handleChange(e.target.value)} placeholder="Tên đăng nhập" /> {field.state.meta.isTouched && field.state.meta.errors && (

{field.state.meta.errors}

)}
)}
{/* Password */} {(field) => (
field.handleChange(e.target.value)} placeholder="Mật khẩu" /> {field.state.meta.isTouched && field.state.meta.errors && (

{field.state.meta.errors}

)}
)}

Chưa có tài khoản? Đăng ký

) }