Commit 95d91c85 authored by Justin Domingue's avatar Justin Domingue Committed by GitHub

fix: add language selector in top-level menu (#2057)

* initial language selector

* set > icon opacity for consistency

* always reset menu to main on close

* always reset menu on menu open
parent 03902fe5
import React, { useRef } from 'react' import React, { useEffect, useRef, useState } from 'react'
import { BookOpen, Code, Info, MessageCircle, PieChart, Moon, Sun } from 'react-feather' import {
BookOpen,
Code,
Info,
MessageCircle,
PieChart,
Moon,
Sun,
ChevronRight,
ChevronLeft,
Check,
} from 'react-feather'
import { Link } from 'react-router-dom' import { Link } from 'react-router-dom'
import styled, { css } from 'styled-components/macro' import styled, { css } from 'styled-components/macro'
import { ReactComponent as MenuIcon } from '../../assets/images/menu.svg' import { ReactComponent as MenuIcon } from '../../assets/images/menu.svg'
...@@ -10,9 +21,10 @@ import { useModalOpen, useToggleModal } from '../../state/application/hooks' ...@@ -10,9 +21,10 @@ import { useModalOpen, useToggleModal } from '../../state/application/hooks'
import { Trans } from '@lingui/macro' import { Trans } from '@lingui/macro'
import { ExternalLink } from '../../theme' import { ExternalLink } from '../../theme'
import { ButtonPrimary } from '../Button' import { ButtonPrimary } from '../Button'
import { useDarkModeManager } from 'state/user/hooks' import { useDarkModeManager, useUserLocaleManager } from 'state/user/hooks'
import { L2_CHAIN_IDS, CHAIN_INFO, SupportedChainId } from 'constants/chains' import { L2_CHAIN_IDS, CHAIN_INFO, SupportedChainId } from 'constants/chains'
import { LOCALE_LABEL, SUPPORTED_LOCALES } from 'constants/locales'
export enum FlyoutAlignment { export enum FlyoutAlignment {
LEFT = 'LEFT', LEFT = 'LEFT',
...@@ -69,6 +81,8 @@ const StyledMenu = styled.div` ...@@ -69,6 +81,8 @@ const StyledMenu = styled.div`
const MenuFlyout = styled.span<{ flyoutAlignment?: FlyoutAlignment }>` const MenuFlyout = styled.span<{ flyoutAlignment?: FlyoutAlignment }>`
min-width: 196px; min-width: 196px;
max-height: 350px;
overflow: auto;
background-color: ${({ theme }) => theme.bg1}; background-color: ${({ theme }) => theme.bg1};
box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04), box-shadow: 0px 0px 1px rgba(0, 0, 0, 0.01), 0px 4px 8px rgba(0, 0, 0, 0.04), 0px 16px 24px rgba(0, 0, 0, 0.04),
0px 24px 32px rgba(0, 0, 0, 0.01); 0px 24px 32px rgba(0, 0, 0, 0.01);
...@@ -161,6 +175,13 @@ export default function Menu() { ...@@ -161,6 +175,13 @@ export default function Menu() {
const { infoLink } = CHAIN_INFO[chainId ? chainId : SupportedChainId.MAINNET] const { infoLink } = CHAIN_INFO[chainId ? chainId : SupportedChainId.MAINNET]
const [darkMode, toggleDarkMode] = useDarkModeManager() const [darkMode, toggleDarkMode] = useDarkModeManager()
const [currentLocale, setLocale] = useUserLocaleManager()
const [menu, setMenu] = useState<'main' | 'lang'>('main')
useEffect(() => {
setMenu('main')
}, [open])
return ( return (
// https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451 // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/30451
...@@ -169,7 +190,26 @@ export default function Menu() { ...@@ -169,7 +190,26 @@ export default function Menu() {
<StyledMenuIcon /> <StyledMenuIcon />
</StyledMenuButton> </StyledMenuButton>
{open && ( {open &&
(() => {
switch (menu) {
case 'lang':
return (
<MenuFlyout>
<ToggleMenuItem onClick={() => setMenu('main')}>
<ChevronLeft size={16} />
</ToggleMenuItem>
{SUPPORTED_LOCALES.map((locale) => (
<ToggleMenuItem onClick={() => setLocale(locale)} key={locale}>
<div>{LOCALE_LABEL[locale]}</div>
{currentLocale === locale && <Check opacity={0.6} size={16} />}
</ToggleMenuItem>
))}
</MenuFlyout>
)
case 'main':
default:
return (
<MenuFlyout> <MenuFlyout>
<MenuItem href="https://uniswap.org/"> <MenuItem href="https://uniswap.org/">
<div> <div>
...@@ -201,17 +241,31 @@ export default function Menu() { ...@@ -201,17 +241,31 @@ export default function Menu() {
</div> </div>
<PieChart opacity={0.6} size={16} /> <PieChart opacity={0.6} size={16} />
</MenuItem> </MenuItem>
<ToggleMenuItem onClick={() => setMenu('lang')}>
<div>
<Trans>Language</Trans>
</div>
<ChevronRight size={16} opacity={0.6} />
</ToggleMenuItem>
<ToggleMenuItem onClick={() => toggleDarkMode()}> <ToggleMenuItem onClick={() => toggleDarkMode()}>
<div>{darkMode ? <Trans>Light Theme</Trans> : <Trans>Dark Theme</Trans>}</div> <div>{darkMode ? <Trans>Light Theme</Trans> : <Trans>Dark Theme</Trans>}</div>
{darkMode ? <Moon opacity={0.6} size={16} /> : <Sun opacity={0.6} size={16} />} {darkMode ? <Moon opacity={0.6} size={16} /> : <Sun opacity={0.6} size={16} />}
</ToggleMenuItem> </ToggleMenuItem>
{showUNIClaimOption && ( {showUNIClaimOption && (
<UNIbutton onClick={openClaimModal} padding="8px 16px" width="100%" $borderRadius="12px" mt="0.5rem"> <UNIbutton
onClick={openClaimModal}
padding="8px 16px"
width="100%"
$borderRadius="12px"
mt="0.5rem"
>
<Trans>Claim UNI</Trans> <Trans>Claim UNI</Trans>
</UNIbutton> </UNIbutton>
)} )}
</MenuFlyout> </MenuFlyout>
)} )
}
})()}
</StyledMenu> </StyledMenu>
) )
} }
......
export const SUPPORTED_LOCALES = [ export const SUPPORTED_LOCALES = [
// order as they appear in the language dropdown
'en-US',
'af-ZA', 'af-ZA',
'ar-SA', 'ar-SA',
'ca-ES', 'ca-ES',
...@@ -6,7 +8,6 @@ export const SUPPORTED_LOCALES = [ ...@@ -6,7 +8,6 @@ export const SUPPORTED_LOCALES = [
'da-DK', 'da-DK',
'de-DE', 'de-DE',
'el-GR', 'el-GR',
'en-US',
'es-ES', 'es-ES',
'fi-FI', 'fi-FI',
'fr-FR', 'fr-FR',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment