diff --git a/front/src/features/auth/components/LoginForm.tsx b/front/src/features/auth/components/LoginForm.tsx new file mode 100644 index 0000000..403c1c4 --- /dev/null +++ b/front/src/features/auth/components/LoginForm.tsx @@ -0,0 +1,60 @@ +import { Button, Input } from '@/components' +import { useLogin } from '@/features/auth/hooks/useLogin' + +const inputClassName = 'h-12 rounded-md px-4 text-base' + +export function LoginForm() { + const { + id, + password, + errorMessage, + isLoading, + onIdChange, + onPasswordChange, + onLogin, + } = useLogin() + + return ( +
+ ) +} + +export default LoginForm diff --git a/front/src/features/auth/hooks/useLogin.ts b/front/src/features/auth/hooks/useLogin.ts new file mode 100644 index 0000000..37a0470 --- /dev/null +++ b/front/src/features/auth/hooks/useLogin.ts @@ -0,0 +1,55 @@ +import { useState } from 'react' +import { useNavigate } from 'react-router' +import { useLoginMutation } from '@/features/auth/hooks/useLoginMutation' + +export function useLogin() { + const navigate = useNavigate() + const loginMutation = useLoginMutation() + const [id, setId] = useState('') + const [password, setPassword] = useState('') + const [errorMessage, setErrorMessage] = useState('') + + const onIdChange = (value: string) => { + setId(value) + if (errorMessage) setErrorMessage('') + } + + const onPasswordChange = (value: string) => { + setPassword(value) + if (errorMessage) setErrorMessage('') + } + + const onLogin = () => { + if (!id || !password) { + setErrorMessage('아이디와 비밀번호를 입력해주세요.') + return + } + + loginMutation.mutate( + { id, password }, + { + onSuccess: () => { + setErrorMessage('') + navigate('/list') + }, + onError: (error) => { + setErrorMessage( + error instanceof Error + ? error.message + : '아이디 또는 비밀번호가 올바르지 않습니다.', + ) + }, + }, + ) + } + + return { + id, + password, + errorMessage, + isLoading: loginMutation.isPending, + onIdChange, + onPasswordChange, + onLogin, + } +} diff --git a/front/src/features/auth/hooks/useLoginMutation.ts b/front/src/features/auth/hooks/useLoginMutation.ts new file mode 100644 index 0000000..d783d7f --- /dev/null +++ b/front/src/features/auth/hooks/useLoginMutation.ts @@ -0,0 +1,20 @@ +import { useMutation } from '@tanstack/react-query' + +export interface LoginParams { + id: string + password: string +} + +/** + * 로그인 mutation (임시 stub). + * + * TODO: mutationFn 을 실제 백엔드 호출로 교체. + * 현재는 API 미연동 상태라 검증만 통과하면 성공 처리한다. + */ +export function useLoginMutation() { + return useMutation