From f3f6ebb2f5223d69abeb42706736c24c2ccfb77c Mon Sep 17 00:00:00 2001 From: syed-axonaio Date: Tue, 16 Jun 2026 16:19:11 +0530 Subject: [PATCH 1/2] fix: disable Update App button when no changes made --- .../apps/providers/add_app_provider.dart | 63 ++++++++----------- app/lib/pages/apps/update_app.dart | 14 ++--- 2 files changed, 33 insertions(+), 44 deletions(-) diff --git a/app/lib/pages/apps/providers/add_app_provider.dart b/app/lib/pages/apps/providers/add_app_provider.dart index 91f9172f1b7..d4ffb3983a1 100644 --- a/app/lib/pages/apps/providers/add_app_provider.dart +++ b/app/lib/pages/apps/providers/add_app_provider.dart @@ -76,8 +76,11 @@ class AddAppProvider extends ChangeNotifier { bool isUpdating = false; bool isSubmitting = false; bool isValid = false; + bool hasChanges = false; bool isGenratingDescription = false; + App? _originalApp; + bool allowPaidApps = false; // API Keys @@ -214,7 +217,9 @@ class AddAppProvider extends ChangeNotifier { thumbnailUrls = app.thumbnailUrls; thumbnailIds = app.thumbnailIds; + _originalApp = app; isValid = false; + hasChanges = false; setIsLoading(false); notifyListeners(); } @@ -338,49 +343,33 @@ class AddAppProvider extends ChangeNotifier { } bool hasDataChanged(App app, String category) { - if (imageFile != null) { - return true; - } - if (appNameController.text != app.name) { - return true; - } - if (appDescriptionController.text != app.description) { - return true; - } - if (makeAppPublic != !app.private) { - return true; - } - if (appCategory != category) { - return true; - } - if (selectedCapabilities.length != app.capabilities.length) { - return true; - } + if (imageFile != null) return true; + if (appNameController.text != app.name.decodeString) return true; + if (appDescriptionController.text != app.description.decodeString) return true; + if (makeAppPublic != !app.private) return true; + if (appCategory != category) return true; + if (selectedCapabilities.length != app.capabilities.length) return true; if (app.externalIntegration != null) { - if (triggerEvent != app.externalIntegration!.triggersOn) { - return true; - } - if (webhookUrlController.text != app.externalIntegration!.webhookUrl) { - return true; - } - if (setupCompletedController.text != app.externalIntegration!.setupCompletedUrl) { - return true; - } - if (instructionsController.text != app.externalIntegration!.setupInstructionsFilePath) { - return true; - } - } - if (chatPromptController.text != app.chatPrompt) { - return true; - } - if (conversationPromptController.text != app.conversationPrompt) { - return true; - } + if (triggerEvent != app.externalIntegration!.triggersOn) return true; + if (webhookUrlController.text != app.externalIntegration!.webhookUrl) return true; + if (setupCompletedController.text != app.externalIntegration!.setupCompletedUrl) return true; + if (instructionsController.text != app.externalIntegration!.setupInstructionsFilePath) return true; + if (appHomeUrlController.text != app.externalIntegration!.appHomeUrl) return true; + if (chatToolsManifestUrlController.text != app.externalIntegration!.chatToolsManifestUrl) return true; + } + if (chatPromptController.text != (app.chatPrompt ?? '').decodeString) return true; + if (conversationPromptController.text != (app.conversationPrompt ?? '').decodeString) return true; + if (sourceCodeUrlController.text != (app.sourceCodeUrl ?? '')) return true; + if (isPaid != app.isPaid) return true; + if (selectePaymentPlan != app.paymentPlan) return true; + if (priceController.text != app.price.toString()) return true; + if (!listEquals(thumbnailIds, app.thumbnailIds)) return true; return false; } void checkValidity() { isValid = isFormValid(); + hasChanges = _originalApp != null && hasDataChanged(_originalApp!, _originalApp!.category); notifyListeners(); } diff --git a/app/lib/pages/apps/update_app.dart b/app/lib/pages/apps/update_app.dart index abdd6fcd6fa..08f4a475493 100644 --- a/app/lib/pages/apps/update_app.dart +++ b/app/lib/pages/apps/update_app.dart @@ -464,7 +464,7 @@ class _UpdateAppPageState extends State { ), ), child: GestureDetector( - onTap: !provider.isValid + onTap: !provider.isValid || !provider.hasChanges ? null : () { var isValid = provider.validateForm(); @@ -488,12 +488,12 @@ class _UpdateAppPageState extends State { ); } }, - child: Container( - padding: const EdgeInsets.all(12.0), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12.0), - color: provider.isValid ? Colors.white : Colors.grey.shade700, - ), + child: Container( + padding: const EdgeInsets.all(12.0), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.0), + color: provider.isValid && provider.hasChanges ? Colors.white : Colors.grey.shade700, + ), child: Text( context.l10n.updateApp, style: const TextStyle(color: Colors.black, fontSize: 16), From 2a53368968daea2d7a6b664332970c477483c279 Mon Sep 17 00:00:00 2001 From: syed-axonaio Date: Tue, 16 Jun 2026 16:33:12 +0530 Subject: [PATCH 2/2] fix: null-safe comparisons and capability identity check in hasDataChanged --- .../pages/apps/providers/add_app_provider.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/app/lib/pages/apps/providers/add_app_provider.dart b/app/lib/pages/apps/providers/add_app_provider.dart index d4ffb3983a1..43fb375ff5b 100644 --- a/app/lib/pages/apps/providers/add_app_provider.dart +++ b/app/lib/pages/apps/providers/add_app_provider.dart @@ -348,14 +348,17 @@ class AddAppProvider extends ChangeNotifier { if (appDescriptionController.text != app.description.decodeString) return true; if (makeAppPublic != !app.private) return true; if (appCategory != category) return true; - if (selectedCapabilities.length != app.capabilities.length) return true; + if (!listEquals( + selectedCapabilities.map((c) => c.id).toList()..sort(), + app.capabilities.map((c) => c.id).toList()..sort(), + )) return true; if (app.externalIntegration != null) { if (triggerEvent != app.externalIntegration!.triggersOn) return true; - if (webhookUrlController.text != app.externalIntegration!.webhookUrl) return true; - if (setupCompletedController.text != app.externalIntegration!.setupCompletedUrl) return true; - if (instructionsController.text != app.externalIntegration!.setupInstructionsFilePath) return true; - if (appHomeUrlController.text != app.externalIntegration!.appHomeUrl) return true; - if (chatToolsManifestUrlController.text != app.externalIntegration!.chatToolsManifestUrl) return true; + if (webhookUrlController.text != (app.externalIntegration!.webhookUrl ?? '')) return true; + if (setupCompletedController.text != (app.externalIntegration!.setupCompletedUrl ?? '')) return true; + if (instructionsController.text != (app.externalIntegration!.setupInstructionsFilePath ?? '')) return true; + if (appHomeUrlController.text != (app.externalIntegration!.appHomeUrl ?? '')) return true; + if (chatToolsManifestUrlController.text != (app.externalIntegration!.chatToolsManifestUrl ?? '')) return true; } if (chatPromptController.text != (app.chatPrompt ?? '').decodeString) return true; if (conversationPromptController.text != (app.conversationPrompt ?? '').decodeString) return true;