From 4a2d78e8cfb1c59c146be30e5a59b0a7bb5b7321 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Wed, 24 May 2023 13:51:22 +0200 Subject: [PATCH] Extracted server status stuff to a separate provider --- lib/functions/block_unblock_domain.dart | 6 +- lib/main.dart | 110 ++++++--- lib/models/server_status.dart | 13 +- lib/providers/clients_provider.dart | 13 + lib/providers/filters_provider.dart | 13 + lib/providers/logs_provider.dart | 11 +- lib/providers/servers_provider.dart | 227 ++++-------------- lib/providers/status_provider.dart | 194 +++++++++++++++ lib/screens/clients/added_list.dart | 10 +- lib/screens/clients/client_screen.dart | 6 +- lib/screens/clients/fab.dart | 8 +- lib/screens/clients/search_clients.dart | 10 +- lib/screens/filters/filters.dart | 8 +- lib/screens/home/appbar.dart | 13 +- lib/screens/home/combined_chart.dart | 58 ++--- lib/screens/home/fab.dart | 7 +- lib/screens/home/home.dart | 51 ++-- lib/screens/home/management_modal.dart | 62 ++--- lib/screens/home/server_status.dart | 6 +- lib/screens/home/top_items.dart | 14 +- lib/screens/logs/logs.dart | 8 +- .../settings/safe_search_settings.dart | 49 ++-- lib/screens/settings/settings.dart | 10 +- lib/screens/top_items/top_items.dart | 8 +- lib/screens/top_items/top_items_modal.dart | 6 +- lib/services/http_requests.dart | 2 +- lib/widgets/add_server_modal.dart | 13 +- lib/widgets/domain_options.dart | 6 +- .../servers_list/servers_list_item.dart | 23 +- .../servers_list/servers_tile_item.dart | 25 +- 30 files changed, 585 insertions(+), 405 deletions(-) create mode 100644 lib/providers/clients_provider.dart create mode 100644 lib/providers/filters_provider.dart create mode 100644 lib/providers/status_provider.dart diff --git a/lib/functions/block_unblock_domain.dart b/lib/functions/block_unblock_domain.dart index cc2c8ed..5b92659 100644 --- a/lib/functions/block_unblock_domain.dart +++ b/lib/functions/block_unblock_domain.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/models/filtering_status.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -12,6 +13,7 @@ import 'package:adguard_home_manager/services/http_requests.dart'; Future> blockUnblock(BuildContext context, String domain, String newStatus) async { final serversProvider = Provider.of(context, listen: false); + final statusProvider = Provider.of(context, listen: false); final appConfigProvider = Provider.of(context, listen: false); final ProcessModal processModal = ProcessModal(context: context); @@ -20,7 +22,7 @@ Future> blockUnblock(BuildContext context, String domain, S final rules = await getFilteringRules(server: serversProvider.selectedServer!); if (rules['result'] == 'success') { - FilteringStatus oldStatus = serversProvider.serverStatus.data!.filteringStatus; + FilteringStatus oldStatus = statusProvider.serverStatus!.filteringStatus; List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); if (newStatus == 'block') { newRules.add("||$domain^"); @@ -28,7 +30,7 @@ Future> blockUnblock(BuildContext context, String domain, S else if (newStatus == 'unblock') { newRules.add("@@||$domain^"); } - FilteringStatus newObj = serversProvider.serverStatus.data!.filteringStatus; + FilteringStatus newObj = statusProvider.serverStatus!.filteringStatus; newObj.userRules = newRules; serversProvider.setFilteringStatus(newObj); diff --git a/lib/main.dart b/lib/main.dart index e768f7d..388aff6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -17,14 +17,18 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/base.dart'; -import 'package:adguard_home_manager/classes/http_override.dart'; -import 'package:adguard_home_manager/services/db/database.dart'; -import 'package:adguard_home_manager/constants/colors.dart'; -import 'package:adguard_home_manager/config/globals.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/config/theme.dart'; +import 'package:adguard_home_manager/providers/clients_provider.dart'; +import 'package:adguard_home_manager/providers/filters_provider.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/constants/colors.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/config/globals.dart'; +import 'package:adguard_home_manager/config/theme.dart'; +import 'package:adguard_home_manager/classes/http_override.dart'; +import 'package:adguard_home_manager/services/db/database.dart'; void main() async { @@ -43,6 +47,9 @@ void main() async { AppConfigProvider appConfigProvider = AppConfigProvider(); ServersProvider serversProvider = ServersProvider(); + StatusProvider statusProvider = StatusProvider(); + ClientsProvider clientsProvider = ClientsProvider(); + FiltersProvider filtersProvider = FiltersProvider(); LogsProvider logsProvider = LogsProvider(); DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); @@ -68,11 +75,68 @@ void main() async { serversProvider.setDbInstance(dbData['dbInstance']); appConfigProvider.saveFromDb(dbData['dbInstance'], dbData['appConfig']); - serversProvider.saveFromDb(dbData['servers']); + final result = await serversProvider.saveFromDb(dbData['servers']); + if (result != null) { + if (result['success'] == true) { + statusProvider.setServerStatusData( + data: result['serverData'], + ); + statusProvider.setServerStatusLoad(LoadStatus.loaded); + } + else { + statusProvider.setServerStatusLoad(LoadStatus.error); + } + } PackageInfo appInfo = await PackageInfo.fromPlatform(); appConfigProvider.setAppInfo(appInfo); + void startApp() => runApp( + MultiProvider( + providers: [ + ChangeNotifierProvider( + create: ((context) => serversProvider) + ), + ChangeNotifierProvider( + create: ((context) => statusProvider) + ), + ChangeNotifierProvider( + create: ((context) => clientsProvider) + ), + ChangeNotifierProvider( + create: ((context) => logsProvider) + ), + ChangeNotifierProvider( + create: ((context) => filtersProvider) + ), + ChangeNotifierProvider( + create: ((context) => appConfigProvider) + ), + ChangeNotifierProxyProvider( + create: (context) => serversProvider, + update: (context, status, servers) => servers!..update(status), + ), + ChangeNotifierProxyProvider( + create: (context) => statusProvider, + update: (context, servers, status) => status!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => clientsProvider, + update: (context, servers, clients) => clients!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => logsProvider, + update: (context, servers, logs) => logs!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => filtersProvider, + update: (context, servers, filters) => filters!..update(servers), + ), + ], + child: const Main(), + ) + ); + if ( ( kReleaseMode && @@ -87,41 +151,11 @@ void main() async { options.dsn = dotenv.env['SENTRY_DSN']; options.sendDefaultPii = false; }, - appRunner: () => runApp( - MultiProvider( - providers: [ - ChangeNotifierProvider( - create: ((context) => serversProvider) - ), - ChangeNotifierProvider( - create: ((context) => appConfigProvider) - ), - ChangeNotifierProvider( - create: ((context) => logsProvider) - ), - ], - child: const Main(), - ) - ) + appRunner: () => startApp() ); } else { - runApp( - MultiProvider( - providers: [ - ChangeNotifierProvider( - create: ((context) => serversProvider) - ), - ChangeNotifierProvider( - create: ((context) => appConfigProvider) - ), - ChangeNotifierProvider( - create: ((context) => logsProvider) - ), - ], - child: const Main(), - ) - ); + startApp(); } } diff --git a/lib/models/server_status.dart b/lib/models/server_status.dart index 3d68399..b43dbd1 100644 --- a/lib/models/server_status.dart +++ b/lib/models/server_status.dart @@ -4,15 +4,6 @@ import 'package:adguard_home_manager/models/dns_statistics.dart'; import 'package:adguard_home_manager/models/filtering_status.dart'; class ServerStatus { - int loadStatus; - ServerStatusData? data; - - ServerStatus({ - required this.loadStatus, - this.data - }); -} -class ServerStatusData { final DnsStatistics stats; final List clients; final FilteringStatus filteringStatus; @@ -31,7 +22,7 @@ class ServerStatusData { bool? safeSearchYandex; bool? safeSearchYoutube; - ServerStatusData({ + ServerStatus({ required this.stats, required this.clients, required this.filteringStatus, @@ -51,7 +42,7 @@ class ServerStatusData { required this.safeSearchYoutube }); - factory ServerStatusData.fromJson(Map json) => ServerStatusData( + factory ServerStatus.fromJson(Map json) => ServerStatus( stats: DnsStatistics.fromJson(json['stats']), clients: json["clients"] != null ? List.from(json["clients"].map((x) => Client.fromJson(x))) : [], generalEnabled: json['status']['protection_enabled'], diff --git a/lib/providers/clients_provider.dart b/lib/providers/clients_provider.dart new file mode 100644 index 0000000..3d7e0ae --- /dev/null +++ b/lib/providers/clients_provider.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +import 'package:adguard_home_manager/providers/servers_provider.dart'; + +class ClientsProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? serversProvider) { + if (serversProvider != null) { + _serversProvider = serversProvider; + } + } +} \ No newline at end of file diff --git a/lib/providers/filters_provider.dart b/lib/providers/filters_provider.dart new file mode 100644 index 0000000..bb82913 --- /dev/null +++ b/lib/providers/filters_provider.dart @@ -0,0 +1,13 @@ +import 'package:flutter/material.dart'; + +import 'package:adguard_home_manager/providers/servers_provider.dart'; + +class FiltersProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? serversProvider) { + if (serversProvider != null) { + _serversProvider = serversProvider; + } + } +} \ No newline at end of file diff --git a/lib/providers/logs_provider.dart b/lib/providers/logs_provider.dart index db2619c..fdae694 100644 --- a/lib/providers/logs_provider.dart +++ b/lib/providers/logs_provider.dart @@ -1,10 +1,19 @@ -import 'package:adguard_home_manager/models/clients.dart'; import 'package:flutter/material.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; +import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/logs.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; class LogsProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? serversProvider) { + if (serversProvider != null) { + _serversProvider = serversProvider; + } + } + int _loadStatus = 0; LogsData? _logsData; List? _clients; diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index 6d8500c..decbb0a 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -9,26 +9,29 @@ import 'package:adguard_home_manager/models/filtering_status.dart'; import 'package:adguard_home_manager/models/clients_allowed_blocked.dart'; import 'package:adguard_home_manager/models/blocked_services.dart'; import 'package:adguard_home_manager/models/clients.dart'; -import 'package:adguard_home_manager/models/server_status.dart'; import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/models/update_available.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; -import 'package:adguard_home_manager/functions/time_server_disabled.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'; +import 'package:adguard_home_manager/providers/status_provider.dart'; class ServersProvider with ChangeNotifier { + StatusProvider? _statusProvider; + + update(StatusProvider? statusProvider) { + if (statusProvider != null) { + _statusProvider = statusProvider; + } + } + Database? _dbInstance; List _serversList = []; Server? _selectedServer; - final ServerStatus _serverStatus = ServerStatus( - loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error - data: null - ); // serverStatus != null means server is connected - List _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled + String? _serverVersion; final Clients _clients = Clients( loadStatus: LoadStatus.loading, @@ -78,14 +81,6 @@ class ServersProvider with ChangeNotifier { return _selectedServer; } - ServerStatus get serverStatus { - return _serverStatus; - } - - List get protectionsManagementProcess { - return _protectionsManagementProcess; - } - Clients get clients { return _clients; } @@ -144,16 +139,6 @@ class ServersProvider with ChangeNotifier { notifyListeners(); } - void setServerStatusData(ServerStatusData data) { - _serverStatus.data = data; - notifyListeners(); - } - - void setServerStatusLoad(int status) { - _serverStatus.loadStatus = status; - notifyListeners(); - } - void setClientsLoadStatus(LoadStatus status, bool notify) { _clients.loadStatus = status; if (notify == true) { @@ -226,7 +211,7 @@ class ServersProvider with ChangeNotifier { } void setFilteringProtectionStatus(bool status) { - _serverStatus.data!.filteringEnabled = status; + _statusProvider!.setFilteringStatus(status); _filtering.data!.enabled = status; notifyListeners(); } @@ -382,149 +367,6 @@ class ServersProvider with ChangeNotifier { } } - Future updateBlocking({ - required Server server, - required String block, - required bool newStatus, - int? time - }) async { - switch (block) { - case 'general': - _protectionsManagementProcess.add('general'); - notifyListeners(); - - final result = await updateGeneralProtection( - server: server, - enable: newStatus, - time: time - ); - - _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList(); - - if (result['result'] == 'success') { - _serverStatus.data!.generalEnabled = newStatus; - if (time != null) { - _serverStatus.data!.timeGeneralDisabled = time; - _serverStatus.data!.disabledUntil = generateTimeDeadline(time); - } - else { - _serverStatus.data!.timeGeneralDisabled = 0; - _serverStatus.data!.disabledUntil = null; - } - notifyListeners(); - return null; - } - else { - notifyListeners(); - return result['log']; - } - - case 'general_legacy': - _protectionsManagementProcess.add('general'); - notifyListeners(); - - final result = await updateGeneralProtectionLegacy(server, newStatus); - - _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList(); - - if (result['result'] == 'success') { - _serverStatus.data!.generalEnabled = newStatus; - notifyListeners(); - return null; - } - else { - notifyListeners(); - return result['log']; - } - - - case 'filtering': - _protectionsManagementProcess.add('filtering'); - notifyListeners(); - - final result = await updateFiltering( - server: server, - enable: newStatus, - ); - - _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'filtering').toList(); - - if (result['result'] == 'success') { - _serverStatus.data!.filteringEnabled = newStatus; - notifyListeners(); - return null; - } - else { - - notifyListeners(); - return result['log']; - } - - case 'safeSearch': - _protectionsManagementProcess.add('safeSearch'); - notifyListeners(); - - final result = serverVersionIsAhead( - currentVersion: serverStatus.data!.serverVersion, - referenceVersion: 'v0.107.28', - referenceVersionBeta: 'v0.108.0-b.33' - ) == true - ? await updateSafeSearchSettings(server: server, body: { 'enabled': newStatus }) - : await updateSafeSearchLegacy(server, newStatus); - - _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeSearch').toList(); - - if (result['result'] == 'success') { - _serverStatus.data!.safeSearchEnabled = newStatus; - notifyListeners(); - return null; - } - else { - notifyListeners(); - return result['log']; - } - - case 'safeBrowsing': - _protectionsManagementProcess.add('safeBrowsing'); - notifyListeners(); - - final result = await updateSafeBrowsing(server, newStatus); - - _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeBrowsing').toList(); - - if (result['result'] == 'success') { - _serverStatus.data!.safeBrowsingEnabled = newStatus; - notifyListeners(); - return null; - } - else { - notifyListeners(); - return result['log']; - } - - case 'parentalControl': - _protectionsManagementProcess.add('parentalControl'); - notifyListeners(); - - final result = await updateParentalControl(server, newStatus); - - _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'parentalControl').toList(); - - if (result['result'] == 'success') { - _serverStatus.data!.parentalControlEnabled = newStatus; - notifyListeners(); - return null; - } - else { - notifyListeners(); - return result['log']; - } - - default: - return false; - } - } - void checkServerUpdatesAvailable(Server server) async { setUpdateAvailableLoadStatus(LoadStatus.loading, true); final result = await checkServerUpdates(server: server); @@ -556,8 +398,26 @@ class ServersProvider with ChangeNotifier { } } - void saveFromDb(List>? data) async { + Future> initializateServer(Server server) async { + _selectedServer = server; + final serverStatus = await getServerStatus(server); + if (serverStatus['result'] == 'success') { + checkServerUpdatesAvailable(server); // Do not await + return { + "success": true, + "serverData": serverStatus['data'] + }; + } + else { + return { + "success": false + }; + } + } + + Future?> saveFromDb(List>? data) async { if (data != null) { + Server? defaultServer; for (var server in data) { final Server serverObj = Server( id: server['id'], @@ -574,20 +434,23 @@ class ServersProvider with ChangeNotifier { ); _serversList.add(serverObj); if (convertFromIntToBool(server['defaultServer']) == true) { - _selectedServer = serverObj; - _serverStatus.loadStatus = 0; - final serverStatus = await getServerStatus(serverObj); - if (serverStatus['result'] == 'success') { - _serverStatus.data = serverStatus['data']; - _serverStatus.loadStatus = 1; - checkServerUpdatesAvailable(serverObj); // Do not await - } - else { - _serverStatus.loadStatus = 2; - } + defaultServer = serverObj; } } + + notifyListeners(); + + if (defaultServer != null) { + final result = await initializateServer(defaultServer); + return result; + } + else { + return null; + } + } + else { + notifyListeners(); + return null; } - notifyListeners(); } } \ No newline at end of file diff --git a/lib/providers/status_provider.dart b/lib/providers/status_provider.dart new file mode 100644 index 0000000..26bdfe2 --- /dev/null +++ b/lib/providers/status_provider.dart @@ -0,0 +1,194 @@ +import 'package:flutter/material.dart'; + +import 'package:adguard_home_manager/models/server_status.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/functions/compare_versions.dart'; +import 'package:adguard_home_manager/functions/time_server_disabled.dart'; +import 'package:adguard_home_manager/models/server.dart'; +import 'package:adguard_home_manager/services/http_requests.dart'; + +class StatusProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? serversProvider) { + if (serversProvider != null) { + _serversProvider = serversProvider; + } + } + + LoadStatus _loadStatus = LoadStatus.loading; + ServerStatus? _serverStatus; // serverStatus != null means server is connected + List _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled + + LoadStatus get loadStatus { + return _loadStatus; + } + + ServerStatus? get serverStatus { + return _serverStatus; + } + + List get protectionsManagementProcess { + return _protectionsManagementProcess; + } + + void setServerStatusData({ + required ServerStatus data, + }) { + _serverStatus = data; + notifyListeners(); + } + + void setServerStatusLoad(LoadStatus status) { + _loadStatus = status; + notifyListeners(); + } + + Future updateBlocking({ + required Server server, + required String block, + required bool newStatus, + int? time + }) async { + switch (block) { + case 'general': + _protectionsManagementProcess.add('general'); + notifyListeners(); + + final result = await updateGeneralProtection( + server: server, + enable: newStatus, + time: time + ); + + _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList(); + + if (result['result'] == 'success') { + _serverStatus!.generalEnabled = newStatus; + if (time != null) { + _serverStatus!.timeGeneralDisabled = time; + _serverStatus!.disabledUntil = generateTimeDeadline(time); + } + else { + _serverStatus!.timeGeneralDisabled = 0; + _serverStatus!.disabledUntil = null; + } + notifyListeners(); + return null; + } + else { + notifyListeners(); + return result['log']; + } + + case 'general_legacy': + _protectionsManagementProcess.add('general'); + notifyListeners(); + + final result = await updateGeneralProtectionLegacy(server, newStatus); + + _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList(); + + if (result['result'] == 'success') { + _serverStatus!.generalEnabled = newStatus; + notifyListeners(); + return null; + } + else { + notifyListeners(); + return result['log']; + } + + + case 'filtering': + _protectionsManagementProcess.add('filtering'); + notifyListeners(); + + final result = await updateFiltering( + server: server, + enable: newStatus, + ); + + _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'filtering').toList(); + + if (result['result'] == 'success') { + _serverStatus!.filteringEnabled = newStatus; + notifyListeners(); + return null; + } + else { + + notifyListeners(); + return result['log']; + } + + case 'safeSearch': + _protectionsManagementProcess.add('safeSearch'); + notifyListeners(); + + final result = serverVersionIsAhead( + currentVersion: serverStatus!.serverVersion, + referenceVersion: 'v0.107.28', + referenceVersionBeta: 'v0.108.0-b.33' + ) == true + ? await updateSafeSearchSettings(server: server, body: { 'enabled': newStatus }) + : await updateSafeSearchLegacy(server, newStatus); + + _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeSearch').toList(); + + if (result['result'] == 'success') { + _serverStatus!.safeSearchEnabled = newStatus; + notifyListeners(); + return null; + } + else { + notifyListeners(); + return result['log']; + } + + case 'safeBrowsing': + _protectionsManagementProcess.add('safeBrowsing'); + notifyListeners(); + + final result = await updateSafeBrowsing(server, newStatus); + + _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeBrowsing').toList(); + + if (result['result'] == 'success') { + _serverStatus!.safeBrowsingEnabled = newStatus; + notifyListeners(); + return null; + } + else { + notifyListeners(); + return result['log']; + } + + case 'parentalControl': + _protectionsManagementProcess.add('parentalControl'); + notifyListeners(); + + final result = await updateParentalControl(server, newStatus); + + _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'parentalControl').toList(); + + if (result['result'] == 'success') { + _serverStatus!.parentalControlEnabled = newStatus; + notifyListeners(); + return null; + } + else { + notifyListeners(); + return result['log']; + } + + default: + return false; + } + } + + void setFilteringStatus(bool status) { + _serverStatus!.filteringEnabled = status; + } +} \ No newline at end of file diff --git a/lib/screens/clients/added_list.dart b/lib/screens/clients/added_list.dart index 43f3a44..cc535db 100644 --- a/lib/screens/clients/added_list.dart +++ b/lib/screens/clients/added_list.dart @@ -18,6 +18,7 @@ import 'package:adguard_home_manager/widgets/tab_content_list.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/maps_fns.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -77,6 +78,7 @@ class _AddedListState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -88,7 +90,7 @@ class _AddedListState extends State { final result = await postUpdateClient(server: serversProvider.selectedServer!, data: { 'name': client.name, 'data': serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == false @@ -168,7 +170,7 @@ class _AddedListState extends State { context: context, builder: (BuildContext context) => ClientScreen( onConfirm: confirmEditClient, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, onDelete: deleteClient, client: client, dialog: true, @@ -180,7 +182,7 @@ class _AddedListState extends State { fullscreenDialog: true, builder: (BuildContext context) => ClientScreen( onConfirm: confirmEditClient, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, onDelete: deleteClient, client: client, dialog: false, @@ -240,7 +242,7 @@ class _AddedListState extends State { onLongPress: openOptionsModal, onEdit: openClientModal, splitView: widget.splitView, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, ), noData: SizedBox( width: double.maxFinite, diff --git a/lib/screens/clients/client_screen.dart b/lib/screens/clients/client_screen.dart index 2e282f5..52bf1c1 100644 --- a/lib/screens/clients/client_screen.dart +++ b/lib/screens/clients/client_screen.dart @@ -11,6 +11,7 @@ import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/models/safe_search.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/models/clients.dart'; @@ -131,6 +132,7 @@ class _ClientScreenState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); void createClient() { final Client client = Client( @@ -506,7 +508,7 @@ class _ClientScreenState extends State { ), if ( serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true @@ -531,7 +533,7 @@ class _ClientScreenState extends State { ), if ( serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == false diff --git a/lib/screens/clients/fab.dart b/lib/screens/clients/fab.dart index 3c05c7e..a92a1d0 100644 --- a/lib/screens/clients/fab.dart +++ b/lib/screens/clients/fab.dart @@ -14,6 +14,7 @@ import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/functions/maps_fns.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -24,6 +25,7 @@ class ClientsFab extends StatelessWidget { Widget build(BuildContext context) { final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); + final statusProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -34,7 +36,7 @@ class ClientsFab extends StatelessWidget { final result = await postAddClient( server: serversProvider.selectedServer!, data: serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == false @@ -73,7 +75,7 @@ class ClientsFab extends StatelessWidget { context: context, builder: (BuildContext context) => ClientScreen( onConfirm: confirmAddClient, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, dialog: true, ) ); @@ -83,7 +85,7 @@ class ClientsFab extends StatelessWidget { fullscreenDialog: true, builder: (BuildContext context) => ClientScreen( onConfirm: confirmAddClient, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, dialog: false, ) )); diff --git a/lib/screens/clients/search_clients.dart b/lib/screens/clients/search_clients.dart index c9e72d8..7f2c3df 100644 --- a/lib/screens/clients/search_clients.dart +++ b/lib/screens/clients/search_clients.dart @@ -11,6 +11,7 @@ import 'package:adguard_home_manager/screens/clients/remove_client_modal.dart'; import 'package:adguard_home_manager/screens/clients/client_screen.dart'; import 'package:adguard_home_manager/screens/clients/options_modal.dart'; +import 'package:adguard_home_manager/widgets/section_label.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -19,7 +20,7 @@ import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/models/clients.dart'; -import 'package:adguard_home_manager/widgets/section_label.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; class SearchClients extends StatelessWidget { @@ -99,6 +100,7 @@ class _SearchClientsWidgetState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -189,7 +191,7 @@ class _SearchClientsWidgetState extends State { context: context, builder: (BuildContext context) => ClientScreen( onConfirm: confirmEditClient, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, onDelete: deleteClient, client: client, dialog: true, @@ -201,7 +203,7 @@ class _SearchClientsWidgetState extends State { fullscreenDialog: true, builder: (BuildContext context) => ClientScreen( onConfirm: confirmEditClient, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, onDelete: deleteClient, client: client, dialog: false, @@ -356,7 +358,7 @@ class _SearchClientsWidgetState extends State { Icons.search_rounded, size: 19, color: serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true diff --git a/lib/screens/filters/filters.dart b/lib/screens/filters/filters.dart index ce7e858..4107f1e 100644 --- a/lib/screens/filters/filters.dart +++ b/lib/screens/filters/filters.dart @@ -15,6 +15,7 @@ import 'package:adguard_home_manager/screens/filters/blocked_services_screen.dar import 'package:adguard_home_manager/screens/filters/update_interval_lists_modal.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/models/filtering.dart'; @@ -83,6 +84,7 @@ class _FiltersWidgetState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -158,20 +160,20 @@ class _FiltersWidgetState extends State { void enableDisableFiltering() async { ProcessModal processModal = ProcessModal(context: context); processModal.open( - serversProvider.serverStatus.data!.filteringEnabled == true + statusProvider.serverStatus!.filteringEnabled == true ? AppLocalizations.of(context)!.disableFiltering : AppLocalizations.of(context)!.enableFiltering ); final result = await updateFiltering( server: serversProvider.selectedServer!, - enable: !serversProvider.serverStatus.data!.filteringEnabled + enable: !statusProvider.serverStatus!.filteringEnabled ); processModal.close(); if (result['result'] == 'success') { - serversProvider.setFilteringProtectionStatus(!serversProvider.serverStatus.data!.filteringEnabled); + serversProvider.setFilteringProtectionStatus(!statusProvider.serverStatus!.filteringEnabled); showSnacbkar( appConfigProvider: appConfigProvider, diff --git a/lib/screens/home/appbar.dart b/lib/screens/home/appbar.dart index 58284d5..1ae88e1 100644 --- a/lib/screens/home/appbar.dart +++ b/lib/screens/home/appbar.dart @@ -4,6 +4,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/servers/servers.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -20,6 +22,7 @@ class HomeAppBar extends StatelessWidget { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final Server? server = serversProvider.selectedServer; @@ -38,14 +41,14 @@ class HomeAppBar extends StatelessWidget { centerTitle: false, forceElevated: innerBoxScrolled, leading: Icon( - serversProvider.selectedServer != null && serversProvider.serverStatus.data != null - ? serversProvider.serverStatus.data!.generalEnabled == true + serversProvider.selectedServer != null && statusProvider.serverStatus != null + ? statusProvider.serverStatus!.generalEnabled == true ? Icons.gpp_good_rounded : Icons.gpp_bad_rounded : Icons.shield, size: 30, - color: serversProvider.selectedServer != null && serversProvider.serverStatus.data != null - ? serversProvider.serverStatus.data!.generalEnabled == true + color: serversProvider.selectedServer != null && statusProvider.serverStatus != null + ? statusProvider.serverStatus!.generalEnabled == true ? appConfigProvider.useThemeColorForStatus ? Theme.of(context).colorScheme.primary : Colors.green @@ -95,7 +98,7 @@ class HomeAppBar extends StatelessWidget { ], ), ), - if (serversProvider.selectedServer != null && serversProvider.serverStatus.loadStatus == 1) PopupMenuItem( + if (serversProvider.selectedServer != null && statusProvider.loadStatus == LoadStatus.loaded) PopupMenuItem( onTap: () => openUrl("${server!.connectionMethod}://${server.domain}${server.path ?? ""}${server.port != null ? ':${server.port}' : ""}"), child: Row( children: [ diff --git a/lib/screens/home/combined_chart.dart b/lib/screens/home/combined_chart.dart index 9bd9d36..3de92f9 100644 --- a/lib/screens/home/combined_chart.dart +++ b/lib/screens/home/combined_chart.dart @@ -7,7 +7,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/combined_line_chart.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; class CombinedChartData { @@ -51,56 +51,56 @@ class CombinedHomeChart extends StatelessWidget { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; - if (serversProvider.serverStatus.data != null) { + if (statusProvider.serverStatus != null) { final data = CombinedChartData( totalQueries: CombinedChartItem( label: AppLocalizations.of(context)!.dnsQueries, color: Colors.blue, - data: serversProvider.serverStatus.data!.stats.dnsQueries + data: statusProvider.serverStatus!.stats.dnsQueries ), blockedFilters: appConfigProvider.hideZeroValues == true - ? removeZero(serversProvider.serverStatus.data!.stats.blockedFiltering) != null + ? removeZero(statusProvider.serverStatus!.stats.blockedFiltering) != null ? CombinedChartItem( label: AppLocalizations.of(context)!.blockedFilters, color: Colors.red, - data: serversProvider.serverStatus.data!.stats.blockedFiltering + data: statusProvider.serverStatus!.stats.blockedFiltering ) : null : CombinedChartItem( label: AppLocalizations.of(context)!.blockedFilters, color: Colors.red, - data: serversProvider.serverStatus.data!.stats.blockedFiltering + data: statusProvider.serverStatus!.stats.blockedFiltering ) , replacedSafeBrowsing: appConfigProvider.hideZeroValues == true - ? removeZero(serversProvider.serverStatus.data!.stats.replacedSafebrowsing) != null + ? removeZero(statusProvider.serverStatus!.stats.replacedSafebrowsing) != null ? CombinedChartItem( label: AppLocalizations.of(context)!.malwarePhisingBlocked, color: Colors.green, - data: serversProvider.serverStatus.data!.stats.replacedSafebrowsing + data: statusProvider.serverStatus!.stats.replacedSafebrowsing ) : null : CombinedChartItem( label: AppLocalizations.of(context)!.malwarePhisingBlocked, color: Colors.green, - data: serversProvider.serverStatus.data!.stats.replacedSafebrowsing + data: statusProvider.serverStatus!.stats.replacedSafebrowsing ) , replacedParental: appConfigProvider.hideZeroValues == true - ? removeZero(serversProvider.serverStatus.data!.stats.replacedParental) != null + ? removeZero(statusProvider.serverStatus!.stats.replacedParental) != null ? CombinedChartItem( label: AppLocalizations.of(context)!.blockedAdultWebsites, color: Colors.orange, - data: serversProvider.serverStatus.data!.stats.replacedParental + data: statusProvider.serverStatus!.stats.replacedParental ) : null : CombinedChartItem( label: AppLocalizations.of(context)!.blockedAdultWebsites, color: Colors.orange, - data: serversProvider.serverStatus.data!.stats.replacedParental + data: statusProvider.serverStatus!.stats.replacedParental ) , ); @@ -184,29 +184,29 @@ class CombinedHomeChart extends StatelessWidget { legend( label: data.totalQueries.label, color: data.totalQueries.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numDnsQueries, Platform.localeName), - secondaryValue: "${doubleFormat(serversProvider.serverStatus.data!.stats.avgProcessingTime*1000, Platform.localeName)} ms", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numDnsQueries, Platform.localeName), + secondaryValue: "${doubleFormat(statusProvider.serverStatus!.stats.avgProcessingTime*1000, Platform.localeName)} ms", ), const SizedBox(height: 16), if (data.blockedFilters != null) legend( label: data.blockedFilters!.label, color: data.blockedFilters!.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numBlockedFiltering, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numBlockedFiltering/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numBlockedFiltering, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numBlockedFiltering/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", ), const SizedBox(height: 16), if (data.replacedSafeBrowsing != null) legend( label: data.replacedSafeBrowsing!.label, color: data.replacedSafeBrowsing!.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numReplacedSafebrowsing, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numReplacedSafebrowsing/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", ), const SizedBox(height: 16), if (data.replacedParental != null) legend( label: data.replacedParental!.label, color: data.replacedParental!.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numReplacedParental, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedParental/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numReplacedParental, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numReplacedParental/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", ), ], ), @@ -247,29 +247,29 @@ class CombinedHomeChart extends StatelessWidget { legend( label: data.totalQueries.label, color: data.totalQueries.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numDnsQueries, Platform.localeName), - secondaryValue: "${doubleFormat(serversProvider.serverStatus.data!.stats.avgProcessingTime*1000, Platform.localeName)} ms", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numDnsQueries, Platform.localeName), + secondaryValue: "${doubleFormat(statusProvider.serverStatus!.stats.avgProcessingTime*1000, Platform.localeName)} ms", ), const SizedBox(height: 16), if (data.blockedFilters != null) legend( label: data.blockedFilters!.label, color: data.blockedFilters!.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numBlockedFiltering, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numBlockedFiltering/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numBlockedFiltering, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numBlockedFiltering/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", ), const SizedBox(height: 16), if (data.replacedSafeBrowsing != null) legend( label: data.replacedSafeBrowsing!.label, color: data.replacedSafeBrowsing!.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numReplacedSafebrowsing, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numReplacedSafebrowsing/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", ), const SizedBox(height: 16), if (data.replacedParental != null) legend( label: data.replacedParental!.label, color: data.replacedParental!.color, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numReplacedParental, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedParental/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numReplacedParental, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numReplacedParental/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", ), const SizedBox(height: 16), ], diff --git a/lib/screens/home/fab.dart b/lib/screens/home/fab.dart index 1369535..0e7db97 100644 --- a/lib/screens/home/fab.dart +++ b/lib/screens/home/fab.dart @@ -3,14 +3,15 @@ import 'package:flutter/material.dart'; import 'package:adguard_home_manager/screens/home/management_modal.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; class HomeFab extends StatelessWidget { const HomeFab({Key? key}) : super(key: key); @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -35,7 +36,7 @@ class HomeFab extends StatelessWidget { } } - return serversProvider.serverStatus.loadStatus == 1 + return statusProvider.loadStatus == LoadStatus.loaded ? FloatingActionButton( onPressed: openManagementBottomSheet, child: const Icon(Icons.shield_rounded), diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index 9626130..31912e9 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -15,6 +15,8 @@ import 'package:adguard_home_manager/screens/home/top_items.dart'; import 'package:adguard_home_manager/screens/home/chart.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; @@ -55,6 +57,7 @@ class _HomeState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -109,7 +112,7 @@ class _HomeState extends State { List listItems() { return [ - ServerStatus(serverStatus: serversProvider.serverStatus.data!), + ServerStatusWidget(serverStatus: statusProvider.serverStatus!), Padding( padding: const EdgeInsets.symmetric(horizontal: 16), child: Divider( @@ -124,40 +127,40 @@ class _HomeState extends State { FractionallySizedBox( widthFactor: width > 700 ? 0.5 : 1, child: HomeChart( - data: serversProvider.serverStatus.data!.stats.dnsQueries, + data: statusProvider.serverStatus!.stats.dnsQueries, label: AppLocalizations.of(context)!.dnsQueries, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numDnsQueries, Platform.localeName), - secondaryValue: "${doubleFormat(serversProvider.serverStatus.data!.stats.avgProcessingTime*1000, Platform.localeName)} ms", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numDnsQueries, Platform.localeName), + secondaryValue: "${doubleFormat(statusProvider.serverStatus!.stats.avgProcessingTime*1000, Platform.localeName)} ms", color: Colors.blue, ), ), FractionallySizedBox( widthFactor: width > 700 ? 0.5 : 1, child: HomeChart( - data: serversProvider.serverStatus.data!.stats.blockedFiltering, + data: statusProvider.serverStatus!.stats.blockedFiltering, label: AppLocalizations.of(context)!.blockedFilters, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numBlockedFiltering, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numBlockedFiltering/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numBlockedFiltering, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numBlockedFiltering/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", color: Colors.red, ), ), FractionallySizedBox( widthFactor: width > 700 ? 0.5 : 1, child: HomeChart( - data: serversProvider.serverStatus.data!.stats.replacedSafebrowsing, + data: statusProvider.serverStatus!.stats.replacedSafebrowsing, label: AppLocalizations.of(context)!.malwarePhisingBlocked, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedSafebrowsing/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numReplacedSafebrowsing, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numReplacedSafebrowsing/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", color: Colors.green, ), ), FractionallySizedBox( widthFactor: width > 700 ? 0.5 : 1, child: HomeChart( - data: serversProvider.serverStatus.data!.stats.replacedParental, + data: statusProvider.serverStatus!.stats.replacedParental, label: AppLocalizations.of(context)!.blockedAdultWebsites, - primaryValue: intFormat(serversProvider.serverStatus.data!.stats.numReplacedParental, Platform.localeName), - secondaryValue: "${serversProvider.serverStatus.data!.stats.numDnsQueries > 0 ? doubleFormat((serversProvider.serverStatus.data!.stats.numReplacedParental/serversProvider.serverStatus.data!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", + primaryValue: intFormat(statusProvider.serverStatus!.stats.numReplacedParental, Platform.localeName), + secondaryValue: "${statusProvider.serverStatus!.stats.numDnsQueries > 0 ? doubleFormat((statusProvider.serverStatus!.stats.numReplacedParental/statusProvider.serverStatus!.stats.numDnsQueries)*100, Platform.localeName) : 0}%", color: Colors.orange, ), ), @@ -172,7 +175,7 @@ class _HomeState extends State { if (width <= 700) ...[ TopItems( label: AppLocalizations.of(context)!.topQueriedDomains, - data: serversProvider.serverStatus.data!.stats.topQueriedDomains, + data: statusProvider.serverStatus!.stats.topQueriedDomains, type: 'topQueriedDomains', ), Padding( @@ -187,7 +190,7 @@ class _HomeState extends State { TopItems( label: AppLocalizations.of(context)!.topBlockedDomains, - data: serversProvider.serverStatus.data!.stats.topBlockedDomains, + data: statusProvider.serverStatus!.stats.topBlockedDomains, type: 'topBlockedDomains', ), Padding( @@ -201,7 +204,7 @@ class _HomeState extends State { TopItems( label: AppLocalizations.of(context)!.topClients, - data: serversProvider.serverStatus.data!.stats.topClients, + data: statusProvider.serverStatus!.stats.topClients, type: 'topClients', clients: true, ), @@ -219,7 +222,7 @@ class _HomeState extends State { ), child: TopItems( label: AppLocalizations.of(context)!.topQueriedDomains, - data: serversProvider.serverStatus.data!.stats.topQueriedDomains, + data: statusProvider.serverStatus!.stats.topQueriedDomains, type: 'topQueriedDomains', ), ), @@ -232,7 +235,7 @@ class _HomeState extends State { ), child: TopItems( label: AppLocalizations.of(context)!.topBlockedDomains, - data: serversProvider.serverStatus.data!.stats.topBlockedDomains, + data: statusProvider.serverStatus!.stats.topBlockedDomains, type: 'topBlockedDomains', ), ), @@ -245,7 +248,7 @@ class _HomeState extends State { ), child: TopItems( label: AppLocalizations.of(context)!.topClients, - data: serversProvider.serverStatus.data!.stats.topClients, + data: statusProvider.serverStatus!.stats.topClients, type: 'topClients', ), ), @@ -279,7 +282,9 @@ class _HomeState extends State { onRefresh: () async { final result = await getServerStatus(serversProvider.selectedServer!); if (result['result'] == 'success') { - serversProvider.setServerStatusData(result['data']); + statusProvider.setServerStatusData( + data: result['data'] + ); } else { appConfigProvider.addLog(result['log']); @@ -295,13 +300,13 @@ class _HomeState extends State { SliverOverlapInjector( handle: NestedScrollView.sliverOverlapAbsorberHandleFor(context), ), - if (serversProvider.serverStatus.loadStatus == 0) SliverFillRemaining( + if (statusProvider.loadStatus == LoadStatus.loading) SliverFillRemaining( child: loading(), ), - if (serversProvider.serverStatus.loadStatus == 1) SliverList.list( + if (statusProvider.loadStatus == LoadStatus.loaded) SliverList.list( children: listItems() ), - if (serversProvider.serverStatus.loadStatus == 2) SliverFillRemaining( + if (statusProvider.loadStatus == LoadStatus.error) SliverFillRemaining( child: loadError(), ), ], diff --git a/lib/screens/home/management_modal.dart b/lib/screens/home/management_modal.dart index 9781206..5329d3c 100644 --- a/lib/screens/home/management_modal.dart +++ b/lib/screens/home/management_modal.dart @@ -10,6 +10,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/functions/time_server_disabled.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -74,6 +75,7 @@ class _ManagementModalState extends State with SingleTickerProv @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); void startTimer(DateTime deadline) { @@ -92,7 +94,9 @@ class _ManagementModalState extends State with SingleTickerProv }); final result = await getServerStatus(serversProvider.selectedServer!); if (result['result'] == 'success') { - serversProvider.setServerStatusData(result['data']); + statusProvider.setServerStatusData( + data: result['data'] + ); } } else { setState(() { @@ -104,16 +108,16 @@ class _ManagementModalState extends State with SingleTickerProv } if ( - serversProvider.serverStatus.data != null && - serversProvider.serverStatus.data!.disabledUntil != null && - serversProvider.serverStatus.data!.disabledUntil != currentDeadline + statusProvider.serverStatus != null && + statusProvider.serverStatus!.disabledUntil != null && + statusProvider.serverStatus!.disabledUntil != currentDeadline ) { - startTimer(serversProvider.serverStatus.data!.disabledUntil!); + startTimer(statusProvider.serverStatus!.disabledUntil!); } if ( - serversProvider.serverStatus.data != null && - serversProvider.serverStatus.data!.generalEnabled == true + statusProvider.serverStatus != null && + statusProvider.serverStatus!.generalEnabled == true ) { setState(() { start = 0; @@ -128,7 +132,7 @@ class _ManagementModalState extends State with SingleTickerProv required String filter, int? time }) async { - final result = await serversProvider.updateBlocking( + final result = await statusProvider.updateBlocking( server: serversProvider.selectedServer!, block: filter, newStatus: value, @@ -164,7 +168,7 @@ class _ManagementModalState extends State with SingleTickerProv child: Icon( Icons.keyboard_arrow_down_rounded, size: 26, - color: serversProvider.serverStatus.data!.generalEnabled == true + color: statusProvider.serverStatus!.generalEnabled == true ? Theme.of(context).colorScheme.onSurfaceVariant : Colors.grey, ), @@ -180,7 +184,7 @@ class _ManagementModalState extends State with SingleTickerProv fontSize: 18, ), ), - if (serversProvider.serverStatus.data!.timeGeneralDisabled > 0) ...[ + if (statusProvider.serverStatus!.timeGeneralDisabled > 0) ...[ const SizedBox(height: 2), if (currentDeadline != null) Text( "${AppLocalizations.of(context)!.remainingTime}: ${generateRemainingTimeString(currentDeadline!.difference(DateTime.now()))}" @@ -191,8 +195,8 @@ class _ManagementModalState extends State with SingleTickerProv ], ), Switch( - value: serversProvider.serverStatus.data!.generalEnabled, - onChanged: serversProvider.protectionsManagementProcess.contains('general') == false + value: statusProvider.serverStatus!.generalEnabled, + onChanged: statusProvider.protectionsManagementProcess.contains('general') == false ? (value) { if (value == false && expandableController.expanded == true && legacyMode == false) { expandableController.toggle(); @@ -216,35 +220,35 @@ class _ManagementModalState extends State with SingleTickerProv children: [ ActionChip( label: Text(AppLocalizations.of(context)!.seconds(30)), - onPressed: serversProvider.protectionsManagementProcess.contains('general') == false && serversProvider.serverStatus.data!.generalEnabled == true + onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => disableWithCountdown(29000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.minute(1)), - onPressed: serversProvider.protectionsManagementProcess.contains('general') == false && serversProvider.serverStatus.data!.generalEnabled == true + onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => disableWithCountdown(59000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.minutes(10)), - onPressed: serversProvider.protectionsManagementProcess.contains('general') == false && serversProvider.serverStatus.data!.generalEnabled == true + onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => disableWithCountdown(599000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.hour(1)), - onPressed: serversProvider.protectionsManagementProcess.contains('general') == false && serversProvider.serverStatus.data!.generalEnabled == true + onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => disableWithCountdown(3599000) : null, ), const SizedBox(width: 8), ActionChip( label: Text(AppLocalizations.of(context)!.hours(24)), - onPressed: serversProvider.protectionsManagementProcess.contains('general') == false && serversProvider.serverStatus.data!.generalEnabled == true + onPressed: statusProvider.protectionsManagementProcess.contains('general') == false && statusProvider.serverStatus!.generalEnabled == true ? () => disableWithCountdown(86399000) : null, ), @@ -256,7 +260,7 @@ class _ManagementModalState extends State with SingleTickerProv return Padding( padding: const EdgeInsets.symmetric(horizontal: 24), child: serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true @@ -266,7 +270,7 @@ class _ManagementModalState extends State with SingleTickerProv color: Colors.transparent, borderRadius: BorderRadius.circular(28), child: InkWell( - onTap: serversProvider.serverStatus.data!.generalEnabled == true && !serversProvider.protectionsManagementProcess.contains('general') + onTap: statusProvider.serverStatus!.generalEnabled == true && !statusProvider.protectionsManagementProcess.contains('general') ? () => expandableController.toggle() : null, borderRadius: BorderRadius.circular(28), @@ -301,9 +305,9 @@ class _ManagementModalState extends State with SingleTickerProv color: Colors.transparent, borderRadius: BorderRadius.circular(28), child: InkWell( - onTap: serversProvider.protectionsManagementProcess.contains('general') == false + onTap: statusProvider.protectionsManagementProcess.contains('general') == false ? () => updateBlocking( - value: !serversProvider.serverStatus.data!.generalEnabled, + value: !statusProvider.serverStatus!.generalEnabled, filter: 'general_legacy' ) : null, borderRadius: BorderRadius.circular(28), @@ -408,30 +412,30 @@ class _ManagementModalState extends State with SingleTickerProv smallSwitch( AppLocalizations.of(context)!.ruleFiltering, Icons.filter_list_rounded, - serversProvider.serverStatus.data!.filteringEnabled, + statusProvider.serverStatus!.filteringEnabled, (value) => updateBlocking(value: value, filter: 'filtering'), - serversProvider.protectionsManagementProcess.contains('filtering') + statusProvider.protectionsManagementProcess.contains('filtering') ), smallSwitch( AppLocalizations.of(context)!.safeBrowsing, Icons.vpn_lock_rounded, - serversProvider.serverStatus.data!.safeBrowsingEnabled, + statusProvider.serverStatus!.safeBrowsingEnabled, (value) => updateBlocking(value: value, filter: 'safeBrowsing'), - serversProvider.protectionsManagementProcess.contains('safeBrowsing') + statusProvider.protectionsManagementProcess.contains('safeBrowsing') ), smallSwitch( AppLocalizations.of(context)!.parentalFiltering, Icons.block, - serversProvider.serverStatus.data!.parentalControlEnabled, + statusProvider.serverStatus!.parentalControlEnabled, (value) => updateBlocking(value: value, filter: 'parentalControl'), - serversProvider.protectionsManagementProcess.contains('parentalControl') + statusProvider.protectionsManagementProcess.contains('parentalControl') ), smallSwitch( AppLocalizations.of(context)!.safeSearch, Icons.search_rounded, - serversProvider.serverStatus.data!.safeSearchEnabled, + statusProvider.serverStatus!.safeSearchEnabled, (value) => updateBlocking(value: value, filter: 'safeSearch'), - serversProvider.protectionsManagementProcess.contains('safeSearch') + statusProvider.protectionsManagementProcess.contains('safeSearch') ), ]; } diff --git a/lib/screens/home/server_status.dart b/lib/screens/home/server_status.dart index 2a52889..c130564 100644 --- a/lib/screens/home/server_status.dart +++ b/lib/screens/home/server_status.dart @@ -5,10 +5,10 @@ import 'package:adguard_home_manager/screens/home/status_box.dart'; import 'package:adguard_home_manager/models/server_status.dart'; -class ServerStatus extends StatelessWidget { - final ServerStatusData serverStatus; +class ServerStatusWidget extends StatelessWidget { + final ServerStatus serverStatus; - const ServerStatus({ + const ServerStatusWidget({ Key? key, required this.serverStatus, }) : super(key: key); diff --git a/lib/screens/home/top_items.dart b/lib/screens/home/top_items.dart index e956409..04f8851 100644 --- a/lib/screens/home/top_items.dart +++ b/lib/screens/home/top_items.dart @@ -13,6 +13,7 @@ import 'package:adguard_home_manager/widgets/options_modal.dart'; import 'package:adguard_home_manager/screens/top_items/top_items.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/models/menu_option.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; @@ -37,6 +38,7 @@ class TopItems extends StatelessWidget { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final logsProvider = Provider.of(context); @@ -61,7 +63,7 @@ class TopItems extends StatelessWidget { final rules = await getFilteringRules(server: serversProvider.selectedServer!); if (rules['result'] == 'success') { - FilteringStatus oldStatus = serversProvider.serverStatus.data!.filteringStatus; + FilteringStatus oldStatus = statusProvider.serverStatus!.filteringStatus; List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); if (newStatus == 'block') { @@ -70,7 +72,7 @@ class TopItems extends StatelessWidget { else if (newStatus == 'unblock') { newRules.add("@@||$domain^"); } - FilteringStatus newObj = serversProvider.serverStatus.data!.filteringStatus; + FilteringStatus newObj = statusProvider.serverStatus!.filteringStatus; newObj.userRules = newRules; serversProvider.setFilteringStatus(newObj); @@ -154,7 +156,7 @@ class TopItems extends StatelessWidget { String? name; if (clients != null && clients == true) { try { - name = serversProvider.serverStatus.data!.clients.firstWhere((c) => c.ids.contains(item.keys.toList()[0])).name; + name = statusProvider.serverStatus!.clients.firstWhere((c) => c.ids.contains(item.keys.toList()[0])).name; } catch (e) { // ---- // } @@ -241,13 +243,13 @@ class TopItems extends StatelessWidget { List> generateData() { switch (type) { case 'topQueriedDomains': - return serversProvider.serverStatus.data!.stats.topQueriedDomains; + return statusProvider.serverStatus!.stats.topQueriedDomains; case 'topBlockedDomains': - return serversProvider.serverStatus.data!.stats.topBlockedDomains; + return statusProvider.serverStatus!.stats.topBlockedDomains; case 'topClients': - return serversProvider.serverStatus.data!.stats.topClients; + return statusProvider.serverStatus!.stats.topClients; default: return []; diff --git a/lib/screens/logs/logs.dart b/lib/screens/logs/logs.dart index c88cd0e..7a6afd6 100644 --- a/lib/screens/logs/logs.dart +++ b/lib/screens/logs/logs.dart @@ -15,6 +15,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -190,6 +191,7 @@ class _LogsWidgetState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final logsProvider = Provider.of(context); @@ -200,7 +202,7 @@ class _LogsWidgetState extends State { processModal.open(AppLocalizations.of(context)!.updatingSettings); final result = serverVersionIsAhead( - currentVersion: widget.serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true @@ -442,7 +444,7 @@ class _LogsWidgetState extends State { onConfirm: updateConfig, onClear: clearQueries, dialog: true, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, ), barrierDismissible: false ) @@ -454,7 +456,7 @@ class _LogsWidgetState extends State { onConfirm: updateConfig, onClear: clearQueries, dialog: false, - serverVersion: serversProvider.serverStatus.data!.serverVersion, + serverVersion: statusProvider.serverStatus!.serverVersion, ), backgroundColor: Colors.transparent, isScrollControlled: true diff --git a/lib/screens/settings/safe_search_settings.dart b/lib/screens/settings/safe_search_settings.dart index 7dbbbfc..986e7b7 100644 --- a/lib/screens/settings/safe_search_settings.dart +++ b/lib/screens/settings/safe_search_settings.dart @@ -7,6 +7,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/custom_checkbox_list_tile.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/models/server_status.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -19,10 +21,12 @@ class SafeSearchSettingsScreen extends StatelessWidget { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProviuder = Provider.of(context); final appConfigProvider = Provider.of(context); return SafeSearchSettingsScreenWidget( serversProvider: serversProvider, + statusProvider: statusProviuder, appConfigProvider: appConfigProvider, ); } @@ -30,11 +34,13 @@ class SafeSearchSettingsScreen extends StatelessWidget { class SafeSearchSettingsScreenWidget extends StatefulWidget { final ServersProvider serversProvider; + final StatusProvider statusProvider; final AppConfigProvider appConfigProvider; const SafeSearchSettingsScreenWidget({ Key? key, required this.serversProvider, + required this.statusProvider, required this.appConfigProvider }) : super(key: key); @@ -56,8 +62,10 @@ class _SafeSearchSettingsScreenWidgetState extends State(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); void saveConfig() async { @@ -118,7 +127,7 @@ class _SafeSearchSettingsScreenWidgetState extends State saveConfig() : null, icon: const Icon(Icons.save_rounded), diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 8565e2f..4586b28 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -27,6 +27,7 @@ import 'package:adguard_home_manager/constants/strings.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/constants/urls.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -67,8 +68,9 @@ class SettingsWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final appConfigProvider = Provider.of(context); final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -129,10 +131,10 @@ class SettingsWidget extends StatelessWidget { ], body: ListView( children: [ - if (serversProvider.selectedServer != null && serversProvider.serverStatus.data != null) ...[ + if (serversProvider.selectedServer != null && statusProvider.serverStatus != null) ...[ SectionLabel(label: AppLocalizations.of(context)!.serverSettings), if (serverVersionIsAhead( - currentVersion: serversProvider.serverStatus.data!.serverVersion, + currentVersion: statusProvider.serverStatus!.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true) settingsTile( @@ -217,7 +219,7 @@ class SettingsWidget extends StatelessWidget { icon: Icons.storage_rounded, title: AppLocalizations.of(context)!.servers, subtitle: serversProvider.selectedServer != null - ? serversProvider.serverStatus.data != null + ? statusProvider.serverStatus != null ? "${AppLocalizations.of(context)!.connectedTo} ${serversProvider.selectedServer!.name}" : "${AppLocalizations.of(context)!.selectedServer} ${serversProvider.selectedServer!.name}" : AppLocalizations.of(context)!.noServerSelected, diff --git a/lib/screens/top_items/top_items.dart b/lib/screens/top_items/top_items.dart index 643e8be..db3584a 100644 --- a/lib/screens/top_items/top_items.dart +++ b/lib/screens/top_items/top_items.dart @@ -12,6 +12,7 @@ import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -58,6 +59,7 @@ class _TopItemsScreenState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final logsProvider = Provider.of(context); @@ -132,7 +134,9 @@ class _TopItemsScreenState extends State { onRefresh: () async { final result = await getServerStatus(serversProvider.selectedServer!); if (result['result'] == 'success') { - serversProvider.setServerStatusData(result['data']); + statusProvider.setServerStatusData( + data: result['data'] + ); } else { appConfigProvider.addLog(result['log']); @@ -150,7 +154,7 @@ class _TopItemsScreenState extends State { String? name; if (widget.isClient != null && widget.isClient == true) { try { - name = serversProvider.serverStatus.data!.clients.firstWhere((c) => c.ids.contains(screenData[index].keys.toList()[0])).name; + name = statusProvider.serverStatus!.clients.firstWhere((c) => c.ids.contains(screenData[index].keys.toList()[0])).name; } catch (e) { // ---- // } diff --git a/lib/screens/top_items/top_items_modal.dart b/lib/screens/top_items/top_items_modal.dart index 3c98679..845459a 100644 --- a/lib/screens/top_items/top_items_modal.dart +++ b/lib/screens/top_items/top_items_modal.dart @@ -13,8 +13,8 @@ import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class TopItemsModal extends StatefulWidget { final String type; @@ -55,7 +55,7 @@ class _TopItemsModalState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final logsProvider = Provider.of(context); @@ -122,7 +122,7 @@ class _TopItemsModalState extends State { String? name; if (widget.isClient != null && widget.isClient == true) { try { - name = serversProvider.serverStatus.data!.clients.firstWhere((c) => c.ids.contains(screenData[index].keys.toList()[0])).name; + name = statusProvider.serverStatus!.clients.firstWhere((c) => c.ids.contains(screenData[index].keys.toList()[0])).name; } catch (e) { // ---- // } diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index 35b542f..25a15ea 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -335,7 +335,7 @@ Future getServerStatus(Server server) async { }; return { 'result': 'success', - 'data': ServerStatusData.fromJson(mappedData) + 'data': ServerStatus.fromJson(mappedData) }; } else { diff --git a/lib/widgets/add_server_modal.dart b/lib/widgets/add_server_modal.dart index 70ca410..d299cf4 100644 --- a/lib/widgets/add_server_modal.dart +++ b/lib/widgets/add_server_modal.dart @@ -7,6 +7,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/functions/base64.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/app_log.dart'; @@ -217,6 +219,7 @@ class _AddServerModalState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context, listen: false); + final statusProvider = Provider.of(context, listen: false); final appConfigProvider = Provider.of(context, listen: false); final mediaQuery = MediaQuery.of(context); @@ -257,13 +260,15 @@ class _AddServerModalState extends State { } final serverCreated = await serversProvider.createServer(serverObj); if (serverCreated == null) { - serversProvider.setServerStatusLoad(0); + statusProvider.setServerStatusLoad(LoadStatus.loading); final serverStatus = await getServerStatus(serverObj); if (serverStatus['result'] == 'success') { - serversProvider.setServerStatusData(serverStatus['data']); - serversProvider.setServerStatusLoad(1); + statusProvider.setServerStatusData( + data: serverStatus['data'] + ); + statusProvider.setServerStatusLoad(LoadStatus.loaded); if (serverStatus['data'].serverVersion.contains('a') || serverStatus['data'].serverVersion.contains('b')) { Navigator.pop(context); widget.onUnsupportedVersion(serverStatus['data'].serverVersion); @@ -274,7 +279,7 @@ class _AddServerModalState extends State { } else { appConfigProvider.addLog(serverStatus['log']); - serversProvider.setServerStatusLoad(2); + statusProvider.setServerStatusLoad(LoadStatus.error); Navigator.pop(context); } } diff --git a/lib/widgets/domain_options.dart b/lib/widgets/domain_options.dart index 1612390..5637e9d 100644 --- a/lib/widgets/domain_options.dart +++ b/lib/widgets/domain_options.dart @@ -11,6 +11,7 @@ import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/models/filtering_status.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -37,6 +38,7 @@ class DomainOptions extends StatelessWidget { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); void blockUnblock(String domain, String newStatus) async { @@ -46,7 +48,7 @@ class DomainOptions extends StatelessWidget { final rules = await getFilteringRules(server: serversProvider.selectedServer!); if (rules['result'] == 'success') { - FilteringStatus oldStatus = serversProvider.serverStatus.data!.filteringStatus; + FilteringStatus oldStatus = statusProvider.serverStatus!.filteringStatus; List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); if (newStatus == 'block') { @@ -55,7 +57,7 @@ class DomainOptions extends StatelessWidget { else if (newStatus == 'unblock') { newRules.add("@@||$domain^"); } - FilteringStatus newObj = serversProvider.serverStatus.data!.filteringStatus; + FilteringStatus newObj = statusProvider.serverStatus!.filteringStatus; newObj.userRules = newRules; serversProvider.setFilteringStatus(newObj); diff --git a/lib/widgets/servers_list/servers_list_item.dart b/lib/widgets/servers_list/servers_list_item.dart index 614c2ca..1a9c482 100644 --- a/lib/widgets/servers_list/servers_list_item.dart +++ b/lib/widgets/servers_list/servers_list_item.dart @@ -11,6 +11,8 @@ import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/models/app_log.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -69,6 +71,7 @@ class _ServersListItemState extends State with SingleTickerProv @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -134,16 +137,18 @@ class _ServersListItemState extends State with SingleTickerProv if (result['result'] == 'success') { serversProvider.setSelectedServer(server); - serversProvider.setServerStatusLoad(0); + statusProvider.setServerStatusLoad(LoadStatus.loading); final serverStatus = await getServerStatus(server); if (serverStatus['result'] == 'success') { - serversProvider.setServerStatusData(serverStatus['data']); + statusProvider.setServerStatusData( + data: serverStatus['data'] + ); serversProvider.checkServerUpdatesAvailable(server); - serversProvider.setServerStatusLoad(1); + statusProvider.setServerStatusLoad(LoadStatus.loaded); } else { appConfigProvider.addLog(serverStatus['log']); - serversProvider.setServerStatusLoad(2); + statusProvider.setServerStatusLoad(LoadStatus.error); } process.close(); @@ -192,7 +197,7 @@ class _ServersListItemState extends State with SingleTickerProv Icon( Icons.storage_rounded, color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id - ? serversProvider.serverStatus.data != null + ? statusProvider.serverStatus != null ? Colors.green : Colors.orange : null, @@ -225,7 +230,7 @@ class _ServersListItemState extends State with SingleTickerProv return Icon( Icons.storage_rounded, color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id - ? serversProvider.serverStatus.data != null + ? statusProvider.serverStatus != null ? Colors.green : Colors.orange : null, @@ -344,7 +349,7 @@ class _ServersListItemState extends State with SingleTickerProv margin: const EdgeInsets.only(right: 12), padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), decoration: BoxDecoration( - color: serversProvider.serverStatus.data != null + color: statusProvider.serverStatus != null ? Colors.green : Colors.orange, borderRadius: BorderRadius.circular(30) @@ -352,14 +357,14 @@ class _ServersListItemState extends State with SingleTickerProv child: Row( children: [ Icon( - serversProvider.serverStatus.data != null + statusProvider.serverStatus != null ? Icons.check : Icons.warning, color: Colors.white, ), const SizedBox(width: 10), Text( - serversProvider.serverStatus.data != null + statusProvider.serverStatus != null ? AppLocalizations.of(context)!.connected : AppLocalizations.of(context)!.selectedDisconnected, style: const TextStyle( diff --git a/lib/widgets/servers_list/servers_tile_item.dart b/lib/widgets/servers_list/servers_tile_item.dart index 8145b5e..32c3772 100644 --- a/lib/widgets/servers_list/servers_tile_item.dart +++ b/lib/widgets/servers_list/servers_tile_item.dart @@ -10,6 +10,8 @@ import 'package:adguard_home_manager/widgets/servers_list/delete_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/models/app_log.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; @@ -36,6 +38,7 @@ class _ServersTileItemState extends State with SingleTickerProv @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -101,16 +104,18 @@ class _ServersTileItemState extends State with SingleTickerProv if (result['result'] == 'success') { serversProvider.setSelectedServer(server); - serversProvider.setServerStatusLoad(0); + statusProvider.setServerStatusLoad(LoadStatus.loading); final serverStatus = await getServerStatus(server); if (serverStatus['result'] == 'success') { - serversProvider.setServerStatusData(serverStatus['data']); + statusProvider.setServerStatusData( + data: serverStatus['data'] + ); serversProvider.checkServerUpdatesAvailable(server); - serversProvider.setServerStatusLoad(1); + statusProvider.setServerStatusLoad(LoadStatus.loaded); } else { appConfigProvider.addLog(serverStatus['log']); - serversProvider.setServerStatusLoad(2); + statusProvider.setServerStatusLoad(LoadStatus.error); } process.close(); @@ -159,7 +164,7 @@ class _ServersTileItemState extends State with SingleTickerProv Icon( Icons.storage_rounded, color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id - ? serversProvider.serverStatus.data != null + ? statusProvider.serverStatus != null ? Colors.green : Colors.orange : null, @@ -192,7 +197,7 @@ class _ServersTileItemState extends State with SingleTickerProv return Icon( Icons.storage_rounded, color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id - ? serversProvider.serverStatus.data != null + ? statusProvider.serverStatus != null ? Colors.green : Colors.orange : null, @@ -305,13 +310,13 @@ class _ServersTileItemState extends State with SingleTickerProv ), SizedBox( child: serversProvider.selectedServer != null && - serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && serversProvider.serverStatus.data != null && + serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null && serversProvider.selectedServer?.id == server.id ? Container( margin: const EdgeInsets.only(right: 12), padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), decoration: BoxDecoration( - color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && serversProvider.serverStatus.data != null + color: serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null ? Colors.green : Colors.orange, borderRadius: BorderRadius.circular(30) @@ -319,14 +324,14 @@ class _ServersTileItemState extends State with SingleTickerProv child: Row( children: [ Icon( - serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && serversProvider.serverStatus.data != null + serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null ? Icons.check : Icons.warning, color: Colors.white, ), const SizedBox(width: 10), Text( - serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && serversProvider.serverStatus.data != null + serversProvider.selectedServer != null && serversProvider.selectedServer?.id == server.id && statusProvider.serverStatus != null ? AppLocalizations.of(context)!.connected : AppLocalizations.of(context)!.selectedDisconnected, style: const TextStyle(