From c3a40e1d1131263563476ad151d05c4e2555d68e Mon Sep 17 00:00:00 2001 From: Jecheon Ryu Date: Mon, 21 Apr 2025 04:23:41 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fetch=20=EA=B0=9C=EC=84=A0=20=EC=8B=A4?= =?UTF-8?q?=EC=8A=B5=EC=A4=80=EB=B9=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/pages/LoginPage.js | 43 +++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/components/pages/LoginPage.js b/src/components/pages/LoginPage.js index f383b96..6dcb16d 100644 --- a/src/components/pages/LoginPage.js +++ b/src/components/pages/LoginPage.js @@ -7,13 +7,16 @@ import Button from "../Button"; import HorizontalRule from "../HorizontalRule"; import Link from "next/link"; import styles from "./LoginPage.module.css"; +import { useRouter } from "next/navigation"; function LoginPage() { const [values, setValues] = useState({ email: "", password: "", }); - + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + const router = useRouter(); function handleChange(e) { const { name, value } = e.target; @@ -25,12 +28,33 @@ function LoginPage() { async function handleSubmit(e) { e.preventDefault(); - // TODO: 로그인 처리 - // 1. fetch 를 사용하여 로그인 요청을 보냅니다. - // 2. 성공 시 Application 에 쿠키 내 토큰 저장 여부를 확인합니다. - // 3. 로딩 상태를 만들고 로딩중일 때는 로그인 버튼을 비활성화 합니다. - // 4. 추가로 로딩중일 때는 로그인 버튼텍스트를 "로그인 중..."으로 변경합니다. - // 5. 에러 상태를 만들고 로그인 요청이 실패 시 에러 메시지를 로그인버튼 바로 위에 표시합니다. + try { + setError(null); + setLoading(true); + const response = await fetch( + "https://learn.codeit.kr/api/link-service/auth/login", + { + method: "POST", + credentials: "include", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + email: values.email, + password: values.password, + }), + }, + ); + if (!response.ok) { + throw new Error("로그인에 실패했습니다."); + } + alert("로그인에 성공했습니다."); + router.push("/me"); + } catch (error) { + setError(error.message); + } finally { + setLoading(false); + } } return ( @@ -61,7 +85,10 @@ function LoginPage() { value={values.password} onChange={handleChange} /> - + {error &&
{error}
} + 또는