11// Third party
2- import React , { useState } from 'react'
2+ import React , { useMemo , useState } from 'react'
33import { Navbar , NavLink , NavDropdown } from 'react-bootstrap'
44import { Link } from 'react-router-dom'
55
@@ -21,28 +21,30 @@ const Navigation = (): React.ReactElement => {
2121
2222 // State for handling dropdown visibility
2323 const [ showDropdown , setShowDropdown ] = useState ( false )
24-
24+ const isDesktop = useMemo ( ( ) => {
25+ if ( typeof window === 'undefined' ) return false
26+ return window . matchMedia ( '(hover: hover) and (pointer: fine)' ) . matches
27+ } , [ ] )
2528 // Timeout variable to prevent flickering
2629 let hideDropdownTimeout : NodeJS . Timeout
2730
2831 // Open dropdown when hovering over "Projects"
2932 const handleMouseEnter = ( ) : void => {
30- clearTimeout ( hideDropdownTimeout ) // Cancel hide if mouse enters again
31- setShowDropdown ( true )
33+ if ( isDesktop ) {
34+ clearTimeout ( hideDropdownTimeout ) // Cancel hide if mouse enters again
35+ setShowDropdown ( true )
36+ }
3237 }
3338
3439 // Close dropdown when mouse leaves (with small delay)
3540 const handleMouseLeave = ( ) : void => {
36- hideDropdownTimeout = setTimeout ( ( ) => {
37- setShowDropdown ( false )
38- } , 400 ) // Small delay before closing
41+ if ( isDesktop ) {
42+ hideDropdownTimeout = setTimeout ( ( ) => {
43+ setShowDropdown ( false )
44+ } , 400 ) // Small delay before closing
45+ }
3946 }
4047
41- // Close dropdown when clicking a project
42- const handleItemClick = ( ) : void => {
43- setShowDropdown ( false ) // Close dropdown when a project is clicked
44- scrollToTop ( )
45- }
4648
4749 return (
4850 < >
@@ -78,15 +80,20 @@ const Navigation = (): React.ReactElement => {
7880 title = 'Projects'
7981 id = 'projects-dropdown'
8082 show = { showDropdown }
81- className = 'nav-link' >
83+ className = 'nav-link'
84+ onToggle = { ( nextShow /* boolean */ ) => {
85+ if ( ! isDesktop ) setShowDropdown ( nextShow )
86+ } }
87+ // Close on any item selection
88+ onSelect = { ( ) => setShowDropdown ( false ) } >
8289 < div onMouseEnter = { handleMouseEnter } onMouseLeave = { handleMouseLeave } >
83- < NavDropdown . Item as = { Link } to = { Constants . PATHS . ROBOTICS } onClick = { handleItemClick } >
90+ < NavDropdown . Item eventKey = '4' as = { Link } to = { Constants . PATHS . ROBOTICS } onClick = { scrollToTop } >
8491 Robotics
8592 </ NavDropdown . Item >
86- < NavDropdown . Item as = { Link } to = { Constants . PATHS . ROCKSAT } onClick = { handleItemClick } >
93+ < NavDropdown . Item eventKey = '5' as = { Link } to = { Constants . PATHS . ROCKSAT } onClick = { scrollToTop } >
8794 RockSat
8895 </ NavDropdown . Item >
89- < NavDropdown . Item as = { Link } to = { Constants . PATHS . BALLOONING } onClick = { handleItemClick } >
96+ < NavDropdown . Item eventKey = '6' as = { Link } to = { Constants . PATHS . BALLOONING } onClick = { scrollToTop } >
9097 NASA Ballooning
9198 </ NavDropdown . Item >
9299 </ div >
0 commit comments