diff --git a/app/components/TopNav.tsx b/app/components/TopNav.tsx index ce85e49..1a2331b 100644 --- a/app/components/TopNav.tsx +++ b/app/components/TopNav.tsx @@ -1,8 +1,10 @@ 'use client'; import Link from 'next/link'; -import { usePathname } from 'next/navigation'; +import { usePathname, useRouter } from 'next/navigation'; import { useState, useEffect } from 'react'; +import { createClient } from '@/lib/supabase/client'; +import type { User } from '@supabase/supabase-js'; const LINKS = [ { href: '/', label: '홈' }, @@ -14,8 +16,11 @@ const LINKS = [ export default function TopNav() { const pathname = usePathname(); + const router = useRouter(); + const supabase = createClient(); const [open, setOpen] = useState(false); const [scrolled, setScrolled] = useState(false); + const [user, setUser] = useState(null); useEffect(() => { const onScroll = () => setScrolled(window.scrollY > 8); @@ -24,6 +29,28 @@ export default function TopNav() { return () => window.removeEventListener('scroll', onScroll); }, []); + // Supabase auth state subscription (Sidebar.tsx:93-103 패턴) + useEffect(() => { + let mounted = true; + supabase.auth.getUser().then(({ data }) => { + if (mounted) setUser(data.user ?? null); + }); + const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => { + if (mounted) setUser(session?.user ?? null); + }); + return () => { + mounted = false; + subscription.unsubscribe(); + }; + }, [supabase]); + + const handleLogout = async () => { + await supabase.auth.signOut(); + setOpen(false); + router.push('/'); + router.refresh(); + }; + useEffect(() => { setOpen(false); }, [pathname]); useEffect(() => { @@ -89,20 +116,45 @@ export default function TopNav() {
- - 로그인 - - - Try now - + {user ? ( + <> + + 마이페이지 + + + + ) : ( + <> + + 로그인 + + + Try now + + + )} + + ) : ( + <> + + 로그인 + + + Try now + + + )}