2025-10-10 11:22:43 +09:00
|
|
|
"use client";
|
2025-10-10 16:07:56 +09:00
|
|
|
// 클라이언트 훅(useState/useEffect)을 사용하여 세션 표시/로그아웃을 처리합니다.
|
2025-10-09 15:36:13 +09:00
|
|
|
import { ThemeToggle } from "@/app/components/ThemeToggle";
|
2025-10-09 16:35:19 +09:00
|
|
|
import { SearchBar } from "@/app/components/SearchBar";
|
2025-10-10 11:22:43 +09:00
|
|
|
import { Button } from "@/app/components/ui/Button";
|
|
|
|
|
import React from "react";
|
2025-10-09 15:36:13 +09:00
|
|
|
|
2025-10-09 15:22:05 +09:00
|
|
|
export function AppHeader() {
|
2025-10-10 11:22:43 +09:00
|
|
|
const [user, setUser] = React.useState<{ nickname: string } | null>(null);
|
2025-10-10 16:07:56 +09:00
|
|
|
// 헤더 마운트 시 세션 존재 여부를 조회해 로그인/로그아웃 UI를 제어합니다.
|
2025-10-10 11:22:43 +09:00
|
|
|
React.useEffect(() => {
|
|
|
|
|
fetch("/api/auth/session")
|
|
|
|
|
.then((r) => r.json())
|
|
|
|
|
.then((d) => setUser(d?.ok ? d.user : null))
|
|
|
|
|
.catch(() => setUser(null));
|
|
|
|
|
}, []);
|
|
|
|
|
const onLogout = async () => {
|
|
|
|
|
await fetch("/api/auth/session", { method: "DELETE" });
|
|
|
|
|
setUser(null);
|
|
|
|
|
location.reload();
|
|
|
|
|
};
|
2025-10-09 15:22:05 +09:00
|
|
|
return (
|
|
|
|
|
<header style={{ display: "flex", justifyContent: "space-between", padding: 12 }}>
|
|
|
|
|
<div>msg App</div>
|
2025-10-09 16:35:19 +09:00
|
|
|
<nav style={{ display: "flex", gap: 12, alignItems: "center" }}>
|
2025-10-09 15:22:05 +09:00
|
|
|
<a href="/">홈</a>
|
|
|
|
|
<a href="/boards">게시판</a>
|
2025-10-09 16:35:19 +09:00
|
|
|
<SearchBar />
|
2025-10-09 15:36:13 +09:00
|
|
|
<ThemeToggle />
|
2025-10-10 11:22:43 +09:00
|
|
|
{user ? (
|
|
|
|
|
<div style={{ display: "flex", alignItems: "center", gap: 8 }}>
|
|
|
|
|
<span>{user.nickname}님</span>
|
|
|
|
|
<Button variant="ghost" onClick={onLogout}>로그아웃</Button>
|
|
|
|
|
</div>
|
|
|
|
|
) : (
|
|
|
|
|
<a href="/login">로그인</a>
|
|
|
|
|
)}
|
2025-10-09 15:22:05 +09:00
|
|
|
</nav>
|
|
|
|
|
</header>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|