From 337c07d7bc9fbc606bb82bf7076bcd7d2d10dc1c Mon Sep 17 00:00:00 2001 From: proddy Date: Fri, 22 Oct 2021 22:14:39 +0200 Subject: [PATCH] firmware version checker in Web - #168 --- interface/src/system/SystemStatusForm.tsx | 28 ++++ interface/src/system/VersionCheck.tsx | 180 ++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 interface/src/system/VersionCheck.tsx diff --git a/interface/src/system/SystemStatusForm.tsx b/interface/src/system/SystemStatusForm.tsx index 1fa18647b..2b5df2b00 100644 --- a/interface/src/system/SystemStatusForm.tsx +++ b/interface/src/system/SystemStatusForm.tsx @@ -33,15 +33,19 @@ import { AuthenticatedContextProps, withAuthenticatedContext } from '../authentication'; + import { RestFormProps, FormButton, ErrorButton } from '../components'; import { FACTORY_RESET_ENDPOINT, RESTART_ENDPOINT } from '../api'; import { SystemStatus, EspPlatform } from './types'; +import VersionCheck from './VersionCheck'; + interface SystemStatusFormState { confirmRestart: boolean; confirmFactoryReset: boolean; processing: boolean; + currentVersion?: string; } type SystemStatusFormProps = AuthenticatedContextProps & @@ -61,6 +65,16 @@ class SystemStatusForm extends Component< processing: false }; + onVersionCheck = (version: string) => { + this.setState({ currentVersion: version }); + }; + + closeVersionCheck = () => { + this.setState({ + currentVersion: undefined + }); + }; + createListItems() { const { data } = this.props; return ( @@ -75,7 +89,14 @@ class SystemStatusForm extends Component< primary="EMS-ESP Version" secondary={'v' + data.emsesp_version} /> + + @@ -304,9 +325,16 @@ class SystemStatusForm extends Component< render() { const me = this.props.authenticatedContext.me; + const { currentVersion } = this.state; return ( {this.createListItems()} + {currentVersion && ( + + )} void; +} + +interface VersionCheckState { + latestVersion?: string; + latestVersionUrl?: string; + latestDevVersion?: string; + latestDevVersionUrl?: string; +} + +class VersionCheck extends React.Component< + VersionCheckProps, + VersionCheckState +> { + state: VersionCheckState = {}; + + componentDidMount() { + fetch(VERSIONCHECK_ENDPOINT) + .then((response) => { + if (response.status === 200) { + return response.json(); + } else { + throw Error( + 'Unable to get version information. Check internet connection. (' + + response.status + + ')' + ); + } + }) + .then((data) => { + this.setState({ latestVersion: data.name }); + this.setState({ + latestVersionUrl: data.assets[1].browser_download_url + }); + }) + .catch((error) => { + this.props.enqueueSnackbar( + error.message || 'Problem getting response', + { variant: 'error' } + ); + this.setState({ latestVersion: undefined }); + this.props.onClose(); + }); + + fetch(VERSIONCHECK_DEV_ENDPOINT) + .then((response) => { + if (response.status === 200) { + return response.json(); + } else { + throw Error( + 'Unable to get version information. Check internet connection. (' + + response.status + + ')' + ); + } + }) + .then((data) => { + this.setState({ latestDevVersion: data.name.split(/\s+/).splice(-1) }); + this.setState({ + latestDevVersionUrl: data.assets[1].browser_download_url + }); + }) + .catch((error) => { + this.props.enqueueSnackbar( + error.message || 'Problem getting response', + { variant: 'error' } + ); + this.setState({ latestDevVersion: undefined }); + this.props.onClose(); + }); + } + + render() { + const { onClose, currentVersion } = this.props; + const { + latestVersion, + latestVersionUrl, + latestDevVersion, + latestDevVersionUrl + } = this.state; + return ( + + + Firmware Update Check + + + {latestVersion ? ( + + + + You are currently on version v{currentVersion} + + + + The latest stable version is {latestVersion}. + Download  + + {'here'}. + + + + The latest development (beta) version is{' '} + {latestDevVersion}. Download  + + {'here'}. + + + + + + After downloading the firmware, go to UPLOAD FIRMWARE to + install the new version + + + + + ) : ( + + + + Fetching version details… + + + )} + + + + Close + + + + ); + } +} + +export default withSnackbar(VersionCheck);