1
1
'use client'
2
- import { HEADER , MOBILE_MENU_LIST } from '@/style/zIndex'
3
- import Image from 'next/image'
4
2
import Link from 'next/link'
5
- import React , { useState , useEffect } from 'react'
6
- import { useLockBodyScroll } from 'react-use'
7
-
3
+ import Image from 'next/image'
4
+ import { HEADER , MOBILE_MENU_LIST } from '@/style/zIndex'
5
+ import useScrollDirection from '@/hooks/useScrollDirection'
6
+ import useMobileMenu from '@/hooks/useMobileMenu'
7
+ import { usePathname } from 'next/navigation'
8
+ import { AnimatePresence } from 'framer-motion'
9
+ import Loading from './Loading'
10
+ import useLoadingProgress from '@/hooks/useLoadingProgress'
8
11
//
9
12
//
10
13
//
11
-
12
14
export default function Header ( ) {
13
- const [ isShowHeader , setIsShowHeader ] = useState ( true )
14
- const [ lastScrollY , setLastScrollY ] = useState ( 0 )
15
- const [ isShowMobileMenu , setIsShowMobileMenu ] = useState ( false )
16
- useLockBodyScroll ( isShowMobileMenu )
15
+ const pathname = usePathname ( )
16
+ const isShowHeader = useScrollDirection ( )
17
+ const { isShowMobileMenu, showMobileMenu, hideMobileMenu } = useMobileMenu ( )
18
+ const { isLoading, loadingProgress, startLoading, setLoadingSpeed } =
19
+ useLoadingProgress ( pathname )
17
20
18
- const handleMobileHamburgerClick = ( ) => {
19
- setIsShowMobileMenu ( true )
21
+ const handleMobileLinkClick = ( ) => {
22
+ hideMobileMenu ( )
23
+ startLoading ( )
24
+ setLoadingSpeed ( 5 )
20
25
}
21
26
22
- const handleMobileCloseMenuClick = ( ) => {
23
- setIsShowMobileMenu ( false )
27
+ const handleLinkClick = ( ) => {
28
+ startLoading ( )
29
+ setLoadingSpeed ( 5 )
24
30
}
25
31
26
- useEffect ( ( ) => {
27
- const handleScroll = ( ) => {
28
- if ( typeof window !== 'undefined' ) {
29
- const currentScrollY = window . scrollY
30
- if ( currentScrollY > lastScrollY ) {
31
- setIsShowHeader ( false )
32
- } else {
33
- setIsShowHeader ( true )
34
- }
35
- setLastScrollY ( currentScrollY )
36
- }
37
- }
32
+ const getLinkClass = ( path : string ) => {
33
+ return pathname === path
34
+ ? 'font-pp italic text-HeaderPC px-[0.3rem] relative after:content-[""] after:absolute after:left-0 after:bottom-0 after:h-[2px] after:bg-white after:w-full'
35
+ : 'font-pp font-light italic text-HeaderPC px-[0.3rem] relative after:content-[""] after:absolute after:left-1/2 after:bottom-0 after:h-[2px] after:bg-white after:w-0 hover:after:w-full hover:after:left-0 after:transition-all after:duration-300'
36
+ }
38
37
39
- if ( typeof window !== 'undefined' ) {
40
- window . addEventListener ( 'scroll' , handleScroll )
41
- return ( ) => {
42
- window . removeEventListener ( 'scroll' , handleScroll )
43
- }
44
- }
45
- } , [ lastScrollY ] )
38
+ const getMobileLinkClass = ( path : string ) => {
39
+ return pathname === path
40
+ ? 'px-[3rem] py-[1.1rem] block border-b border-white underline'
41
+ : 'px-[3rem] py-[1.1rem] block border-b border-white'
42
+ }
46
43
47
44
return (
48
45
< >
46
+ < AnimatePresence >
47
+ { isLoading && < Loading loadingProgress = { loadingProgress } /> }
48
+ </ AnimatePresence >
49
49
< header
50
50
className = { `text-white mix-blend-difference w-full flex fixed top-0 p-[2.5rem] transition-transform duration-500 ${
51
51
isShowHeader ? 'translate-y-0' : '-translate-y-full'
@@ -60,35 +60,40 @@ export default function Header() {
60
60
< nav className = "ml-auto hidden tablet:flex gap-[1.5rem]" >
61
61
< Link
62
62
href = { '/about' }
63
- className = "font-pp italic text-HeaderPC p-[0.5rem]" >
63
+ onClick = { handleLinkClick }
64
+ className = { getLinkClass ( '/about' ) } >
64
65
About
65
66
</ Link >
66
67
< Link
67
68
href = { '/project' }
68
- className = "font-pp italic text-HeaderPC p-[0.5rem]" >
69
+ onClick = { handleLinkClick }
70
+ className = { getLinkClass ( '/project' ) } >
69
71
Project
70
72
</ Link >
71
73
< Link
72
74
href = { '/people' }
73
- className = "font-pp italic text-HeaderPC p-[0.5rem]" >
75
+ onClick = { handleLinkClick }
76
+ className = { getLinkClass ( '/people' ) } >
74
77
People
75
78
</ Link >
76
79
< Link
77
80
href = { '/recruit' }
78
- className = "font-pp italic text-HeaderPC p-[0.5rem]" >
81
+ onClick = { handleLinkClick }
82
+ className = { getLinkClass ( '/recruit' ) } >
79
83
Recruit
80
84
</ Link >
81
85
< Link
82
86
href = { '/contact' }
83
- className = "font-pp italic text-HeaderPC p-[0.5rem]" >
87
+ onClick = { handleLinkClick }
88
+ className = { getLinkClass ( '/contact' ) } >
84
89
Contact
85
90
</ Link >
86
91
</ nav >
87
92
{ /* 모바일 */ }
88
93
{ /* 햄버거 버튼 */ }
89
94
< button
90
95
className = "block ml-auto tablet:hidden py-[1rem] pl-[1rem] "
91
- onClick = { handleMobileHamburgerClick } >
96
+ onClick = { showMobileMenu } >
92
97
< Image
93
98
src = { '/icon/button/hamburger-white.svg' }
94
99
width = { 20 }
@@ -104,7 +109,7 @@ export default function Header() {
104
109
} `}
105
110
style = { { zIndex : MOBILE_MENU_LIST } } >
106
111
< button
107
- onClick = { handleMobileCloseMenuClick }
112
+ onClick = { hideMobileMenu }
108
113
className = "absolute top-[2rem] right-[1.5rem] p-[1rem]" >
109
114
< Image
110
115
src = { '/icon/button/closeX-white.svg' }
@@ -114,45 +119,35 @@ export default function Header() {
114
119
/>
115
120
</ button >
116
121
< nav >
117
- < ul className = "font-pp text-[3.2rem] font-[300]" >
122
+ < ul className = "font-pp text-[3.2rem] font-[300] text-white " >
118
123
< Link
119
124
href = "/about"
120
- onClick = { ( ) => {
121
- setIsShowMobileMenu ( false )
122
- } }
123
- className = "px-[3rem] py-[1.1rem] block border-b border-white" >
125
+ onClick = { handleMobileLinkClick }
126
+ className = { getMobileLinkClass ( '/about' ) } >
124
127
About
125
128
</ Link >
126
129
< Link
127
130
href = "/people"
128
- onClick = { ( ) => {
129
- setIsShowMobileMenu ( false )
130
- } }
131
- className = "px-[3rem] py-[1.1rem] block border-b border-white" >
131
+ onClick = { handleMobileLinkClick }
132
+ className = { getMobileLinkClass ( '/people' ) } >
132
133
People
133
134
</ Link >
134
135
< Link
135
- href = "/project "
136
- onClick = { ( ) => {
137
- setIsShowMobileMenu ( false )
138
- } }
139
- className = "px-[3rem] py-[1.1rem] block border-b border-white" >
136
+ href = "/project"
137
+ onClick = { handleMobileLinkClick }
138
+ className = { getMobileLinkClass ( '/project' ) } >
140
139
Project
141
140
</ Link >
142
141
< Link
143
142
href = "/recruit"
144
- onClick = { ( ) => {
145
- setIsShowMobileMenu ( false )
146
- } }
147
- className = "px-[3rem] py-[1.1rem] block border-b border-white" >
143
+ onClick = { handleMobileLinkClick }
144
+ className = { getMobileLinkClass ( '/recruit' ) } >
148
145
Recruit
149
146
</ Link >
150
147
< Link
151
148
href = "/contact"
152
- onClick = { ( ) => {
153
- setIsShowMobileMenu ( false )
154
- } }
155
- className = "px-[3rem] py-[1.1rem] block border-b border-white" >
149
+ onClick = { handleMobileLinkClick }
150
+ className = { getMobileLinkClass ( '/contact' ) } >
156
151
Contact
157
152
</ Link >
158
153
</ ul >
0 commit comments