From 1c9b7240601bed2db57ea981482d3d08b4eb036c Mon Sep 17 00:00:00 2001 From: Chuseok22 Date: Tue, 16 Sep 2025 16:02:46 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Nextjs=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=97=B0=EB=8F=99=20:=20feat=20:=20=EB=B0=B1?= =?UTF-8?q?=EC=97=94=EB=93=9C=20api=20path=20=EC=A4=91=EC=95=99=20type=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC=20https://github.com/TEAM-ROMROM/RomRom-Admi?= =?UTF-8?q?n/issues/6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/api/types.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 src/lib/api/types.ts diff --git a/src/lib/api/types.ts b/src/lib/api/types.ts new file mode 100644 index 0000000..94c41fd --- /dev/null +++ b/src/lib/api/types.ts @@ -0,0 +1,3 @@ +const API_BASE_URL = process.env.API_BASE_URL + +export { API_BASE_URL } \ No newline at end of file From 2b7bcb3709c41551fff7de6f589d35358ac9090a Mon Sep 17 00:00:00 2001 From: Chuseok22 Date: Tue, 16 Sep 2025 16:03:48 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Nextjs=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=97=B0=EB=8F=99=20:=20feat=20:=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=95=84=EC=9B=83=20api=20=EB=B0=8F=20route.ts=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20https://github.com/TEAM-ROMROM/RomRom-Admi?= =?UTF-8?q?n/issues/6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../(with-layout)/_shared/services/logout-api.ts | 13 +++++++++++++ src/app/api/logout/route.ts | 15 +++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 src/app/(with-layout)/_shared/services/logout-api.ts create mode 100644 src/app/api/logout/route.ts diff --git a/src/app/(with-layout)/_shared/services/logout-api.ts b/src/app/(with-layout)/_shared/services/logout-api.ts new file mode 100644 index 0000000..8b53abb --- /dev/null +++ b/src/app/(with-layout)/_shared/services/logout-api.ts @@ -0,0 +1,13 @@ +import httpClient from "@/lib/http-client"; +import { CustomError } from "@/lib/error/custom-error"; +import { ErrorCode } from "@/lib/error/error-code"; + +export async function logout(): Promise { + const api = httpClient(); + const res = await api("/api/logout", { + method: "POST" + }); + if (!res.ok) { + throw new CustomError(ErrorCode.INVALID_REQUEST); + } +} \ No newline at end of file diff --git a/src/app/api/logout/route.ts b/src/app/api/logout/route.ts new file mode 100644 index 0000000..4d88a72 --- /dev/null +++ b/src/app/api/logout/route.ts @@ -0,0 +1,15 @@ +import { API_BASE_URL } from "@/lib/api/types"; +import { CustomError } from "@/lib/error/custom-error"; +import { ErrorCode } from "@/lib/error/error-code"; + +export async function POST(): Promise { + const form = new FormData(); + try { + return await fetch(`${API_BASE_URL}/api/admin/logout`, { + method: 'POST', + body: form + }); + } catch { + throw new CustomError(ErrorCode.INVALID_REQUEST); + } +} \ No newline at end of file From 345f83388f3200f708330c5c7ce04eb41269d053 Mon Sep 17 00:00:00 2001 From: Chuseok22 Date: Tue, 16 Sep 2025 16:04:04 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Nextjs=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=97=B0=EB=8F=99=20:=20feat=20:=20API=5FBASE=5FUR?= =?UTF-8?q?L=20=EC=A4=91=EC=95=99=EA=B4=80=EB=A6=AC=20https://github.com/T?= =?UTF-8?q?EAM-ROMROM/RomRom-Admin/issues/6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/login/route.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/app/api/login/route.ts b/src/app/api/login/route.ts index ee57cb8..cb357c7 100644 --- a/src/app/api/login/route.ts +++ b/src/app/api/login/route.ts @@ -3,8 +3,7 @@ import { LoginRequest, TokenPair } from "@/app/(without-layout)/login/_shared/se import { CustomError } from "@/lib/error/custom-error"; import { ErrorCode } from "@/lib/error/error-code"; import { isLocalhost } from "@/lib/utils"; - -const API_BASE_URL = process.env.API_BASE_URL ?? ''; +import { API_BASE_URL } from "@/lib/api/types"; export async function POST(req: NextRequest): Promise { const ctx = req.headers.get('content-type') || ''; From d2e43cdb280eb78a50eea59e580841164a57ceda Mon Sep 17 00:00:00 2001 From: Chuseok22 Date: Tue, 16 Sep 2025 16:04:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Nextjs=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=97=B0=EB=8F=99=20:=20feat=20:=20=ED=99=88=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20sidebar=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EB=B2=84=ED=8A=BC=20=EC=B6=94=EA=B0=80=20https://g?= =?UTF-8?q?ithub.com/TEAM-ROMROM/RomRom-Admin/issues/6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/app-sidebar.tsx | 47 ++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/src/components/common/app-sidebar.tsx b/src/components/common/app-sidebar.tsx index 6e7ebbc..0809c21 100644 --- a/src/components/common/app-sidebar.tsx +++ b/src/components/common/app-sidebar.tsx @@ -1,3 +1,5 @@ +"use client" + import { Sidebar, SidebarContent, @@ -10,9 +12,13 @@ import { SidebarMenuButton, SidebarMenuItem } from "@/components/ui/sidebar"; -import { Home, Inbox, Settings, User } from "lucide-react"; +import { Home, Inbox, User } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; +import { Button } from "@/components/ui/button"; +import { logout } from "@/app/(with-layout)/_shared/services/logout-api"; +import { useRouter } from "next/navigation"; +import { useState } from "react"; // Menu items. const items = [ @@ -30,15 +36,28 @@ const items = [ title: "회원관리", url: "/member", icon: User, - }, - { - title: "로그아웃", - url: "/logout", - icon: Settings } ] export default function AppSidebar() { + const router = useRouter(); + const [loading, setLoading] = useState(false); + + const onClickLogout = async () => { + if (loading) { + return; + } + setLoading(true); + try { + await logout(); + localStorage.removeItem('accessToken'); + localStorage.removeItem('refreshToken'); + router.replace('/login'); + } finally { + setLoading(false); + } + } + return ( @@ -66,7 +85,19 @@ export default function AppSidebar() { - + + + + + + + - ) + ); }; \ No newline at end of file