Files
nym/explorer/src/components/MobileNav.tsx
T
2023-03-09 10:39:30 +01:00

180 lines
5.4 KiB
TypeScript

import * as React from 'react';
import { Link } from 'react-router-dom';
import { useTheme } from '@mui/material/styles';
import MuiLink from '@mui/material/Link';
import {
AppBar,
Box,
Button,
Drawer,
IconButton,
List,
ListItem,
ListItemButton,
ListItemIcon,
Toolbar,
Typography,
} from '@mui/material';
import { Menu } from '@mui/icons-material';
import { NymLogo } from '@nymproject/react/logo/NymLogo';
import { MaintenanceBanner } from '@nymproject/react/banners/MaintenanceBanner';
import { useMainContext } from '../context/main';
import { MobileDrawerClose } from '../icons/MobileDrawerClose';
import { Footer } from './Footer';
import { NYM_WEBSITE } from '../api/constants';
import { ExpandableButton } from './Nav';
import { DarkLightSwitchMobile } from './Switch';
export const MobileNav: FCWithChildren = ({ children }) => {
const theme = useTheme();
const { navState, updateNavState, environment } = useMainContext();
const [drawerOpen, setDrawerOpen] = React.useState(false);
// Set maintenance banner to false by default to don't display it
const [openMaintenance, setOpenMaintenance] = React.useState(false);
const explorerName =
`${environment && environment.charAt(0).toUpperCase() + environment.slice(1)} Explorer` || 'Mainnet Explorer';
const switchNetworkText = environment === 'mainnet' ? 'Switch to Testnet' : 'Switch to Mainnet';
const switchNetworkLink =
environment === 'mainnet' ? 'https://sandbox-explorer.nymtech.net' : 'https://explorer.nymtech.net';
const toggleDrawer = () => {
setDrawerOpen(!drawerOpen);
};
const handleClick = (id: number) => {
updateNavState(id);
toggleDrawer();
};
const openDrawer = () => {
setDrawerOpen(true);
};
return (
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
<AppBar
sx={{
background: theme.palette.nym.networkExplorer.topNav.appBar,
borderRadius: 0,
}}
>
<MaintenanceBanner open={openMaintenance} onClick={() => setOpenMaintenance(false)} />
<Toolbar
disableGutters
sx={{
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
width: '100%',
}}
>
<Box
sx={{
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
width: 'auto',
}}
>
<IconButton component="a" href={NYM_WEBSITE} target="_blank">
<NymLogo height="24px" width="24px" />
</IconButton>
<Typography
variant="h6"
noWrap
sx={{
color: theme.palette.nym.networkExplorer.nav.text,
fontSize: '18px',
fontWeight: 600,
}}
>
<MuiLink component={Link} to="/overview" underline="none" color="inherit" fontSize={14} fontWeight={700}>
{explorerName}
</MuiLink>
<Button
size="small"
variant="outlined"
color="inherit"
href={switchNetworkLink}
sx={{ textTransform: 'none', width: 114, fontSize: '12px', fontWeight: 600, ml: 1 }}
>
{switchNetworkText}
</Button>
</Typography>
</Box>
<Box sx={{ mr: 1 }}>
<DarkLightSwitchMobile />
<Button onClick={toggleDrawer}>
<Menu sx={{ color: theme.palette.primary.contrastText }} />
</Button>
</Box>
</Toolbar>
</AppBar>
<Drawer
anchor="left"
open={drawerOpen}
onClose={toggleDrawer}
PaperProps={{
style: {
background: theme.palette.nym.networkExplorer.nav.background,
},
}}
>
<Box role="presentation">
<List sx={{ pt: 0, pb: 0 }}>
<ListItem
disablePadding
disableGutters
sx={{
height: 64,
background: theme.palette.nym.networkExplorer.nav.background,
borderBottom: '1px solid rgba(255, 255, 255, 0.1)',
}}
>
<ListItemButton
onClick={toggleDrawer}
sx={{
pt: 2,
pb: 2,
background: theme.palette.nym.networkExplorer.nav.background,
display: 'flex',
justifyContent: 'flex-start',
}}
>
<ListItemIcon>
<MobileDrawerClose />
</ListItemIcon>
</ListItemButton>
</ListItem>
{navState.map((props) => (
<ExpandableButton
key={props.url}
id={props.id}
title={props.title}
openDrawer={openDrawer}
url={props.url}
drawIsTempOpen={drawerOpen === true}
drawIsFixed={false}
Icon={props.Icon}
setToActive={handleClick}
nested={props.nested}
isMobile
isActive={props.isActive}
/>
))}
</List>
</Box>
</Drawer>
<Box sx={{ width: '100%', p: 4, mt: 7 }}>
{children}
<Footer />
</Box>
</Box>
);
};