diff --git a/lib/models/update_available.dart b/lib/models/update_available.dart index ee766e0..c370e33 100644 --- a/lib/models/update_available.dart +++ b/lib/models/update_available.dart @@ -18,7 +18,6 @@ class UpdateAvailableData { final bool? canAutoupdate; final bool disabled; String? changelog; - bool? updateAvailable; UpdateAvailableData({ required this.currentVersion, @@ -28,7 +27,6 @@ class UpdateAvailableData { required this.canAutoupdate, required this.disabled, this.changelog, - this.updateAvailable }); factory UpdateAvailableData.fromJson(Map json) => UpdateAvailableData( @@ -39,7 +37,15 @@ class UpdateAvailableData { canAutoupdate: json["can_autoupdate"], disabled: json["disabled"], changelog: json["changelog"], - updateAvailable: json['update_available'] + ); + + factory UpdateAvailableData.fromJsonUpdate(Map json) => UpdateAvailableData( + currentVersion: json["current_version"], + newVersion: json["new_version"], + announcement: json["announcement"], + announcementUrl: json["announcement_url"], + canAutoupdate: json["can_autoupdate"], + disabled: json["disabled"], ); Map toJson() => { @@ -50,6 +56,5 @@ class UpdateAvailableData { "can_autoupdate": canAutoupdate, "disabled": disabled, "changelog": changelog, - "update_available": updateAvailable }; } diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index f558675..c745260 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -8,7 +8,6 @@ import 'package:adguard_home_manager/models/update_available.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/conversions.dart'; import 'package:adguard_home_manager/services/db/queries.dart'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/constants/enums.dart'; class ServersProvider with ChangeNotifier { @@ -18,6 +17,8 @@ class ServersProvider with ChangeNotifier { Server? _selectedServer; ApiClient? _apiClient; + bool _updatingServer = false; + final UpdateAvailable _updateAvailable = UpdateAvailable( loadStatus: LoadStatus.loading, data: null, @@ -39,6 +40,10 @@ class ServersProvider with ChangeNotifier { return _updateAvailable; } + bool get updatingServer { + return _updatingServer; + } + void setDbInstance(Database db) { _dbInstance = db; } @@ -70,6 +75,11 @@ class ServersProvider with ChangeNotifier { notifyListeners(); } + void setUpdatingServer(bool status) { + _updatingServer = status; + notifyListeners(); + } + Future createServer(Server server) async { final saved = await saveServerQuery(_dbInstance!, server); if (saved == null) { @@ -159,9 +169,8 @@ class ServersProvider with ChangeNotifier { void checkServerUpdatesAvailable({ required Server server, - bool? setValues }) async { - if (setValues == true) setUpdateAvailableLoadStatus(LoadStatus.loading, true); + setUpdateAvailableLoadStatus(LoadStatus.loading, true); final result = await _apiClient!.checkServerUpdates(); if (result['result'] == 'success') { UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']); @@ -169,40 +178,20 @@ class ServersProvider with ChangeNotifier { if (gitHubResult['result'] == 'success') { data.changelog = gitHubResult['body']; } - data.updateAvailable = data.newVersion != null - ? compareVersions( - currentVersion: data.currentVersion, - newVersion: data.newVersion!, - ) - : false; - if (setValues == true) { - setUpdateAvailableData(data); - } - else { - if (data.currentVersion == data.newVersion) setUpdateAvailableData(data); - } - if (setValues == true) setUpdateAvailableLoadStatus(LoadStatus.loaded, true); + setUpdateAvailableData(data); + setUpdateAvailableLoadStatus(LoadStatus.loaded, true); } else { - if (setValues == true) setUpdateAvailableLoadStatus(LoadStatus.error, true); - } - } - - void clearUpdateAvailable(Server server, String newCurrentVersion) { - if (_updateAvailable.data != null) { - _updateAvailable.data!.updateAvailable = null; - _updateAvailable.data!.currentVersion = newCurrentVersion; - notifyListeners(); + setUpdateAvailableLoadStatus(LoadStatus.error, true); } } Future initializateServer(Server server) async { final serverStatus = await _apiClient!.getServerStatus(); if (serverStatus['result'] == 'success') { - checkServerUpdatesAvailable( + checkServerUpdatesAvailable( // Do not await server: server, - setValues: true - ); // Do not await + ); } } @@ -245,15 +234,33 @@ class ServersProvider with ChangeNotifier { void recheckPeriodServerUpdated() { if (_selectedServer != null) { + setUpdatingServer(true); Server server = _selectedServer!; Timer.periodic( const Duration(seconds: 2), - (timer) { + (timer) async { if (_selectedServer != null && _selectedServer == server) { - checkServerUpdatesAvailable(server: server, setValues: false); + final result = await _apiClient!.checkServerUpdates(); + if (result['result'] == 'success') { + UpdateAvailableData data = UpdateAvailableData.fromJsonUpdate(result['data']); + if (data.currentVersion == data.newVersion) { + final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); + if (gitHubResult['result'] == 'success') { + data.changelog = gitHubResult['body']; + } + setUpdateAvailableData(data); + timer.cancel(); + setUpdatingServer(false); + } + } + else { + timer.cancel(); + setUpdatingServer(false); + } } else { timer.cancel(); + setUpdatingServer(false); } } ); diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index b0763f6..f3a08ba 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -188,8 +188,7 @@ class SettingsWidget extends StatelessWidget { title: AppLocalizations.of(context)!.updates, subtitle: AppLocalizations.of(context)!.updatesDescription, trailing: serversProvider.updateAvailable.data != null && - serversProvider.updateAvailable.data!.updateAvailable != null && - serversProvider.updateAvailable.data!.updateAvailable == true + serversProvider.updateAvailable.data!.canAutoupdate == true ? Container( width: 10, height: 10, diff --git a/lib/screens/settings/update_server/update.dart b/lib/screens/settings/update_server/update.dart index 78a8a0e..3467994 100644 --- a/lib/screens/settings/update_server/update.dart +++ b/lib/screens/settings/update_server/update.dart @@ -40,7 +40,6 @@ class UpdateScreen extends StatelessWidget { processModal.close(); if (result['result'] == 'success') { - serversProvider.clearUpdateAvailable(serversProvider.selectedServer!, serversProvider.updateAvailable.data!.newVersion!); serversProvider.recheckPeriodServerUpdated(); showSnacbkar( appConfigProvider: appConfigProvider, @@ -82,7 +81,6 @@ class UpdateScreen extends StatelessWidget { tooltip: AppLocalizations.of(context)!.checkUpdates, onPressed: () => serversProvider.checkServerUpdatesAvailable( server: serversProvider.selectedServer!, - setValues: true ) ), ], @@ -101,11 +99,9 @@ class UpdateScreen extends StatelessWidget { ], ) : Icon( - serversProvider.updateAvailable.data!.updateAvailable != null - ? serversProvider.updateAvailable.data!.updateAvailable == true - ? Icons.system_update_rounded - : Icons.system_security_update_good_rounded - : Icons.system_security_update_warning_rounded, + serversProvider.updateAvailable.data!.canAutoupdate == true + ? Icons.system_update_rounded + : Icons.system_security_update_good_rounded, size: 40, color: Theme.of(context).colorScheme.primary, ), @@ -113,11 +109,9 @@ class UpdateScreen extends StatelessWidget { Text( serversProvider.updateAvailable.loadStatus == LoadStatus.loading ? AppLocalizations.of(context)!.checkingUpdates - : serversProvider.updateAvailable.data!.updateAvailable != null - ? serversProvider.updateAvailable.data!.updateAvailable == true - ? AppLocalizations.of(context)!.updateAvailable - : AppLocalizations.of(context)!.serverUpdated - : AppLocalizations.of(context)!.unknownStatus, + : serversProvider.updateAvailable.data!.canAutoupdate == true + ? AppLocalizations.of(context)!.updateAvailable + : AppLocalizations.of(context)!.serverUpdated, style: const TextStyle( fontSize: 24, fontWeight: FontWeight.w400 @@ -131,7 +125,7 @@ class UpdateScreen extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text( - serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true + serversProvider.updateAvailable.data!.canAutoupdate == true ? AppLocalizations.of(context)!.newVersion : AppLocalizations.of(context)!.currentVersion, style: const TextStyle( @@ -140,11 +134,9 @@ class UpdateScreen extends StatelessWidget { ), const SizedBox(height: 4), Text( - serversProvider.updateAvailable.data!.updateAvailable != null - ? serversProvider.updateAvailable.data!.updateAvailable == true - ? serversProvider.updateAvailable.data!.newVersion ?? 'N/A' - : serversProvider.updateAvailable.data!.currentVersion - : "N/A", + serversProvider.updateAvailable.data!.canAutoupdate == true + ? serversProvider.updateAvailable.data!.newVersion ?? 'N/A' + : serversProvider.updateAvailable.data!.currentVersion, style: TextStyle( fontSize: 12, fontWeight: FontWeight.w700, @@ -157,11 +149,13 @@ class UpdateScreen extends StatelessWidget { FilledButton.icon( icon: const Icon(Icons.download_rounded), label: Text(AppLocalizations.of(context)!.updateNow), - onPressed: serversProvider.updateAvailable.data!.updateAvailable != null && serversProvider.updateAvailable.data!.updateAvailable == true - ? serversProvider.updateAvailable.data!.canAutoupdate != null && serversProvider.updateAvailable.data!.canAutoupdate == true - ? () => update() - : () => showAutoUpdateUnavailableModal() - : null + onPressed: serversProvider.updatingServer == true + ? null + : serversProvider.updateAvailable.data!.canAutoupdate == true + ? serversProvider.updateAvailable.data!.canAutoupdate != null && serversProvider.updateAvailable.data!.canAutoupdate == true + ? () => update() + : () => showAutoUpdateUnavailableModal() + : null ) ], ), @@ -178,7 +172,7 @@ class UpdateScreen extends StatelessWidget { Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Text( - "Changelog ${serversProvider.updateAvailable.data!.updateAvailable == true + "Changelog ${serversProvider.updateAvailable.data!.canAutoupdate == true ? serversProvider.updateAvailable.data!.newVersion : serversProvider.updateAvailable.data!.currentVersion}", style: TextStyle( diff --git a/lib/widgets/bottom_nav_bar.dart b/lib/widgets/bottom_nav_bar.dart index 8465844..366fe2c 100644 --- a/lib/widgets/bottom_nav_bar.dart +++ b/lib/widgets/bottom_nav_bar.dart @@ -66,8 +66,7 @@ class BottomNavBar extends StatelessWidget { if ( screen.name == 'settings' && serversProvider.updateAvailable.data != null && - serversProvider.updateAvailable.data!.updateAvailable != null && - serversProvider.updateAvailable.data!.updateAvailable == true + serversProvider.updateAvailable.data!.canAutoupdate == true ) Positioned( bottom: 0, right: -12, diff --git a/lib/widgets/servers_list/servers_list_item.dart b/lib/widgets/servers_list/servers_list_item.dart index 5d269d1..724be22 100644 --- a/lib/widgets/servers_list/servers_list_item.dart +++ b/lib/widgets/servers_list/servers_list_item.dart @@ -147,7 +147,6 @@ class _ServersListItemState extends State with SingleTickerProv ); serversProvider.checkServerUpdatesAvailable( server: server, - setValues: true ); statusProvider.setServerStatusLoad(LoadStatus.loaded); } diff --git a/lib/widgets/servers_list/servers_tile_item.dart b/lib/widgets/servers_list/servers_tile_item.dart index 7a8be69..c45b90e 100644 --- a/lib/widgets/servers_list/servers_tile_item.dart +++ b/lib/widgets/servers_list/servers_tile_item.dart @@ -114,7 +114,6 @@ class _ServersTileItemState extends State with SingleTickerProv ); serversProvider.checkServerUpdatesAvailable( server: server, - setValues: true ); statusProvider.setServerStatusLoad(LoadStatus.loaded); }