@@ -5,6 +5,9 @@ import { breakpoints, colors } from '../utils/variables'
55import  Hamburger  from  '../resources/hamburger.svg' 
66import  Multiply  from  '../resources/multiply.svg' 
77import  TheiaLogoDark  from  '../resources/theia-logo-dark.svg' 
8+ import  {  useState  }  from  'react' 
9+ import  {  useEffect  }  from  'react' 
10+ import  {  useRef  }  from  'react' 
811
912const  StyledNav  =  styled . div ` 
1013    @media(max-width: ${ breakpoints . xmd }  ) { 
@@ -14,6 +17,12 @@ const StyledNav = styled.div`
1417        right: 0; 
1518    } 
1619
20+     &.fixed { 
21+         position: fixed; 
22+         background: #fff; 
23+         width: 100%; 
24+     } 
25+ 
1726    .nav { 
1827        display: flex; 
1928        position: relative; 
@@ -144,58 +153,66 @@ const StyledNav = styled.div`
144153    } 
145154` 
146155
147- class  Nav  extends  React . Component  { 
156+ const  Nav  =  ( {  shouldRenderLogo } )  =>  { 
157+     const  [ isNavRendered ,  setIsNavRendered ]  =  useState ( false ) 
158+     const  navRef  =  useRef ( null )  
148159
149-     state   =  { 
150-         isNavRendered :  false , 
160+     const   toggleNavigation   =   ( )   =>  { 
161+         setIsNavRendered ( ! isNavRendered ) 
151162    } 
152163
153-     toggleNavigation  =  ( )  =>  { 
154-         this . setState ( {  isNavRendered : ! this . state . isNavRendered  } ) 
164+     const  handleScroll  =  ( )  =>  { 
165+         if  ( window . scrollY  >  200 )  { 
166+             navRef . current . classList . add ( 'fixed' ) 
167+         } 
155168    } 
156169
157-     render ( )  { 
158-         const  {  shouldRenderLogo }  =  this . props 
159-         return  ( 
160-             < StyledNav > 
161-                 < nav  className = "nav"  style = {  this . state . isNavRendered  ? {  background : '#fff' ,  height : '100vh'  }  : { }  } > 
162-                     < div  className = "nav__header" > 
163-                         {  shouldRenderLogo  ?        
164-                             < Link  to = "/"  className = "logo-container" > 
165-                                 < img  className = "logo"  src = { TheiaLogoDark }  alt = "theia logo"  /> 
166-                             </ Link > : < span  aria-hidden = { true } >  </ span > 
167-                         } 
168-                         < div  className = "nav__button-container" > 
169-                             < button 
170-                                 className = "nav__button" 
171-                                 aria-label = "Navigation Toggle" 
172-                                 onClick = { this . toggleNavigation } 
173-                             > 
174-                                 { this . state . isNavRendered  ? < img  src = { Multiply }  alt = "close menu icon"  />  : < img  src = { Hamburger }  alt = "hamburger menu icon"  /> } 
175-                             </ button > 
176-                         </ div > 
170+     useEffect ( ( )  =>  { 
171+         window . addEventListener ( 'scroll' ,  handleScroll ) 
172+         return  ( )  =>  { 
173+ 
174+         } 
175+     } ) 
176+ 
177+     return  ( 
178+         < StyledNav  ref = { navRef } > 
179+             < nav  className = "nav"  style = { isNavRendered  ? {  background : '#fff' ,  height : '100vh'  }  : { } } > 
180+                 < div  className = "nav__header" > 
181+                     { shouldRenderLogo  ?
182+                         < Link  to = "/"  className = "logo-container" > 
183+                             < img  className = "logo"  src = { TheiaLogoDark }  alt = "theia logo"  /> 
184+                         </ Link >  : < span  aria-hidden = { true } >  </ span > 
185+                     } 
186+                     < div  className = "nav__button-container" > 
187+                         < button 
188+                             className = "nav__button" 
189+                             aria-label = "Navigation Toggle" 
190+                             onClick = { toggleNavigation } 
191+                         > 
192+                             { isNavRendered  ? < img  src = { Multiply }  alt = "close menu icon"  />  : < img  src = { Hamburger }  alt = "hamburger menu icon"  /> } 
193+                         </ button > 
177194                    </ div > 
178-                      < ul   className = { `nav__items  ${ this . state . isNavRendered  ?  'navIsRendered'  :  'navIsNotRendered'   } ` } > 
179-                          < li   className = "nav__item" > 
180-                              < Link   to = "/#features"   className = "nav__link"  > Features </ Link > 
181-                         </  li > 
182-                          < li   className = "nav__item" > 
183-                              < Link   to = "/docs/"   className = "nav__link"    activeClassName = "active" > Documentation </ Link > 
184-                         </  li > 
185-                          < li   className = "nav__item" > 
186-                              < a   href = "https://community.theia-ide.org/"   target = "_blank"   rel = "noopener"   className = "nav__link"  > Community </ a > 
187-                         </  li > 
188-                          < li   className = "nav__item" > 
189-                              < a   href = "https://www.typefox.io/theia/"   className = "nav__link"    target = "_blank"   rel = "noopener" > Support </ a > 
190-                         </  li > 
191-                          < li   className = "nav__item" > 
192-                              < a   href = "https://www.typefox.io/trainings/"   className = "nav__link"    target = "_blank"   rel = "noopener" > Training </ a > 
193-                         </  li > 
194-                     </ ul > 
195-                 </ nav > 
196-             </ StyledNav > 
197-         ) 
198-     } 
195+                 </ div > 
196+                 < ul   className = { `nav__items  ${ isNavRendered  ?  'navIsRendered'  :  'navIsNotRendered' } ` } > 
197+                     < li   className = "nav__item"  > 
198+                         < Link   to = "/#features"   className = "nav__link" > Features </ Link > 
199+                     </ li > 
200+                     < li   className = "nav__item"  > 
201+                         < Link   to = "/docs/"   className = "nav__link"   activeClassName = "active" > Documentation </ Link > 
202+                     </ li > 
203+                     < li   className = "nav__item"  > 
204+                         < a   href = "https://community.theia-ide.org/"   target = "_blank"   rel = "noopener"   className = "nav__link" > Community </ a > 
205+                     </ li > 
206+                     < li   className = "nav__item"  > 
207+                         < a   href = "https://www.typefox.io/theia/"   className = "nav__link"   target = "_blank"   rel = "noopener" > Support </ a > 
208+                     </ li > 
209+                     < li   className = "nav__item"  > 
210+                         < a   href = "https://www.typefox.io/trainings/"   className = "nav__link"   target = "_blank"   rel = "noopener" > Training </ a > 
211+                     </ li > 
212+                 </ ul > 
213+             </ nav > 
214+         </ StyledNav > 
215+     ) 
199216} 
200217
201218export  default  Nav 
0 commit comments