From 111145886379e790fd1b4200643fd9f6916c837a Mon Sep 17 00:00:00 2001 From: proddy Date: Tue, 14 Apr 2026 09:31:50 +0200 Subject: [PATCH] upgrade message warnings --- interface/src/components/upload/DragNdrop.tsx | 15 ++-- interface/src/i18n/cz/index.ts | 9 +- interface/src/i18n/de/index.ts | 9 +- interface/src/i18n/en/index.ts | 9 +- interface/src/i18n/fr/index.ts | 9 +- interface/src/i18n/it/index.ts | 9 +- interface/src/i18n/nl/index.ts | 3 - interface/src/i18n/no/index.ts | 9 +- interface/src/i18n/pl/index.ts | 9 +- interface/src/i18n/sk/index.ts | 9 +- interface/src/i18n/sv/index.ts | 9 +- interface/src/i18n/tr/index.ts | 9 +- mock-api/restServer.ts | 25 ++---- src/web/WebStatusService.cpp | 82 +++++++++++++++---- src/web/WebStatusService.h | 2 +- 15 files changed, 132 insertions(+), 85 deletions(-) diff --git a/interface/src/components/upload/DragNdrop.tsx b/interface/src/components/upload/DragNdrop.tsx index e0214b1bf..0f6feedf8 100644 --- a/interface/src/components/upload/DragNdrop.tsx +++ b/interface/src/components/upload/DragNdrop.tsx @@ -78,16 +78,19 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => { useState(0); const { send: checkUpgradeImportantMessages } = useRequest( - (type: string) => - callAction({ action: 'upgradeImportantMessages', param: type }), + (version: string) => + callAction({ action: 'upgradeImportantMessages', param: version }), { immediate: false } ) - .onSuccess((event: { data: number }) => { - setUpgradeImportantMessageType(event.data); + .onSuccess((event) => { + setUpgradeImportantMessageType( + (event.data as { upgradeImportantMessageType: number }) + .upgradeImportantMessageType + ); }) - .onError((error: { error?: { message?: string } }) => { + .onError((error) => { toast.error(String(error.error?.message || 'An error occurred')); }); @@ -189,7 +192,7 @@ const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => { {LL.UPLOAD()} - {showUpgradeDialog && ( + {showUpgradeDialog && upgradeImportantMessageType > 0 && ( contact your installer." ], - img_url: 'https://emsesp.org/_media/images/designer.png' + img_url: 'https://emsesp.org/media/images/designer.png' // img_url: 'https://picsum.photos/200/300' } }; @@ -5173,29 +5173,16 @@ router } else if (action === 'upgradeImportantMessages') { // check upgrade important messages console.log( - 'checking upgrade important messages for version ', + 'checking upgrade important messages for version', content.param ); // determine message based on if we're upgrading a minor or major version // TODO finish this - let message = 0; const version = content.param; - const majorVersion = version.split('.')[0]; - const minorVersion = version.split('.')[1]; - const currentMajorVersion = THIS_VERSION.split('.')[0]; - const currentMinorVersion = THIS_VERSION.split('.')[1]; - if (majorVersion > currentMajorVersion) { - message = 1; - } else if (majorVersion < currentMajorVersion) { - message = 2; - } else if (minorVersion > currentMinorVersion) { - message = 1; - } else if (minorVersion < currentMinorVersion) { - message = 2; - } else { - message = 0; - } - return message; + const data = { + upgradeImportantMessageType: 1 + }; + return data; } } return status(404); // cmd not found diff --git a/src/web/WebStatusService.cpp b/src/web/WebStatusService.cpp index 3978d6e91..81f548b20 100644 --- a/src/web/WebStatusService.cpp +++ b/src/web/WebStatusService.cpp @@ -217,7 +217,7 @@ void WebStatusService::action(AsyncWebServerRequest * request, JsonVariant json) EMSESP::mqtt_.reset_mqtt(); ok = true; } else if (action == "upgradeImportantMessages") { - ok = upgradeImportantMessages(param.c_str()); + ok = upgradeImportantMessages(root, param); } #if defined(EMSESP_STANDALONE) && !defined(EMSESP_UNITY) @@ -240,26 +240,76 @@ void WebStatusService::action(AsyncWebServerRequest * request, JsonVariant json) } // action = upgradeImportantMessages -// returns the type of upgrade important message to show\ -// 0 = no message -// 1 = major version upgrade -// 2 = minor version upgrade -// TODO finish this -bool WebStatusService::upgradeImportantMessages(const char * version) { - version::Semver200_version current_version(current_version_s); - version::Semver200_version latest_version(version); - if (latest_version > current_version) { - return 1; +// returns the type of upgrade important message to display in the UI +// 0 = no message (if just a minor version upgrade) +// 1 = going from <= 3.8 to 3.9 (new partition layout) +// 2 = major version upgrade +// version can be like 3.8.2 or a filename like EMS-ESP-3_8_2-dev_13-ESP32-16MB+.bin +bool WebStatusService::upgradeImportantMessages(JsonObject root, std::string & version) { + if (version.empty()) { + return false; } + + uint8_t upgradeImportantMessageType = 0; + + // it's a filename with a .bin extension, try and extract the version from it + version::Semver200_version latest_version; + if (version.find(".bin") != std::string::npos) { + // e.g. EMS-ESP-3_8_2-dev_13-ESP32-16MB+.bin -> major=3 minor=8 patch=2 + std::string filename = version; + auto pos = filename.find("EMS-ESP-"); + if (pos == std::string::npos) { + EMSESP::logger().err("Invalid version string: %s", version.c_str()); + return false; + } + pos += 8; // skip past "EMS-ESP-" + auto underscore1 = filename.find('_', pos); + auto underscore2 = filename.find('_', underscore1 + 1); + auto dash = filename.find('-', underscore2 + 1); + if (underscore1 == std::string::npos || underscore2 == std::string::npos || dash == std::string::npos) { + EMSESP::logger().err("Invalid version string: %s", version.c_str()); + return false; + } + std::string major_version = filename.substr(pos, underscore1 - pos); + std::string minor_version = filename.substr(underscore1 + 1, underscore2 - underscore1 - 1); + std::string patch_version = filename.substr(underscore2 + 1, dash - underscore2 - 1); + latest_version = version::Semver200_version(major_version + "." + minor_version + "." + patch_version); + } else { + latest_version = version::Semver200_version(version); + } + + // check if it's a valid version string + if (!latest_version.major()) { + EMSESP::logger().err("Invalid version string: %s", version.c_str()); + return false; + } + + version::Semver200_version current_version(current_version_s); // get current version + + if (current_version.major() <= 3 && current_version.minor() <= 8) { + upgradeImportantMessageType = 1; // if moving from below 3.8.x to 3.9.x return 1 + } else if (latest_version > current_version && current_version.minor() < latest_version.minor()) { + upgradeImportantMessageType = 0; // if it's just a minor version upgrade return 0 + } else if (latest_version > current_version && current_version.major() < latest_version.major()) { + upgradeImportantMessageType = 2; // if it's a major version upgrade return 2 + } + + // #if defined(EMSESP_DEBUG) + // EMSESP::logger().debug("upgradeImportantMessageType: %s %d", version.c_str(), upgradeImportantMessageType); + // #endif + + root["upgradeImportantMessageType"] = upgradeImportantMessageType; + + return true; } // action = checkUpgrade // versions holds the latest development version and stable version in one string, comma separated -bool WebStatusService::checkUpgrade(JsonObject root, std::string & versions) { - if (!versions.empty()) { +bool WebStatusService::checkUpgrade(JsonObject root, std::string & version) { + if (!version.empty()) { version::Semver200_version current_version(current_version_s); - version::Semver200_version latest_dev_version(versions.substr(0, versions.find(','))); - version::Semver200_version latest_stable_version(versions.substr(versions.find(',') + 1)); + version::Semver200_version latest_dev_version(version.substr(0, version.find(','))); + version::Semver200_version latest_stable_version(version.substr(version.find(',') + 1)); bool dev_upgradeable = latest_dev_version > current_version; bool stable_upgradeable = latest_stable_version > current_version; @@ -358,7 +408,7 @@ bool WebStatusService::getCustomSupport(JsonObject root) { #if defined(EMSESP_STANDALONE) // dummy test data for "test api3" - deserializeJson(doc, "{\"type\":\"customSupport\",\"Support\":{\"html\":[\"html code\",\"here\"], \"img_url\": \"https://emsesp.org/_media/images/designer.png\"}"); + deserializeJson(doc, "{\"type\":\"customSupport\",\"Support\":{\"html\":[\"html code\",\"here\"], \"img_url\": \"https://emsesp.org/media/images/designer.png\"}"); #else // check if we have custom support file uploaded File file = LittleFS.open(EMSESP_CUSTOMSUPPORT_FILE, "r"); diff --git a/src/web/WebStatusService.h b/src/web/WebStatusService.h index 7dd7e28f8..ff495d44a 100644 --- a/src/web/WebStatusService.h +++ b/src/web/WebStatusService.h @@ -36,7 +36,7 @@ class WebStatusService { bool uploadURL(const char * url); bool setSystemStatus(const char * status); void allvalues(JsonObject output); - bool upgradeImportantMessages(const char * version); + bool upgradeImportantMessages(JsonObject root, std::string & version); std::string current_version_s = EMSESP_APP_VERSION; };