import React from 'react'; import { isMobile } from 'react-device-detect'; import { Trans } from '@lingui/macro'; import makeStyles from '@mui/styles/makeStyles'; //import Button from '@mui/material/Button'; import Grid from '@mui/material/Grid'; import List from '@mui/material/List'; import ListItem from '@mui/material/ListItem'; import ListItemText from '@mui/material/ListItemText'; import ListSubheader from '@mui/material/ListSubheader'; import Popover from '@mui/material/Popover'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import WarningIcon from '@mui/icons-material/Warning'; import useInterval from './hooks/useInterval'; import Duration from './misc/Duration'; import Logo from './misc/Logo'; import Number from './misc/Number'; const useStyles = makeStyles((theme) => ({ footer: { zIndex: '2', position: 'fixed', bottom: 0, width: '100%', height: 60, background: `-webkit-linear-gradient(left, ${theme.palette.background.footer1} 0, ${theme.palette.background.footer2} 100%)`, color: theme.palette.text.secondary, '& .footerLeft': { textOverflow: 'ellipsis', overflow: 'hidden !important', whiteSpace: 'nowrap', marginLeft: 40, }, '& .footerRight': { marginLeft: 20, marginRight: 40, }, '& .footerVersion': { textOverflow: 'ellipsis', overflow: 'hidden !important', whiteSpace: 'nowrap', }, '@media (max-width: 599px)': { '& .footerLeft': { marginRight: 20, }, '& .footerRight': { marginLeft: 20, }, '& .footerVersion': { display: 'none', }, }, }, warningIcon: { fontSize: '1.1rem', marginTop: -1, marginRight: 5, }, subheader: { color: `${theme.palette.service.main}`, textTransform: 'uppercase', fontWeight: 'bold', }, })); function Resources(props) { const classes = useStyles(); const [$popover, setPopover] = React.useState(null); const [$resources, setResources] = React.useState(null); const handlePopoverOpen = (event) => { setPopover(event.currentTarget); }; const handlePopoverClose = () => { setPopover(null); }; const open = Boolean($popover); useInterval(async () => { await update(); }, 2000); React.useEffect(() => { (async () => { await update(); })(); // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const update = async () => { const resources = await props.resources(); if (resources === null) { return; } resources.system.mem_used = (resources.system.mem_used_bytes / resources.system.mem_total_bytes) * 100; resources.core.disk_used = -1; if (resources.core.disk_limit_bytes > 0) { resources.core.disk_used = (resources.core.disk_used_bytes / resources.core.disk_limit_bytes) * 100; } resources.core.memfs_used = -1; if (resources.core.memfs_limit_bytes > 0) { resources.core.memfs_used = (resources.core.memfs_used_bytes / resources.core.memfs_limit_bytes) * 100; } resources.core.net_used = -1; if (resources.core.net_limit_kbit > 0) { resources.core.net_used = (resources.core.net_used_kbit / resources.core.net_limit_kbit) * 100; } resources.core.sessions = -1; if (resources.core.session_limit > 0) { resources.core.sessions = (resources.core.session_used / resources.core.session_limit) * 100; } setResources(resources); }; if ($resources === null) { return null; } const system = $resources.system; const core = $resources.core; return ( {(system.cpu_used >= 75 || system.mem_used >= 75 || core.memfs_used >= 75 || core.disk_used >= 75 || core.net_used >= 75) && ( )} {system.cpu_used.toFixed(0)}% CPU / {system.mem_used.toFixed(0)}% Mem Uptime } > } secondary={``} /> System } > = 75}> {system.cpu_used.toFixed(0)}% CPU} secondary={ {system.cpu_ncores} Cores } /> = 75}> {system.mem_used.toFixed(0)}% Memory } secondary={ / {' '} MB } /> Application } > {core.sessions >= 0 ? ( {core.sessions.toFixed(0)}% Viewer } secondary={ / Viewer } /> ) : ( Sessions } secondary={ Viewer } /> )} {core.net_used >= 0 ? ( {core.net_used.toFixed(0)}% Bandwidth } secondary={ / Mbit/s } /> ) : ( Bandwidth } secondary={ Mbit/s } /> )} {core.memfs_used >= 0 ? ( {core.memfs_used.toFixed(0)}% In-memory storage } secondary={ / MB } /> ) : ( In-memory storage } secondary={ MB } /> )} {/* */} {core.disk_used >= 0 ? ( {core.disk_used.toFixed(0)}% Disk storage } secondary={ / MB } /> ) : ( Disk storage } secondary={ MB } /> )} {/* */} ); } Resources.defaultProps = { resources: () => { return null; }, }; const initVersion = (initialVersion) => { if (!initialVersion) { initialVersion = {}; } const version = { number: 0, arch: 'unknown', ...initialVersion, }; return version; }; export default function Footer(props) { const classes = useStyles(); const version = initVersion(props.version); if (props.expand === true) { return ( {props.app} v{version.number} ({version.arch}) {props.name ? '- ' + props.name : ''} ); } else { return ( ); } } Footer.defaultProps = { expand: false, app: '', name: '', version: initVersion(), resources: () => { return null; }, };