11import HeaderNav from './HeaderNav' ;
2- import { useEffect , useState } from 'react' ;
2+ import { useEffect , useRef , useState } from 'react' ;
33import { Link , useLocation } from 'react-router-dom' ;
44import Countdown from 'react-countdown' ;
55import './header.css' ;
@@ -10,6 +10,50 @@ const Header = () => {
1010 const pathName = location . pathname ;
1111
1212 const [ reset , setReset ] = useState ( { search : false , filter : false } ) ;
13+ const [ showNav , setShowNav ] = useState ( true ) ;
14+ const lastScrollY = useRef ( 0 ) ;
15+
16+ useEffect ( ( ) => {
17+ const handleScroll = ( ) => {
18+ const current = window . scrollY ;
19+
20+ const hero = document . getElementById ( 'hero' ) ;
21+
22+ if ( hero ) {
23+ const heroBottom = hero . getBoundingClientRect ( ) . bottom ;
24+ const headerHeight = 64 ; // your navbar height
25+
26+ const banner = document . querySelector ( '.activity-timer-banner' ) ;
27+ const bannerHeight = banner ?. offsetHeight || 0 ;
28+
29+ if ( heroBottom > headerHeight + bannerHeight ) {
30+ setShowNav ( true ) ;
31+ lastScrollY . current = current ;
32+
33+ return ;
34+ }
35+ }
36+
37+ // after hero → direction based (with threshold)
38+ const SCROLL_THRESHOLD = 20 ;
39+ const diff = Math . abs ( current - lastScrollY . current ) ;
40+
41+ // ignore tiny scrolls
42+ if ( diff < SCROLL_THRESHOLD ) return ;
43+
44+ if ( current > lastScrollY . current ) {
45+ setShowNav ( false ) ; // down
46+ } else {
47+ setShowNav ( true ) ; // up
48+ }
49+
50+ lastScrollY . current = current ;
51+ } ;
52+
53+ window . addEventListener ( 'scroll' , handleScroll ) ;
54+
55+ return ( ) => window . removeEventListener ( 'scroll' , handleScroll ) ;
56+ } , [ ] ) ;
1357
1458 useEffect ( ( ) => {
1559 if ( location . state ) {
@@ -95,7 +139,7 @@ const Header = () => {
95139 } ;
96140
97141 return (
98- < >
142+ < div className = { `nav-wrapper ${ showNav ? 'nav--visible' : 'nav--hidden' } ` } >
99143 { process . env . REACT_APP_ACTIVITIES_ON === 'true' && showHideBits . showActivityTimer && (
100144 < Countdown date = { new Date ( 1675209600000 ) } renderer = { activityTimerRenderer } />
101145 ) }
@@ -122,7 +166,7 @@ const Header = () => {
122166
123167 < HeaderNav showBrowse = { showHideBits . showBrowse } />
124168 </ header >
125- </ >
169+ </ div >
126170 ) ;
127171} ;
128172
0 commit comments