From c8f96269e053ced29bf028aa3678624280bd666a Mon Sep 17 00:00:00 2001 From: manNomi Date: Wed, 22 Apr 2026 22:27:40 +0900 Subject: [PATCH] =?UTF-8?q?fix(admin):=20=EC=9D=B8=EC=A6=9D=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=ED=94=84=EC=82=AC=EC=9D=B4=ED=81=B4=20=EB=B0=8F=20?= =?UTF-8?q?=EC=82=AC=EC=9D=B4=EB=93=9C=EB=B0=94=20=EB=8F=99=EC=9E=91=20?= =?UTF-8?q?=EC=95=88=EC=A0=95=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/layout/AdminLayout.tsx | 43 +- .../src/components/layout/AdminSidebar.tsx | 27 +- apps/admin/src/lib/api/auth.ts | 28 +- apps/admin/src/lib/api/client.ts | 90 ++-- apps/admin/src/lib/auth/session.ts | 77 +++ apps/admin/src/lib/utils/localStorage.ts | 25 - apps/admin/src/routes/auth/login.tsx | 9 +- apps/admin/src/routes/bruno/index.tsx | 372 +++++++------- apps/admin/src/routes/chat-socket/index.tsx | 472 +++++++----------- apps/admin/src/routes/index.tsx | 6 +- apps/admin/src/routes/scores/index.tsx | 113 ++--- apps/admin/src/types/auth.ts | 2 +- 12 files changed, 591 insertions(+), 673 deletions(-) create mode 100644 apps/admin/src/lib/auth/session.ts diff --git a/apps/admin/src/components/layout/AdminLayout.tsx b/apps/admin/src/components/layout/AdminLayout.tsx index f1be337c..4b027072 100644 --- a/apps/admin/src/components/layout/AdminLayout.tsx +++ b/apps/admin/src/components/layout/AdminLayout.tsx @@ -1,8 +1,25 @@ +import { useNavigate } from "@tanstack/react-router"; +import { LogOut } from "lucide-react"; +import { toast } from "sonner"; +import { clearSession } from "@/lib/auth/session"; +import { type ActiveAdminMenu, AdminSidebar } from "./AdminSidebar"; + interface AdminLayoutProps { children: React.ReactNode; + activeMenu: ActiveAdminMenu; + title: string; + description?: string; } -export function AdminLayout({ children }: AdminLayoutProps) { +export function AdminLayout({ children, activeMenu, title, description }: AdminLayoutProps) { + const navigate = useNavigate(); + + const handleLogout = () => { + clearSession(); + toast.success("로그아웃되었습니다."); + void navigate({ to: "/auth/login" }); + }; + return (
@@ -16,9 +33,29 @@ export function AdminLayout({ children }: AdminLayoutProps) {

Admin

-

운영 콘솔

+
+

운영 콘솔

+ +
-
{children}
+ +
+ +
+
+

{title}

+ {description ?

{description}

: null} + {children} +
+
+
); diff --git a/apps/admin/src/components/layout/AdminSidebar.tsx b/apps/admin/src/components/layout/AdminSidebar.tsx index e2e0a3f9..aeab9a3a 100644 --- a/apps/admin/src/components/layout/AdminSidebar.tsx +++ b/apps/admin/src/components/layout/AdminSidebar.tsx @@ -1,19 +1,19 @@ -import { Building2, FileText, FlaskConical, MessageSquare, UserCircle2 } from "lucide-react"; +import { Link } from "@tanstack/react-router"; +import { FileText, FlaskConical, MessageSquare } from "lucide-react"; import { cn } from "@/lib/utils"; -interface AdminSidebarProps { - activeMenu: "scores" | "bruno" | "chatSocket"; -} +export type ActiveAdminMenu = "scores" | "bruno" | "chatSocket"; const sideMenus = [ - { key: "university", label: "대학 관리", icon: Building2 }, - { key: "mentor", label: "멘토 관리", icon: UserCircle2 }, - { key: "user", label: "유저 관리", icon: UserCircle2 }, { key: "scores", label: "성적 관리", icon: FileText, to: "/scores" as const }, { key: "bruno", label: "Bruno API", icon: FlaskConical, to: "/bruno" as const }, { key: "chatSocket", label: "채팅 소켓", icon: MessageSquare, to: "/chat-socket" as const }, ] as const; +interface AdminSidebarProps { + activeMenu: ActiveAdminMenu; +} + export function AdminSidebar({ activeMenu }: AdminSidebarProps) { return (