'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import { Loader2 } from 'lucide-react'; import Link from 'next/link'; import { useRouter, useSearchParams } from 'next/navigation'; import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { OAuthButtons } from '@/components/auth/oauth-buttons'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { useAuthStore } from '@/lib/auth-store'; import { loginSchema, type LoginFormData } from '@/lib/validations/auth'; export default function LoginPage() { const router = useRouter(); const searchParams = useSearchParams(); const { login, isLoading, error, clearError } = useAuthStore(); const [showPassword, setShowPassword] = useState(false); const oauthError = searchParams.get('error'); const OAUTH_ERROR_MESSAGES: Record = { oauth_failed: 'Đăng nhập bằng mạng xã hội thất bại. Vui lòng thử lại.', access_denied: 'Bạn đã từ chối quyền truy cập. Vui lòng thử lại.', invalid_request: 'Yêu cầu đăng nhập không hợp lệ. Vui lòng thử lại.', server_error: 'Lỗi máy chủ. Vui lòng thử lại sau.', temporarily_unavailable: 'Dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau.', }; const oauthErrorMessage = oauthError ? OAUTH_ERROR_MESSAGES[oauthError] ?? 'Đã xảy ra lỗi khi đăng nhập. Vui lòng thử lại.' : null; const { register, handleSubmit, formState: { errors }, } = useForm({ resolver: zodResolver(loginSchema), }); const onSubmit = async (data: LoginFormData) => { try { await login(data); router.push('/'); } catch { // Error is handled by the store } }; return ( Đăng nhập Nhập số điện thoại và mật khẩu để đăng nhập
{oauthErrorMessage && (
{oauthErrorMessage}
)} {error && (
{error}
)}
{errors.phone && (

{errors.phone.message}

)}
{errors.password && (

{errors.password.message}

)}
Hoặc đăng nhập với

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

); }