1
- import React , { useContext , useMemo } from 'react' ;
1
+ import React , { useContext , useMemo , useState } from 'react' ;
2
2
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
6
import { Link } from 'react-router-dom' ;
7
+ import { sortBy } from 'lodash' ;
7
8
import { ParentMenuContext } from '../../../../components/Nav/contexts' ;
8
9
import NavBar from '../../../../components/Nav/NavBar' ;
9
10
import { useMenuProps } from '../../../../components/Nav/NavDropdownMenu' ;
@@ -22,6 +23,10 @@ import { logoutUser } from '../../../User/actions';
22
23
import { useSketchActions } from '../../hooks' ;
23
24
import { CmControllerContext } from '../../pages/IDEView' ;
24
25
import { selectSketchPath } from '../../selectors/project' ;
26
+ import { availableLanguages , languageKeyToLabel } from '../../../../i18n' ;
27
+ import { showToast } from '../../actions/toast' ;
28
+ import { setLanguage } from '../../actions/preferences' ;
29
+ import Overlay from '../../../App/components/Overlay' ;
25
30
26
31
const Nav = styled ( NavBar ) `
27
32
background: ${ prop ( 'MobilePanel.default.background' ) } ;
@@ -148,6 +153,41 @@ const Options = styled.div`
148
153
}
149
154
` ;
150
155
156
+ const LanguageSelect = styled . div `
157
+ display: flex;
158
+ flex-direction: column;
159
+ position: relative;
160
+ height: 100%;
161
+ justify-content: center;
162
+
163
+ h3 {
164
+ text-align: center;
165
+ margin-bottom: 2rem;
166
+ }
167
+
168
+ div {
169
+ display: flex;
170
+ gap: ${ remSize ( 8 ) } ;
171
+ flex-direction: column;
172
+ position: block;
173
+ align-items: center;
174
+
175
+ button {
176
+ font-size: ${ remSize ( 16 ) } ;
177
+ padding: ${ remSize ( 8 ) } ${ remSize ( 15 ) } ${ remSize ( 8 ) } ${ remSize ( 10 ) } ;
178
+ width: 100%;
179
+ max-width: 80vw;
180
+
181
+ &:hover,
182
+ &:active,
183
+ &:focus {
184
+ background-color: ${ prop ( 'Button.primary.hover.background' ) } ;
185
+ color: ${ prop ( 'Button.primary.hover.foreground' ) } ;
186
+ }
187
+ }
188
+ }
189
+ ` ;
190
+
151
191
const MobileNav = ( ) => {
152
192
const project = useSelector ( ( state ) => state . project ) ;
153
193
const user = useSelector ( ( state ) => state . user ) ;
@@ -248,6 +288,7 @@ const MoreMenu = () => {
248
288
const rootFile = useSelector (
249
289
( state ) => state . files . filter ( ( file ) => file . name === 'root' ) [ 0 ]
250
290
) ;
291
+
251
292
const dispatch = useDispatch ( ) ;
252
293
const { t } = useTranslation ( ) ;
253
294
const { newSketch, saveSketch } = useSketchActions ( ) ;
@@ -256,8 +297,39 @@ const MoreMenu = () => {
256
297
257
298
const { isOpen, handlers } = useMenuProps ( 'more' ) ;
258
299
300
+ const [ isLanguageModalVisible , setIsLanguageModalVisible ] = useState ( false ) ;
301
+
302
+ function handleLangSelection ( event ) {
303
+ dispatch ( setLanguage ( event . target . value ) ) ;
304
+ dispatch ( showToast ( 'Toast.LangChange' ) ) ;
305
+ setIsLanguageModalVisible ( false ) ;
306
+ }
307
+
259
308
return (
260
309
< div >
310
+ { isLanguageModalVisible && (
311
+ < Overlay
312
+ // TODO: add translations
313
+ title = "Select Language"
314
+ ariaLabel = "Select Language"
315
+ closeOverlay = { ( ) => setIsLanguageModalVisible ( false ) }
316
+ >
317
+ < LanguageSelect >
318
+ < div >
319
+ { sortBy ( availableLanguages ) . map ( ( key ) => (
320
+ < button
321
+ aria-label = { languageKeyToLabel ( key ) }
322
+ key = { key }
323
+ onClick = { handleLangSelection }
324
+ value = { key }
325
+ >
326
+ { languageKeyToLabel ( key ) }
327
+ </ button >
328
+ ) ) }
329
+ </ div >
330
+ </ LanguageSelect >
331
+ </ Overlay >
332
+ ) }
261
333
< IconButton icon = { MoreIcon } { ...handlers } />
262
334
< ul className = { isOpen ? 'opened' : '' } >
263
335
< ParentMenuContext . Provider value = "more" >
@@ -293,7 +365,9 @@ const MoreMenu = () => {
293
365
>
294
366
Preferences
295
367
</ NavMenuItem >
296
- < NavMenuItem > Language</ NavMenuItem >
368
+ < NavMenuItem onClick = { ( ) => setIsLanguageModalVisible ( true ) } >
369
+ Language
370
+ </ NavMenuItem >
297
371
< b > { t ( 'Nav.Help.Title' ) } </ b >
298
372
< NavMenuItem onClick = { ( ) => dispatch ( showKeyboardShortcutModal ( ) ) } >
299
373
{ t ( 'Nav.Help.KeyboardShortcuts' ) }
0 commit comments