/ src / layouts / SettingsMenu.tsx
SettingsMenu.tsx
  1  import { CogIcon } from '@heroicons/react/solid';
  2  import { Trans } from '@lingui/macro';
  3  import { Button, ListItemText, Menu, MenuItem, SvgIcon, Typography } from '@mui/material';
  4  import React, { useState } from 'react';
  5  import { useModalContext } from 'src/hooks/useModal';
  6  import { DEFAULT_LOCALE } from 'src/libs/LanguageProvider';
  7  import { useRootStore } from 'src/store/root';
  8  import { PROD_ENV } from 'src/utils/marketsAndNetworksConfig';
  9  import { SETTINGS } from 'src/utils/mixPanelEvents';
 10  
 11  import { DarkModeSwitcher } from './components/DarkModeSwitcher';
 12  import { LanguageListItem, LanguagesList } from './components/LanguageSwitcher';
 13  import { TestNetModeSwitcher } from './components/TestNetModeSwitcher';
 14  
 15  export const LANG_MAP = {
 16    en: 'English',
 17    es: 'Spanish',
 18    fr: 'French',
 19    el: 'Greek',
 20  };
 21  type LanguageCode = keyof typeof LANG_MAP;
 22  
 23  // Define the type for the language codes
 24  
 25  // Example usage
 26  
 27  export function SettingsMenu() {
 28    const [settingsOpen, setSettingsOpen] = useState(false);
 29    const [languagesOpen, setLanguagesOpen] = useState(false);
 30    const { openReadMode } = useModalContext();
 31    const [anchorEl, setAnchorEl] = useState<Element | null>(null);
 32    const trackEvent = useRootStore((store) => store.trackEvent);
 33    const handleSettingsClick = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
 34      setAnchorEl(event.currentTarget);
 35      setSettingsOpen(true);
 36      setLanguagesOpen(false);
 37    };
 38  
 39    const handleLanguageClick = () => {
 40      const savedLocale = localStorage.getItem('LOCALE') || DEFAULT_LOCALE;
 41      const langCode = savedLocale as LanguageCode;
 42      setSettingsOpen(false);
 43      setLanguagesOpen(true);
 44      trackEvent(SETTINGS.LANGUAGE, { language: LANG_MAP[langCode] });
 45    };
 46  
 47    const handleCloseLanguage = () => {
 48      setSettingsOpen(true);
 49      setLanguagesOpen(false);
 50    };
 51  
 52    const handleClose = () => {
 53      setAnchorEl(null);
 54      setSettingsOpen(false);
 55      setLanguagesOpen(false);
 56    };
 57  
 58    const handleOpenReadMode = () => {
 59      setSettingsOpen(false);
 60      openReadMode();
 61    };
 62  
 63    return (
 64      <>
 65        <Button
 66          variant="surface"
 67          aria-label="settings"
 68          id="settings-button"
 69          aria-controls={settingsOpen ? 'settings-menu' : undefined}
 70          aria-expanded={settingsOpen ? 'true' : undefined}
 71          aria-haspopup="true"
 72          onClick={handleSettingsClick}
 73          sx={{ p: '7px 8px', minWidth: 'unset', ml: 2 }}
 74        >
 75          <SvgIcon sx={{ color: '#F1F1F3' }} fontSize="small">
 76            <CogIcon />
 77          </SvgIcon>
 78        </Button>
 79  
 80        <Menu
 81          id="settings-menu"
 82          MenuListProps={{
 83            'aria-labelledby': 'settings-button',
 84          }}
 85          anchorEl={anchorEl}
 86          open={settingsOpen}
 87          onClose={handleClose}
 88          sx={{ '.MuiMenuItem-root.Mui-disabled': { opacity: 1 } }}
 89          keepMounted={true}
 90        >
 91          <MenuItem disabled sx={{ mb: '4px' }}>
 92            <Typography variant="subheader2" color="text.secondary">
 93              <Trans>Global settings</Trans>
 94            </Typography>
 95          </MenuItem>
 96  
 97          <DarkModeSwitcher component={MenuItem} />
 98          {PROD_ENV && <TestNetModeSwitcher />}
 99          <LanguageListItem onClick={handleLanguageClick} component={MenuItem} />
100          <MenuItem onClick={handleOpenReadMode}>
101            <ListItemText>
102              <Trans>Watch wallet</Trans>
103            </ListItemText>
104          </MenuItem>
105        </Menu>
106  
107        <Menu
108          id="settings-menu"
109          MenuListProps={{
110            'aria-labelledby': 'settings-button',
111          }}
112          anchorEl={anchorEl}
113          open={languagesOpen}
114          onClose={handleClose}
115          keepMounted={true}
116        >
117          <LanguagesList onClick={handleCloseLanguage} component={MenuItem} />
118        </Menu>
119      </>
120    );
121  }