Header.tsx (2557B)
1 import { useToken } from '@/components/contexts/TokenContext' 2 import Navbar from '@/components/layout/Navbar' 3 import NavbarDropdownItem from '@/components/layout/NavbarDropdownItem' 4 import NavbarDropdownLabel from '@/components/layout/NavbarDropdownLabel' 5 import NavbarItem from '@/components/layout/NavbarItem' 6 import classNames from '@/lib/classnames' 7 import { UserProfile } from '@/lib/models/user_profile' 8 import { AccessTokenPayload } from '@/lib/security/token' 9 import { useEffect, useState } from 'react' 10 import styles from './Header.module.css' 11 12 export default function Header () { 13 const token = useToken() 14 15 const [userProfile, setUserProfile] = useState<UserProfile | null>(null) 16 useEffect(() => { 17 if (token == null) { 18 return 19 } 20 21 fetch('/api/users/me', { 22 headers: { 23 Authorization: `Bearer ${token}` 24 } 25 }) 26 .then(response => response.json()) 27 .then(data => { 28 setUserProfile(data) 29 }) 30 }, [token]) 31 32 return ( 33 <header {...classNames(styles.header)}> 34 <Navbar> 35 {userProfile == null || token == null ? ( 36 <> 37 <NavbarItem href={'/users/login'}>Login</NavbarItem> 38 <NavbarItem href={'/users/signup'}>Sign up</NavbarItem> 39 </> 40 ) : ( 41 <> 42 <NavbarDropdownItem label={userProfile.nickname}> 43 <NavbarItem href={`/users/${userProfile.loginId}`}> 44 내 프로필 45 </NavbarItem> 46 47 <hr /> 48 49 <WikiLinkList token={token} /> 50 51 <hr /> 52 53 <NavbarItem href={`/users/logout`}> 54 로그아웃 55 </NavbarItem> 56 </NavbarDropdownItem> 57 </> 58 )} 59 </Navbar> 60 </header> 61 ) 62 } 63 64 interface WikiListProps { 65 token: AccessTokenPayload 66 } 67 68 function WikiLinkList (props: WikiListProps) { 69 const [wikis, setWikis] = useState<Array<{ title: string; slug: string }>>([]) 70 71 useEffect(() => { 72 fetch(`/api/users/${props.token.uid}/wikis?format=links`, { 73 method: 'GET', 74 }) 75 .then(resp => resp.json()) 76 .then(data => setWikis(data)) 77 }, [props.token?.uid]) 78 79 return ( 80 <> 81 <NavbarDropdownLabel>내 위키</NavbarDropdownLabel> 82 83 <div className={styles['wiki-list']}> 84 {wikis.map(wiki => ( 85 <NavbarItem key={wiki.slug} href={`/wiki/${wiki.slug}`}> 86 {wiki.title} 87 </NavbarItem> 88 ))} 89 90 <NavbarItem href={`/wiki/new`}> 91 새 위키 만들기 92 </NavbarItem> 93 </div> 94 </> 95 ) 96 }