import { FC, useContext, useState, useEffect } from 'react'; import { useSnackbar } from 'notistack'; import { Avatar, Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Divider, List, ListItem, ListItemAvatar, ListItemText, Link, Typography } from '@mui/material'; import DevicesIcon from '@mui/icons-material/Devices'; import ShowChartIcon from '@mui/icons-material/ShowChart'; import MemoryIcon from '@mui/icons-material/Memory'; import AppsIcon from '@mui/icons-material/Apps'; import SdStorageIcon from '@mui/icons-material/SdStorage'; import SdCardAlertIcon from '@mui/icons-material/SdCardAlert'; import FolderIcon from '@mui/icons-material/Folder'; import RefreshIcon from '@mui/icons-material/Refresh'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; import BuildIcon from '@mui/icons-material/Build'; import TimerIcon from '@mui/icons-material/Timer'; import CancelIcon from '@mui/icons-material/Cancel'; import { ButtonRow, FormLoader, SectionContent, MessageBox } from '../../components'; import { SystemStatus, Version } from '../../types'; import * as SystemApi from '../../api/system'; import { extractErrorMessage, useRest } from '../../utils'; import { AuthenticatedContext } from '../../contexts/authentication'; import axios from 'axios'; import { useI18nContext } from '../../i18n/i18n-react'; export const VERSIONCHECK_ENDPOINT = 'https://api.github.com/repos/emsesp/EMS-ESP32/releases/latest'; export const VERSIONCHECK_DEV_ENDPOINT = 'https://api.github.com/repos/emsesp/EMS-ESP32/releases/tags/latest'; export const uploadURL = window.location.origin + '/system/upload'; function formatNumber(num: number) { return new Intl.NumberFormat().format(num); } const SystemStatusForm: FC = () => { const { LL } = useI18nContext(); const { loadData, data, errorMessage } = useRest({ read: SystemApi.readSystemStatus }); const { me } = useContext(AuthenticatedContext); const [confirmRestart, setConfirmRestart] = useState(false); const [confirmFactoryReset, setConfirmFactoryReset] = useState(false); const [processing, setProcessing] = useState(false); const { enqueueSnackbar } = useSnackbar(); const [showingVersion, setShowingVersion] = useState(false); const [latestVersion, setLatestVersion] = useState(); const [latestDevVersion, setLatestDevVersion] = useState(); useEffect(() => { axios.get(VERSIONCHECK_ENDPOINT).then((response) => { setLatestVersion({ version: response.data.name, url: response.data.assets[1].browser_download_url, changelog: response.data.html_url }); }); axios.get(VERSIONCHECK_DEV_ENDPOINT).then((response) => { setLatestDevVersion({ version: response.data.name.split(/\s+/).splice(-1), url: response.data.assets[1].browser_download_url, changelog: response.data.assets[0].browser_download_url }); }); }, []); const restart = async () => { setProcessing(true); try { await SystemApi.restart(); enqueueSnackbar(LL.APPLICATION_RESTARTING(), { variant: 'info' }); } catch (error) { enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_LOADING()), { variant: 'error' }); } finally { setConfirmRestart(false); setProcessing(false); } }; const renderRestartDialog = () => ( setConfirmRestart(false)}> {LL.RESTART()} {LL.RESTART_CONFIRM()} ); const renderVersionDialog = () => { return ( setShowingVersion(false)}> {LL.VERSION_CHECK()} {latestVersion && ( {LL.THE_LATEST()} {LL.OFFICIAL()} {LL.VERSION_IS()} {latestVersion.version} ( {LL.RELEASE_NOTES()} ) ( {LL.DOWNLOAD()} ) )} {latestDevVersion && ( {LL.THE_LATEST()} {LL.DEVELOPMENT()} {LL.VERSION_IS()} {latestDevVersion.version}  ( {LL.RELEASE_NOTES()} ) ( {LL.DOWNLOAD()} ) )} {LL.USE()}  {LL.UPLOAD()}  {LL.SYSTEM_APPLY_FIRMWARE()} ); }; const factoryReset = async () => { setProcessing(true); try { await SystemApi.factoryReset(); enqueueSnackbar(LL.SYSTEM_FACTORY_TEXT(), { variant: 'info' }); } catch (error) { enqueueSnackbar(extractErrorMessage(error, LL.PROBLEM_UPDATING()), { variant: 'error' }); } finally { setConfirmFactoryReset(false); setProcessing(false); } }; const renderFactoryResetDialog = () => ( setConfirmFactoryReset(false)}> {LL.FACTORY_RESET()} {LL.SYSTEM_FACTORY_TEXT_DIALOG()} ); const content = () => { if (!data) { return ; } return ( <> {latestVersion && ( )} {data.psram_size !== undefined && data.free_psram !== undefined && ( <> )} {me.admin && ( )} {renderVersionDialog()} {renderRestartDialog()} {renderFactoryResetDialog()} ); }; return ( {content()} ); }; export default SystemStatusForm;