@@ -3,8 +3,11 @@ import styled from 'styled-components';
3
3
import { useDispatch , useSelector } from 'react-redux' ;
4
4
import { useTranslation } from 'react-i18next' ;
5
5
import { useLocation } from 'react-router' ;
6
- import PropTypes from 'prop-types' ;
7
6
import { 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' ;
8
11
import { prop , remSize } from '../../../../theme' ;
9
12
import AsteriskIcon from '../../../../images/p5-asterisk.svg' ;
10
13
import IconButton from '../../../../components/mobile/IconButton' ;
@@ -20,7 +23,7 @@ import { useSketchActions } from '../../hooks';
20
23
import { CmControllerContext } from '../../pages/IDEView' ;
21
24
import { selectSketchPath } from '../../selectors/project' ;
22
25
23
- const Nav = styled . div `
26
+ const Nav = styled ( NavBar ) `
24
27
background: ${ prop ( 'MobilePanel.default.background' ) } ;
25
28
color: ${ prop ( 'primaryTextColor' ) } ;
26
29
padding: ${ remSize ( 8 ) } 0;
@@ -74,8 +77,7 @@ const Options = styled.div`
74
77
}
75
78
76
79
/* Drop Down menu */
77
- > div > button:focus + ul,
78
- > div > ul > button:focus ~ div > ul {
80
+ ul.opened {
79
81
transform: scale(1);
80
82
opacity: 1;
81
83
}
@@ -130,9 +132,7 @@ const Options = styled.div`
130
132
> li {
131
133
display: flex;
132
134
width: 100%;
133
- a {
134
- width: 100%;
135
- }
135
+ a,
136
136
button {
137
137
width: 100%;
138
138
padding: ${ remSize ( 8 ) } ${ remSize ( 15 ) } ${ remSize ( 8 ) } ${ remSize ( 10 ) } ;
@@ -148,7 +148,7 @@ const Options = styled.div`
148
148
}
149
149
` ;
150
150
151
- const MobileNav = ( props ) => {
151
+ const MobileNav = ( ) => {
152
152
const project = useSelector ( ( state ) => state . project ) ;
153
153
const user = useSelector ( ( state ) => state . user ) ;
154
154
@@ -222,24 +222,22 @@ const AccountMenu = () => {
222
222
const user = useSelector ( ( state ) => state . user ) ;
223
223
const dispatch = useDispatch ( ) ;
224
224
225
+ const { isOpen, handlers } = useMenuProps ( 'account' ) ;
226
+
225
227
return (
226
228
< 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 >
243
241
</ ul >
244
242
</ div >
245
243
) ;
@@ -256,80 +254,55 @@ const MoreMenu = () => {
256
254
257
255
const cmRef = useContext ( CmControllerContext ) ;
258
256
257
+ const { isOpen, handlers } = useMenuProps ( 'more' ) ;
258
+
259
259
return (
260
260
< 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 ) } >
269
268
{ 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 } >
280
275
{ t ( 'Nav.Edit.TidyCode' ) }
281
- </ button >
282
- </ li >
283
- < li >
284
- < button onClick = { cmRef . current ?. showFind } >
276
+ </ NavMenuItem >
277
+ < NavMenuItem onClick = { cmRef . current ?. showFind } >
285
278
{ 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 ) ) } >
291
282
{ 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 ) ) } >
296
285
{ 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
303
290
onClick = { ( ) => {
304
291
dispatch ( openPreferences ( ) ) ;
305
292
} }
306
293
>
307
294
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 ( ) ) } >
316
299
{ 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/" >
325
302
{ 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 >
333
306
</ ul >
334
307
</ div >
335
308
) ;
0 commit comments