|
1 | 1 | import { useEffect, useState } from 'react'; |
2 | | -import '../../styles/NavBar.css'; // Nous allons ajouter des styles pour la transition |
| 2 | +import '../../styles/NavBar.css'; |
3 | 3 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; |
4 | | -import { faArrowsUpToLine, faBook, faBug, faCode, faComment, faCopyright, faPager, faUsers } from '@fortawesome/free-solid-svg-icons'; |
| 4 | +import { faBook, faBug, faCode, faComment, faCopyright, faUsers, faBars, faXmark } from '@fortawesome/free-solid-svg-icons'; |
5 | 5 | import { useTranslation } from 'react-i18next'; |
6 | 6 | import LanguageSelector from '../common/LanguageSelector'; |
7 | 7 |
|
8 | 8 | const NavBar = () => { |
9 | 9 | const [helpMenuOpen, setHelpMenuOpen] = useState(false); |
| 10 | + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); |
10 | 11 | const { t } = useTranslation(); |
11 | 12 |
|
12 | | - const toggleHelpMenu = () => { |
13 | | - setHelpMenuOpen(!helpMenuOpen); |
14 | | - }; |
15 | | - |
16 | 13 | useEffect(() => { |
17 | | - const closeHelpMenu = (event) => { |
18 | | - if (helpMenuOpen && !event.target.closest('.help-menu')) { |
| 14 | + const closeMenus = (event) => { |
| 15 | + if (!event.target.closest('.help-menu') && !event.target.closest('.help-icon')) { |
19 | 16 | setHelpMenuOpen(false); |
20 | 17 | } |
21 | | - }; |
22 | 18 |
|
23 | | - window.addEventListener('mousedown', closeHelpMenu); |
24 | | - |
25 | | - return () => { |
26 | | - window.removeEventListener('mousedown', closeHelpMenu); |
| 19 | + if (!event.target.closest('.mobile-menu') && !event.target.closest('.mobile-toggle')) { |
| 20 | + setMobileMenuOpen(false); |
| 21 | + } |
27 | 22 | }; |
28 | | - }, [helpMenuOpen]); |
| 23 | + |
| 24 | + window.addEventListener('mousedown', closeMenus); |
| 25 | + return () => window.removeEventListener('mousedown', closeMenus); |
| 26 | + }, []); |
29 | 27 |
|
30 | 28 | return ( |
31 | | - <nav className='fixed top-0 left-0 right-0 shadow-md z-50'> |
32 | | - <div className='flex items-center justify-between bg-blue-800 h-16 px-6 py-2'> |
33 | | - <a href='/'> |
34 | | - <div className='text-white text-xl font-bold'> |
35 | | - Emi <span className=' font-light max-md:hidden'>{t('nav.subtitle')}</span> |
36 | | - </div> |
| 29 | + <nav className='fixed top-0 left-0 right-0 shadow-md z-50 bg-blue-800'> |
| 30 | + <div className='flex items-center justify-between h-16 px-4 md:px-6'> |
| 31 | + {/* Logo */} |
| 32 | + <a href='/' className='text-white text-xl font-bold'> |
| 33 | + Emi <span className='font-light hidden md:inline'>{t('nav.subtitle')}</span> |
37 | 34 | </a> |
38 | 35 |
|
39 | | - <div className='flex items-center justify-between gap-4'> |
40 | | - <ul className='flex items-center justify-center gap-4 text-white'> |
41 | | - <li> |
42 | | - <a href='/page-views' className=' text-white underline'> |
43 | | - <span className='max-md:hidden'>{t('nav.pageViews')}</span> |
44 | | - <span className='hidden max-md:block'> |
45 | | - <FontAwesomeIcon icon={faPager} style={{ color: '#ffffff' }} /> |
46 | | - </span> |
47 | | - </a> |
48 | | - </li> |
49 | | - <li> |
50 | | - <a href='/top-africa' className=' text-white underline'> |
51 | | - <span className='max-md:hidden'>{t('nav.topAfrica')}</span> |
52 | | - <span className='hidden max-md:block'> |
53 | | - <FontAwesomeIcon icon={faArrowsUpToLine} style={{ color: '#ffffff' }} /> |
54 | | - </span> |
55 | | - </a> |
56 | | - </li> |
57 | | - </ul> |
| 36 | + {/* Desktop Menu */} |
| 37 | + <div className='hidden md:flex items-center gap-4'> |
| 38 | + <a href='/page-views' className='text-white underline'> |
| 39 | + {t('nav.pageViews')} |
| 40 | + </a> |
| 41 | + <a href='/top-africa' className='text-white underline'> |
| 42 | + {t('nav.topAfrica')} |
| 43 | + </a> |
58 | 44 | <LanguageSelector /> |
59 | | - <div> |
60 | | - <button onClick={toggleHelpMenu} className='help-icon'> |
61 | | - {t('common.help')} ▼ |
62 | | - </button> |
63 | | - {helpMenuOpen && ( |
64 | | - <div className='help-menu absolute shadow-2xl right-1 rounded-xl bg-white'> |
65 | | - <a href='https://meta.wikimedia.org/wiki/Emi_Solution' className='footer-link' target='_blank'> |
66 | | - <FontAwesomeIcon icon={faBook} /> {t('common.documentation')} |
67 | | - </a> |
68 | | - <a href='https://github.com/kaliacad/mostvisitedarticle' className='footer-link' target='_blank'> |
69 | | - <FontAwesomeIcon icon={faCode} /> {t('common.viewSource')} |
70 | | - </a> |
71 | | - <a href='https://github.com/kaliacad/mostvisitedarticle/issues' className='footer-link' target='_blank'> |
72 | | - <FontAwesomeIcon icon={faBug} /> {t('common.reportIssue')} |
73 | | - </a> |
74 | | - <a |
75 | | - href='https://meta.wikimedia.org/w/index.php?title=Talk:Emi_Solution&action=edit&redlink=1' |
76 | | - className='footer-link' |
77 | | - target='_blank' |
78 | | - > |
79 | | - <FontAwesomeIcon icon={faComment} /> {t('common.feedback')} |
80 | | - </a> |
81 | | - <a href='https://github.com/kaliacad.org/' className='footer-link' target='_blank'> |
82 | | - <FontAwesomeIcon icon={faUsers} /> {t('common.developedBy')} |
83 | | - </a> |
84 | | - <a href='https://kaliacademy.org/' className='footer-link' target='_blank'> |
85 | | - <FontAwesomeIcon icon={faCopyright} /> {t('common.kaliAcademy')} |
86 | | - </a> |
87 | | - </div> |
88 | | - )} |
89 | | - </div> |
| 45 | + <button onClick={() => setHelpMenuOpen(!helpMenuOpen)} className='help-icon text-white'> |
| 46 | + {t('common.help')} ▼ |
| 47 | + </button> |
90 | 48 | </div> |
| 49 | + |
| 50 | + {/* Mobile Toggle */} |
| 51 | + <button className='md:hidden text-white text-xl mobile-toggle' onClick={() => setMobileMenuOpen(!mobileMenuOpen)}> |
| 52 | + <FontAwesomeIcon icon={mobileMenuOpen ? faXmark : faBars} /> |
| 53 | + </button> |
91 | 54 | </div> |
| 55 | + |
| 56 | + {/* Mobile Menu */} |
| 57 | + {mobileMenuOpen && ( |
| 58 | + <div className='mobile-menu md:hidden bg-blue-700 px-4 py-3 space-y-3 text-white'> |
| 59 | + <a href='/page-views' className='block underline'> |
| 60 | + {t('nav.pageViews')} |
| 61 | + </a> |
| 62 | + <a href='/top-africa' className='block underline'> |
| 63 | + {t('nav.topAfrica')} |
| 64 | + </a> |
| 65 | + |
| 66 | + <LanguageSelector /> |
| 67 | + |
| 68 | + <button onClick={() => setHelpMenuOpen(!helpMenuOpen)} className='block w-full text-left'> |
| 69 | + {t('common.help')} ▼ |
| 70 | + </button> |
| 71 | + </div> |
| 72 | + )} |
| 73 | + |
| 74 | + {/* Help Menu */} |
| 75 | + {helpMenuOpen && ( |
| 76 | + <div className='help-menu absolute right-2 mt-2 rounded-xl bg-white shadow-2xl w-56'> |
| 77 | + <a href='https://meta.wikimedia.org/wiki/Emi_Solution' className='footer-link' target='_blank'> |
| 78 | + <FontAwesomeIcon icon={faBook} /> {t('common.documentation')} |
| 79 | + </a> |
| 80 | + <a href='https://github.com/kaliacad/mostvisitedarticle' className='footer-link' target='_blank'> |
| 81 | + <FontAwesomeIcon icon={faCode} /> {t('common.viewSource')} |
| 82 | + </a> |
| 83 | + <a href='https://github.com/kaliacad/mostvisitedarticle/issues' className='footer-link' target='_blank'> |
| 84 | + <FontAwesomeIcon icon={faBug} /> {t('common.reportIssue')} |
| 85 | + </a> |
| 86 | + <a |
| 87 | + href='https://meta.wikimedia.org/w/index.php?title=Talk:Emi_Solution&action=edit&redlink=1' |
| 88 | + className='footer-link' |
| 89 | + target='_blank' |
| 90 | + > |
| 91 | + <FontAwesomeIcon icon={faComment} /> {t('common.feedback')} |
| 92 | + </a> |
| 93 | + <a href='https://github.com/kaliacad.org/' className='footer-link' target='_blank'> |
| 94 | + <FontAwesomeIcon icon={faUsers} /> {t('common.developedBy')} |
| 95 | + </a> |
| 96 | + <a href='https://kaliacademy.org/' className='footer-link' target='_blank'> |
| 97 | + <FontAwesomeIcon icon={faCopyright} /> {t('common.kaliAcademy')} |
| 98 | + </a> |
| 99 | + </div> |
| 100 | + )} |
92 | 101 | </nav> |
93 | 102 | ); |
94 | 103 | }; |
|
0 commit comments