1- import React , { useContext , useMemo } from 'react' ;
1+ import React , { useContext , useMemo , useState } from 'react' ;
22import styled from 'styled-components' ;
33import { useDispatch , useSelector } from 'react-redux' ;
44import { useTranslation } from 'react-i18next' ;
55import { useLocation } from 'react-router' ;
66import { Link } from 'react-router-dom' ;
7+ import { sortBy } from 'lodash' ;
78import { ParentMenuContext } from '../../../../components/Nav/contexts' ;
89import NavBar from '../../../../components/Nav/NavBar' ;
910import { useMenuProps } from '../../../../components/Nav/NavDropdownMenu' ;
@@ -22,6 +23,10 @@ import { logoutUser } from '../../../User/actions';
2223import { useSketchActions } from '../../hooks' ;
2324import { CmControllerContext } from '../../pages/IDEView' ;
2425import { 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' ;
2530
2631const Nav = styled ( NavBar ) `
2732 background: ${ prop ( 'MobilePanel.default.background' ) } ;
@@ -148,6 +153,41 @@ const Options = styled.div`
148153 }
149154` ;
150155
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+
151191const MobileNav = ( ) => {
152192 const project = useSelector ( ( state ) => state . project ) ;
153193 const user = useSelector ( ( state ) => state . user ) ;
@@ -248,6 +288,7 @@ const MoreMenu = () => {
248288 const rootFile = useSelector (
249289 ( state ) => state . files . filter ( ( file ) => file . name === 'root' ) [ 0 ]
250290 ) ;
291+
251292 const dispatch = useDispatch ( ) ;
252293 const { t } = useTranslation ( ) ;
253294 const { newSketch, saveSketch } = useSketchActions ( ) ;
@@ -256,8 +297,39 @@ const MoreMenu = () => {
256297
257298 const { isOpen, handlers } = useMenuProps ( 'more' ) ;
258299
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+
259308 return (
260309 < 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+ ) }
261333 < IconButton icon = { MoreIcon } { ...handlers } />
262334 < ul className = { isOpen ? 'opened' : '' } >
263335 < ParentMenuContext . Provider value = "more" >
@@ -293,7 +365,9 @@ const MoreMenu = () => {
293365 >
294366 Preferences
295367 </ NavMenuItem >
296- < NavMenuItem > Language</ NavMenuItem >
368+ < NavMenuItem onClick = { ( ) => setIsLanguageModalVisible ( true ) } >
369+ Language
370+ </ NavMenuItem >
297371 < b > { t ( 'Nav.Help.Title' ) } </ b >
298372 < NavMenuItem onClick = { ( ) => dispatch ( showKeyboardShortcutModal ( ) ) } >
299373 { t ( 'Nav.Help.KeyboardShortcuts' ) }
0 commit comments