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;
},
};