import { Card, CardContent, CardHeader, CardFooter } from '@/components/ui/card'; import { LoginSchema } from '@/data/form'; import { Field, FieldError, FieldLabel } from '@/components/ui/field'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { zodResolver } from '@hookform/resolvers/zod'; import React, { useCallback, useEffect, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom'; import { PageRouting } from '@/const/PageRouting'; import * as z from 'zod'; import { Separator } from '@/components/ui/separator'; import { Validator } from '@/util/Validator'; import { LoginRequest } from '@/data/request/account/LoginRequest'; import { AccountNetwork } from '@/network/AccountNetwork'; import { toast } from 'sonner'; import { useAuthStore } from '@/store/authStore'; import { Checkbox } from '@/components/ui/checkbox'; import { Label } from '@/components/ui/label'; export default function LoginPage() { const [isLoading, setIsLoading] = useState(false); const [autoLogin, setAutoLogin] = useState(false); const { login } = useAuthStore(); const navigate = useNavigate(); const accountNetwork = new AccountNetwork(); const loginForm = useForm>({ resolver: zodResolver(LoginSchema), defaultValues: { id: "", password: "" } }); const { id, password } = { id: loginForm.watch('id'), password: loginForm.watch('password') }; useEffect(() => { localStorage.setItem('autoLogin', `${autoLogin}`) }, [autoLogin]); const moveToSignUpPage = useCallback(() => { navigate(PageRouting["SIGN_UP"].path); }, []); const moveToResetPasswordPage = useCallback(() => { navigate(PageRouting["RESET_PASSWORD"].path); }, []); const moveToHomePage = useCallback(() => { navigate(PageRouting["HOME"].path); }, []); // TODO 33 로그인 기능 구현 const reqLogin = async () => { if (isLoading) return; const type = Validator.isEmail(id) ? 'email' : 'accountId'; const data: LoginRequest = new LoginRequest(type, id, password); setIsLoading(true); const loginPromise = accountNetwork.login(data); toast.promise( loginPromise, { loading: "로그인 중입니다.", success: (res) => { setIsLoading(false); if (res.data.success) { const data = { accessToken: res.data.accessToken!, refreshToken: res.data.refreshToken! }; login({...data}); moveToHomePage(); return ""; } else { throw new Error(res.data.message); } }, error: (err: Error) => err.message || "에러 발생" } ); } const TextSeparator = ({ text }: { text: string }) => { return (
{text}
) } const handleEnterKeyDown = async (e: React.KeyboardEvent) => { if (!(e.key === 'Enter')) return; const result = await loginForm.trigger(); if (!result) return; await reqLogin(); } return (
로그인
( 아이디 또는 이메일 )} > (
비밀번호
)} >
setAutoLogin(value === true)} />
) }