@@ -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