import { useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; import CheckIcon from '@mui/icons-material/Done'; import DownloadIcon from '@mui/icons-material/GetApp'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; import WarningIcon from '@mui/icons-material/Warning'; import { Box, Button, Dialog, DialogActions, DialogContent, DialogTitle, Link, Typography } from '@mui/material'; import Grid from '@mui/material/Grid2'; import * as SystemApi from 'api/system'; import { callAction } from 'api/app'; import { getDevVersion, getStableVersion } from 'api/system'; import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova/client'; import RestartMonitor from 'app/status/RestartMonitor'; import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; const Version = () => { const { LL } = useI18nContext(); const [restarting, setRestarting] = useState(false); const [openDialog, setOpenDialog] = useState(false); const [useDev, setUseDev] = useState(false); const [upgradeAvailable, setUpgradeAvailable] = useState(false); const { send: sendCheckUpgrade } = useRequest( (versions: string) => callAction({ action: 'checkUpgrade', param: versions }), { immediate: false } ).onSuccess((event) => { const data = event.data as { emsesp_version: string; upgradeable: boolean }; setUpgradeAvailable(data.upgradeable); }); const { data, send: loadData, error } = useRequest(SystemApi.readSystemStatus); const { send: sendUploadURL } = useRequest( (url: string) => callAction({ action: 'uploadURL', param: url }), { immediate: false } ); // called immediately to get the latest versions on page load const { data: latestVersion } = useRequest(getStableVersion); const { data: latestDevVersion } = useRequest(getDevVersion); useEffect(() => { if (latestVersion && latestDevVersion) { // console.log("Latest versions, stable: " + latestVersion + " dev: " + latestDevVersion); sendCheckUpgrade(latestDevVersion + ',' + latestVersion).catch( (error: Error) => { toast.error('Failed to check upgrade: ' + error.message); } ); } }, [latestVersion, latestDevVersion]); const STABLE_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/'; const STABLE_RELNOTES_URL = 'https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md'; const DEV_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/latest/'; const DEV_RELNOTES_URL = 'https://github.com/emsesp/EMS-ESP32/blob/dev/CHANGELOG_LATEST.md'; const getBinURL = (useDevVersion: boolean) => { if (!latestVersion || !latestDevVersion) { return ''; } const filename = 'EMS-ESP-' + (useDevVersion ? latestDevVersion : latestVersion).replaceAll('.', '_') + '-' + getPlatform() + '.bin'; return useDevVersion ? DEV_URL + filename : STABLE_URL + 'v' + latestVersion + '/' + filename; }; const getPlatform = () => { return ( [data.esp_platform, data.flash_chip_size >= 16384 ? '16MB' : '4MB'].join('-') + (data.psram ? '+' : '') ); }; const installFirmwareURL = async (url: string) => { await sendUploadURL(url).catch((error: Error) => { toast.error(error.message); }); setRestarting(true); }; useLayoutTitle('EMS-ESP Firmware'); // see if we have internet access const internet_live = latestDevVersion !== undefined && latestVersion !== undefined; // check for older boards where auto-upgrade is not supported const download_only = data && !data.psram; const renderUploadDialog = () => { if (!internet_live) { return null; } return ( setOpenDialog(false)} > {(download_only ? LL.DOWNLOAD(0) : LL.INSTALL('')) + ' ' + ' Firmware'} {LL.INSTALL_VERSION( download_only ? LL.DOWNLOAD(1) : LL.INSTALL(''), useDev ? latestDevVersion : latestVersion )} {!download_only && ( )} ); }; const showFirmwareDialog = (useDevVersion: boolean) => { if (useDevVersion || data.emsesp_version.includes('dev')) { setUseDev(true); } setOpenDialog(true); }; const content = () => { if (!data) { return ; } const isDev = data.emsesp_version.includes('dev'); return ( <> Firmware Version {LL.VERSION()} Platform Release Type {data.emsesp_version} {data.build_flags && (   ({data.build_flags}) )} {getPlatform()} {isDev ? LL.DEVELOPMENT() : LL.STABLE()} {!isDev && internet_live && ( )} {LL.AVAILABLE_VERSION()} {internet_live ? ( <> {LL.STABLE()} {LL.DEVELOPMENT()} {latestVersion}   (changelog) {!isDev && upgradeAvailable && ( )} {latestDevVersion}   (changelog) {isDev && upgradeAvailable && ( )} {upgradeAvailable ? ( {LL.UPGRADE_AVAILABLE()} ) : ( {LL.LATEST_VERSION()} )} ) : ( not online )} {renderUploadDialog()} ); }; return ( {restarting ? : content()} ); }; export default Version;