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 (