Skip to content

Commit c4f5daa

Browse files
committed
feat(social-login) : oauth 페이지들에 있는 공통 콜백 useOAuthCallback.ts으로 컴포넌트화
1 parent 7617db7 commit c4f5daa

3 files changed

Lines changed: 46 additions & 57 deletions

File tree

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,10 @@
11
"use client";
2+
import { useOAuthCallback } from "@/hooks/useOAuthCallback";
23

3-
import { useEffect } from "react";
4-
import { useRouter, useSearchParams } from "next/navigation";
5-
6-
export default function KakaoCallbackPage() {
7-
const router = useRouter();
8-
const params = useSearchParams();
9-
const code = params.get("code");
10-
11-
useEffect(() => {
12-
if (!code) return;
13-
14-
const login = async () => {
15-
const res = await fetch(
16-
`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/v1/auth/login/google?code=${code}`,
17-
{
18-
method: "GET",
19-
credentials: "include", // 쿠키 방식이면 필수
20-
}
21-
);
22-
23-
if (res.ok) {
24-
router.replace("/home");
25-
} else {
26-
router.replace("/sign-in");
27-
}
28-
};
29-
30-
login();
31-
}, [code, router]);
4+
// TODO: 로그인 실패 시 서버 에러 메시지 기반 분기 처리
5+
// TODO: 네트워크 오류/타임아웃에 대한 UX 개선 (로딩/재시도)
326

7+
export default function GoogleCallbackPage() {
8+
useOAuthCallback("google");
339
return <p>구글 로그인 처리 중...</p>;
3410
}
Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,10 @@
11
"use client";
2+
import { useOAuthCallback } from "@/hooks/useOAuthCallback";
23

3-
import { useEffect } from "react";
4-
import { useRouter, useSearchParams } from "next/navigation";
4+
// TODO: 로그인 실패 시 서버 에러 메시지 기반 분기 처리
5+
// TODO: 네트워크 오류/타임아웃에 대한 UX 개선 (로딩/재시도)
56

67
export default function KakaoCallbackPage() {
7-
const router = useRouter();
8-
const params = useSearchParams();
9-
const code = params.get("code");
10-
11-
useEffect(() => {
12-
if (!code) return;
13-
14-
const login = async () => {
15-
const res = await fetch(
16-
`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/v1/auth/login/kakao?code=${code}`,
17-
{
18-
method: "GET",
19-
credentials: "include", // 쿠키 방식이면 필수
20-
}
21-
);
22-
23-
if (res.ok) {
24-
router.replace("/home");
25-
} else {
26-
router.replace("/sign-in");
27-
}
28-
};
29-
30-
login();
31-
}, [code, router]);
32-
8+
useOAuthCallback("kakao");
339
return <p>카카오 로그인 처리 중...</p>;
3410
}

src/hooks/useOAuthCallback.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"use client";
2+
3+
import { useEffect } from "react";
4+
import { useRouter, useSearchParams } from "next/navigation";
5+
6+
export function useOAuthCallback(provider: "google" | "kakao") {
7+
const router = useRouter();
8+
const params = useSearchParams();
9+
const code = params.get("code");
10+
11+
useEffect(() => {
12+
if (!code) return;
13+
14+
const login = async () => {
15+
try {
16+
const res = await fetch(
17+
`${process.env.NEXT_PUBLIC_API_BASE_URL}/api/v1/auth/login/${provider}?code=${code}`,
18+
{
19+
method: "GET",
20+
credentials: "include",
21+
}
22+
);
23+
24+
if (!res.ok) {
25+
throw new Error("OAuth login failed");
26+
}
27+
28+
router.replace("/home");
29+
} catch (error) {
30+
console.error(`[OAuth ${provider}] 로그인 실패`, error);
31+
router.replace("/sign-in");
32+
}
33+
};
34+
35+
login();
36+
}, [code, provider, router]);
37+
}

0 commit comments

Comments
 (0)