@@ -3,8 +3,11 @@ import styled from 'styled-components';
33import { useDispatch , useSelector } from 'react-redux' ;
44import { useTranslation } from 'react-i18next' ;
55import { useLocation } from 'react-router' ;
6- import PropTypes from 'prop-types' ;
76import { Link } from 'react-router-dom' ;
7+ import { ParentMenuContext } from '../../../../components/Nav/contexts' ;
8+ import NavBar from '../../../../components/Nav/NavBar' ;
9+ import { useMenuProps } from '../../../../components/Nav/NavDropdownMenu' ;
10+ import NavMenuItem from '../../../../components/Nav/NavMenuItem' ;
811import { prop , remSize } from '../../../../theme' ;
912import AsteriskIcon from '../../../../images/p5-asterisk.svg' ;
1013import IconButton from '../../../../components/mobile/IconButton' ;
@@ -20,7 +23,7 @@ import { useSketchActions } from '../../hooks';
2023import { CmControllerContext } from '../../pages/IDEView' ;
2124import { selectSketchPath } from '../../selectors/project' ;
2225
23- const Nav = styled . div `
26+ const Nav = styled ( NavBar ) `
2427 background: ${ prop ( 'MobilePanel.default.background' ) } ;
2528 color: ${ prop ( 'primaryTextColor' ) } ;
2629 padding: ${ remSize ( 8 ) } 0;
@@ -74,8 +77,7 @@ const Options = styled.div`
7477 }
7578
7679 /* Drop Down menu */
77- > div > button:focus + ul,
78- > div > ul > button:focus ~ div > ul {
80+ ul.opened {
7981 transform: scale(1);
8082 opacity: 1;
8183 }
@@ -130,9 +132,7 @@ const Options = styled.div`
130132 > li {
131133 display: flex;
132134 width: 100%;
133- a {
134- width: 100%;
135- }
135+ a,
136136 button {
137137 width: 100%;
138138 padding: ${ remSize ( 8 ) } ${ remSize ( 15 ) } ${ remSize ( 8 ) } ${ remSize ( 10 ) } ;
@@ -148,7 +148,7 @@ const Options = styled.div`
148148 }
149149` ;
150150
151- const MobileNav = ( props ) => {
151+ const MobileNav = ( ) => {
152152 const project = useSelector ( ( state ) => state . project ) ;
153153 const user = useSelector ( ( state ) => state . user ) ;
154154
@@ -222,24 +222,22 @@ const AccountMenu = () => {
222222 const user = useSelector ( ( state ) => state . user ) ;
223223 const dispatch = useDispatch ( ) ;
224224
225+ const { isOpen, handlers } = useMenuProps ( 'account' ) ;
226+
225227 return (
226228 < div >
227- < IconButton icon = { AccountIcon } />
228- < ul >
229- < li className = "user" > { user . username } </ li >
230- < li >
231- < Link to = { `/${ user . username } /sketches` } >
232- < button > My Stuff</ button >
233- </ Link >
234- </ li >
235- < li >
236- < Link to = "/account" >
237- < button > Settings</ button >
238- </ Link >
239- </ li >
240- < li >
241- < button onClick = { ( ) => dispatch ( logoutUser ( ) ) } > Log Out</ button >
242- </ li >
229+ < IconButton icon = { AccountIcon } { ...handlers } />
230+ < ul className = { isOpen ? 'opened' : '' } >
231+ < ParentMenuContext . Provider value = "account" >
232+ < li className = "user" > { user . username } </ li >
233+ < NavMenuItem href = { `/${ user . username } /sketches` } >
234+ My Stuff
235+ </ NavMenuItem >
236+ < NavMenuItem href = "/account" > Settings</ NavMenuItem >
237+ < NavMenuItem onClick = { ( ) => dispatch ( logoutUser ( ) ) } >
238+ Log Out
239+ </ NavMenuItem >
240+ </ ParentMenuContext . Provider >
243241 </ ul >
244242 </ div >
245243 ) ;
@@ -256,80 +254,55 @@ const MoreMenu = () => {
256254
257255 const cmRef = useContext ( CmControllerContext ) ;
258256
257+ const { isOpen, handlers } = useMenuProps ( 'more' ) ;
258+
259259 return (
260260 < div >
261- < IconButton icon = { MoreIcon } />
262- < ul >
263- < b > { t ( 'Nav.File.Title' ) } </ b >
264- < li >
265- < button onClick = { newSketch } > { t ( 'Nav.File.New' ) } </ button >
266- </ li >
267- < li >
268- < button onClick = { ( ) => saveSketch ( cmRef . current ) } >
261+ < IconButton icon = { MoreIcon } { ...handlers } />
262+ < ul className = { isOpen ? 'opened' : '' } >
263+ < ParentMenuContext . Provider value = "more" >
264+ < b > { t ( 'Nav.File.Title' ) } </ b >
265+ < NavMenuItem onClick = { newSketch } > { t ( 'Nav.File.New' ) } </ NavMenuItem >
266+
267+ < NavMenuItem onClick = { ( ) => saveSketch ( cmRef . current ) } >
269268 { t ( 'Common.Save' ) }
270- </ button >
271- </ li >
272- < li >
273- < Link to = "/p5/sketches" >
274- < button > { t ( 'Nav.File.Examples' ) } </ button >
275- </ Link >
276- </ li >
277- < b > { t ( 'Nav.Edit.Title' ) } </ b >
278- < li >
279- < button onClick = { cmRef . current ?. tidyCode } >
269+ </ NavMenuItem >
270+ < NavMenuItem href = "/p5/sketches" >
271+ { t ( 'Nav.File.Examples' ) }
272+ </ NavMenuItem >
273+ < b > { t ( 'Nav.Edit.Title' ) } </ b >
274+ < NavMenuItem onClick = { cmRef . current ?. tidyCode } >
280275 { t ( 'Nav.Edit.TidyCode' ) }
281- </ button >
282- </ li >
283- < li >
284- < button onClick = { cmRef . current ?. showFind } >
276+ </ NavMenuItem >
277+ < NavMenuItem onClick = { cmRef . current ?. showFind } >
285278 { t ( 'Nav.Edit.Find' ) }
286- </ button >
287- </ li >
288- < b > { t ( 'Nav.Sketch.Title' ) } </ b >
289- < li >
290- < button onClick = { ( ) => dispatch ( newFile ( rootFile . id ) ) } >
279+ </ NavMenuItem >
280+ < b > { t ( 'Nav.Sketch.Title' ) } </ b >
281+ < NavMenuItem onClick = { ( ) => dispatch ( newFile ( rootFile . id ) ) } >
291282 { t ( 'Nav.Sketch.AddFile' ) }
292- </ button >
293- </ li >
294- < li >
295- < button onClick = { ( ) => dispatch ( newFolder ( rootFile . id ) ) } >
283+ </ NavMenuItem >
284+ < NavMenuItem onClick = { ( ) => dispatch ( newFolder ( rootFile . id ) ) } >
296285 { t ( 'Nav.Sketch.AddFolder' ) }
297- </ button >
298- </ li >
299- { /* TODO: Add Translations */ }
300- < b > Settings</ b >
301- < li >
302- < button
286+ </ NavMenuItem >
287+ { /* TODO: Add Translations */ }
288+ < b > Settings</ b >
289+ < NavMenuItem
303290 onClick = { ( ) => {
304291 dispatch ( openPreferences ( ) ) ;
305292 } }
306293 >
307294 Preferences
308- </ button >
309- </ li >
310- < li >
311- < button > Language</ button >
312- </ li >
313- < b > { t ( 'Nav.Help.Title' ) } </ b >
314- < li >
315- < button onClick = { ( ) => dispatch ( showKeyboardShortcutModal ( ) ) } >
295+ </ NavMenuItem >
296+ < NavMenuItem > Language</ NavMenuItem >
297+ < b > { t ( 'Nav.Help.Title' ) } </ b >
298+ < NavMenuItem onClick = { ( ) => dispatch ( showKeyboardShortcutModal ( ) ) } >
316299 { t ( 'Nav.Help.KeyboardShortcuts' ) }
317- </ button >
318- </ li >
319- < li >
320- < button
321- onClick = { ( ) => {
322- window . location = 'https://p5js.org/reference/' ;
323- } }
324- >
300+ </ NavMenuItem >
301+ < NavMenuItem href = "https://p5js.org/reference/" >
325302 { t ( 'Nav.Help.Reference' ) }
326- </ button >
327- </ li >
328- < li >
329- < Link to = "/about" >
330- < button > { t ( 'Nav.Help.About' ) } </ button >
331- </ Link >
332- </ li >
303+ </ NavMenuItem >
304+ < NavMenuItem href = "/about" > { t ( 'Nav.Help.About' ) } </ NavMenuItem >
305+ </ ParentMenuContext . Provider >
333306 </ ul >
334307 </ div >
335308 ) ;
0 commit comments