diff --git a/lib/functions/block_unblock_domain.dart b/lib/functions/block_unblock_domain.dart deleted file mode 100644 index 0049564..0000000 --- a/lib/functions/block_unblock_domain.dart +++ /dev/null @@ -1,63 +0,0 @@ -// ignore_for_file: use_build_context_synchronously - -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'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; -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); - processModal.open(AppLocalizations.of(context)!.savingUserFilters); - - final rules = await getFilteringRules(server: serversProvider.selectedServer!); - - if (rules['result'] == 'success') { - FilteringStatus oldStatus = statusProvider.serverStatus!.filteringStatus; - List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); - if (newStatus == 'block') { - newRules.add("||$domain^"); - } - else if (newStatus == 'unblock') { - newRules.add("@@||$domain^"); - } - FilteringStatus newObj = statusProvider.serverStatus!.filteringStatus; - newObj.userRules = newRules; - statusProvider.setFilteringStatus(newObj); - - final result = await postFilteringRules(server: serversProvider.selectedServer!, data: {'rules': newRules}); - - processModal.close(); - - if (result['result'] == 'success') { - return { - 'success': true, - 'message': AppLocalizations.of(context)!.userFilteringRulesUpdated - }; - } - else { - appConfigProvider.addLog(result['log']); - statusProvider.setFilteringStatus(oldStatus); - return { - 'success': false, - 'message': AppLocalizations.of(context)!.userFilteringRulesNotUpdated - }; - } - } - else { - appConfigProvider.addLog(rules['log']); - return { - 'success': false, - 'message': AppLocalizations.of(context)!.userFilteringRulesNotUpdated - }; - } -} \ No newline at end of file diff --git a/lib/functions/clear_dns_cache.dart b/lib/functions/clear_dns_cache.dart index 44c81d9..0ff1606 100644 --- a/lib/functions/clear_dns_cache.dart +++ b/lib/functions/clear_dns_cache.dart @@ -5,15 +5,17 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; Future clearDnsCache(BuildContext context, Server server) async { + final serversProvider = Provider.of(context, listen: false); + final ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.clearingDnsCache); - final result = await resetDnsCache(server: server); + final result = await serversProvider.apiClient!.resetDnsCache(); processModal.close(); diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a96efab..1504716 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -628,5 +628,7 @@ "application": "Application", "combinedChart": "Combined chart", "combinedChartDescription": "Combine all charts into one", - "statistics": "Statistics" + "statistics": "Statistics", + "errorLoadFilters": "Error when loading filters.", + "clientRemovedSuccessfully": "Client removed successfully." } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 4739f4b..88d248f 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -628,5 +628,7 @@ "application": "Aplicación", "combinedChart": "Gráfico combinado", "combinedChartDescription": "Combina todos los gráficos en uno solo", - "statistics": "Estadísticas" + "statistics": "Estadísticas", + "errorLoadFilters": "Error al cargar los filtros.", + "clientRemovedSuccessfully": "Cliente eliminado correctamente." } \ No newline at end of file diff --git a/lib/main.dart b/lib/main.dart index c1017f0..4ab8db5 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -80,18 +80,7 @@ void main() async { serversProvider.setDbInstance(dbData['dbInstance']); appConfigProvider.saveFromDb(dbData['dbInstance'], dbData['appConfig']); - 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); - } - } + serversProvider.saveFromDb(dbData['servers']); PackageInfo appInfo = await PackageInfo.fromPlatform(); appConfigProvider.setAppInfo(appInfo); @@ -126,9 +115,33 @@ void main() async { ChangeNotifierProvider( create: ((context) => dnsProvider) ), - ChangeNotifierProxyProvider( + ChangeNotifierProxyProvider2( + create: (context) => clientsProvider, + update: (context, servers, status, clients) => clients!..update(servers, status), + ), + ChangeNotifierProxyProvider2( create: (context) => filtersProvider, - update: (context, status, filtering) => filtering!..updateStatus(status), + update: (context, servers, status, filtering) => filtering!..update(servers, status), + ), + ChangeNotifierProxyProvider( + create: (context) => statusProvider, + update: (context, servers, status) => status!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => logsProvider, + update: (context, servers, logs) => logs!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => dhcpProvider, + update: (context, servers, dhcp) => dhcp!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => rewriteRulesProvider, + update: (context, servers, rewrite) => rewrite!..update(servers), + ), + ChangeNotifierProxyProvider( + create: (context) => dnsProvider, + update: (context, servers, dns) => dns!..update(servers), ), ], child: const Main(), diff --git a/lib/models/server_info.dart b/lib/models/server_info.dart index 6e170a5..84f9a57 100644 --- a/lib/models/server_info.dart +++ b/lib/models/server_info.dart @@ -1,7 +1,9 @@ import 'dart:convert'; +import 'package:adguard_home_manager/constants/enums.dart'; + class ServerInfo { - int loadStatus = 0; + LoadStatus loadStatus = LoadStatus.loading; ServerInfoData? data; ServerInfo({ diff --git a/lib/providers/clients_provider.dart b/lib/providers/clients_provider.dart index ae6955c..8cf79a5 100644 --- a/lib/providers/clients_provider.dart +++ b/lib/providers/clients_provider.dart @@ -1,10 +1,22 @@ import 'package:flutter/material.dart'; import 'package:adguard_home_manager/models/clients.dart'; +import 'package:adguard_home_manager/functions/compare_versions.dart'; +import 'package:adguard_home_manager/functions/maps_fns.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_allowed_blocked.dart'; import 'package:adguard_home_manager/constants/enums.dart'; class ClientsProvider with ChangeNotifier { + ServersProvider? _serversProvider; + StatusProvider? _statusProvider; + + update(ServersProvider? servers, StatusProvider? status) { + _serversProvider = servers; + _statusProvider = status; + } + LoadStatus _loadStatus = LoadStatus.loading; Clients? _clients; String? _searchTermClients; @@ -38,7 +50,7 @@ class ClientsProvider with ChangeNotifier { } } - void setClientsData(Clients data) { + void setClientsData(Clients data, bool notify) { _clients = data; if (_searchTermClients != null && _searchTermClients != '') { _filteredActiveClients = _clients!.autoClients.where( @@ -55,7 +67,7 @@ class ClientsProvider with ChangeNotifier { _filteredActiveClients = data.autoClients; _filteredAddedClients = data.clients; } - notifyListeners(); + if (notify == true) notifyListeners(); } void setSearchTermClients(String? value) { @@ -84,4 +96,190 @@ class ClientsProvider with ChangeNotifier { _clients?.clientsAllowedBlocked = data; notifyListeners(); } + + Future fetchClients({ + bool? updateLoading + }) async { + if (updateLoading == true) { + _loadStatus = LoadStatus.loading; + } + final result = await _serversProvider!.apiClient!.getClients(); + if (result['result'] == 'success') { + setClientsData(result['data'], false); + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + if (updateLoading == true) { + _loadStatus = LoadStatus.error; + notifyListeners(); + } + return false; + } + } + + Future deleteClient(Client client) async { + final result = await _serversProvider!.apiClient!.postDeleteClient(name: client.name); + + if (result['result'] == 'success') { + Clients clientsData = clients!; + clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList(); + setClientsData(clientsData, false); + + notifyListeners(); + return true; + } + else { + return false; + } + } + + Future editClient(Client client) async { + final result = await _serversProvider!.apiClient!.postUpdateClient( + data: { + 'name': client.name, + 'data': serverVersionIsAhead( + currentVersion: _statusProvider!.serverStatus!.serverVersion, + referenceVersion: 'v0.107.28', + referenceVersionBeta: 'v0.108.0-b.33' + ) == false + ? removePropFromMap(client.toJson(), 'safesearch_enabled') + : removePropFromMap(client.toJson(), 'safe_search') + } + ); + + if (result['result'] == 'success') { + Clients clientsData = clients!; + clientsData.clients = clientsData.clients.map((e) { + if (e.name == client.name) { + return client; + } + else { + return e; + } + }).toList(); + setClientsData(clientsData, false); + + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future addClient(Client client) async { + final result = await _serversProvider!.apiClient!.postAddClient( + data: serverVersionIsAhead( + currentVersion: _statusProvider!.serverStatus!.serverVersion, + referenceVersion: 'v0.107.28', + referenceVersionBeta: 'v0.108.0-b.33' + ) == false + ? removePropFromMap(client.toJson(), 'safesearch_enabled') + : removePropFromMap(client.toJson(), 'safe_search') + ); + + if (result['result'] == 'success') { + Clients clientsData = clients!; + clientsData.clients.add(client); + setClientsData(clientsData, false); + + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future> addClientList(String item, String type) async { + Map> body = { + "allowed_clients": clients!.clientsAllowedBlocked?.allowedClients ?? [], + "disallowed_clients": clients!.clientsAllowedBlocked?.disallowedClients ?? [], + "blocked_hosts": clients!.clientsAllowedBlocked?.blockedHosts ?? [], + }; + + if (type == 'allowed') { + body['allowed_clients']!.add(item); + } + else if (type == 'disallowed') { + body['disallowed_clients']!.add(item); + } + else if (type == 'domains') { + body['blocked_hosts']!.add(item); + } + + final result = await _serversProvider!.apiClient!.requestAllowedBlockedClientsHosts(body); + + if (result['result'] == 'success') { + _clients?.clientsAllowedBlocked = ClientsAllowedBlocked( + allowedClients: body['allowed_clients'] ?? [], + disallowedClients: body['disallowed_clients'] ?? [], + blockedHosts: body['blocked_hosts'] ?? [], + ); + notifyListeners(); + return { 'success': true }; + } + else if (result['result'] == 'error' && result['message'] == 'client_another_list') { + notifyListeners(); + return { + 'success': false, + 'error': 'client_another_list' + }; + } + else { + notifyListeners(); + return { + 'success': false, + 'error': null + }; + } + } + + Future> removeClientList(String client, String type) async { + Map> body = { + "allowed_clients": clients!.clientsAllowedBlocked?.allowedClients ?? [], + "disallowed_clients": clients!.clientsAllowedBlocked?.disallowedClients ?? [], + "blocked_hosts": clients!.clientsAllowedBlocked?.blockedHosts ?? [], + }; + + if (type == 'allowed') { + body['allowed_clients'] = body['allowed_clients']!.where((c) => c != client).toList(); + } + else if (type == 'disallowed') { + body['disallowed_clients'] = body['disallowed_clients']!.where((c) => c != client).toList(); + } + else if (type == 'domains') { + body['blocked_hosts'] = body['blocked_hosts']!.where((c) => c != client).toList(); + } + + final result = await _serversProvider!.apiClient!.requestAllowedBlockedClientsHosts(body); + + if (result['result'] == 'success') { + _clients?.clientsAllowedBlocked = ClientsAllowedBlocked( + allowedClients: body['allowed_clients'] ?? [], + disallowedClients: body['disallowed_clients'] ?? [], + blockedHosts: body['blocked_hosts'] ?? [], + ); + notifyListeners(); + return { 'success': true }; + } + else if (result['result'] == 'error' && result['message'] == 'client_another_list') { + notifyListeners(); + return { + 'success': false, + 'error': 'client_another_list' + }; + } + else { + notifyListeners(); + return { + 'success': false, + 'error': null + }; + } + } } \ No newline at end of file diff --git a/lib/providers/dhcp_provider.dart b/lib/providers/dhcp_provider.dart index d03759b..2c2e7d9 100644 --- a/lib/providers/dhcp_provider.dart +++ b/lib/providers/dhcp_provider.dart @@ -1,9 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/models/dhcp.dart'; class DhcpProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? provider) { + _serversProvider = provider; + } + LoadStatus _loadStatus = LoadStatus.loading; DhcpModel? _dhcp; @@ -26,4 +33,83 @@ class DhcpProvider with ChangeNotifier { notifyListeners(); } } + + Future loadDhcpStatus({ + bool? showLoading + }) async { + if (showLoading == true) { + _loadStatus = LoadStatus.loading; + notifyListeners(); + } + final result = await _serversProvider!.apiClient!.getDhcpData(); + if (result['result'] == 'success') { + _dhcp = result['data']; + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + if (showLoading == true) { + _loadStatus = LoadStatus.error; + notifyListeners(); + } + return false; + } + } + + Future deleteLease(Lease lease) async { + final result = await _serversProvider!.apiClient!.deleteStaticLease( + data: { + "mac": lease.mac, + "ip": lease.ip, + "hostname": lease.hostname + } + ); + + if (result['result'] == 'success') { + DhcpModel data = dhcp!; + data.dhcpStatus.staticLeases = data.dhcpStatus.staticLeases.where((l) => l.mac != lease.mac).toList(); + setDhcpData(data); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future> createLease(Lease lease) async { + final result = await _serversProvider!.apiClient!.createStaticLease( + data: { + "mac": lease.mac, + "ip": lease.ip, + "hostname": lease.hostname, + } + ); + + if (result['result'] == 'success') { + DhcpModel data = dhcp!; + data.dhcpStatus.staticLeases.add(lease); + setDhcpData(data); + return { 'success': true }; + } + else if (result['result'] == 'error' && result['message'] == 'already_exists' ) { + return { + 'success': false, + 'error': 'already_exists' + }; + } + else if (result['result'] == 'error' && result['message'] == 'server_not_configured' ) { + return { + 'success': false, + 'error': 'server_not_configured' + }; + } + else { + return { + 'success': false, + 'error': null + }; + } + } } \ No newline at end of file diff --git a/lib/providers/dns_provider.dart b/lib/providers/dns_provider.dart index 7db23dc..1468f18 100644 --- a/lib/providers/dns_provider.dart +++ b/lib/providers/dns_provider.dart @@ -1,9 +1,16 @@ import 'package:flutter/material.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/models/dns_info.dart'; class DnsProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? provider) { + _serversProvider = provider; + } + LoadStatus _loadStatus = LoadStatus.loading; DnsInfo? _dnsInfo; @@ -26,4 +33,167 @@ class DnsProvider with ChangeNotifier { notifyListeners(); } } + + Future fetchDnsData({ + bool? showLoading + }) async { + if (showLoading == true) { + _loadStatus = LoadStatus.loading; + } + + final result = await _serversProvider!.apiClient!.getDnsInfo(); + + if (result['result'] == 'success') { + _dnsInfo = result['data']; + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + if (showLoading == false) { + _loadStatus = LoadStatus.loaded; + notifyListeners(); + } + return false; + } + } + + Future> savePrivateReverseServersConfig(Map value) async { + final result = await _serversProvider!.apiClient!.setDnsConfig( + data: value + ); + + if (result['result'] == 'success') { + DnsInfo data = dnsInfo!; + if (value['local_ptr_upstreams'] != null) { + data.localPtrUpstreams = value['local_ptr_upsreams']; + } + data.usePrivatePtrResolvers = value['use_private_ptr_resolvers']; + data.resolveClients = value['resolve_clients']; + setDnsInfoData(data); + return { 'success': true }; + } + else if (result['log'] != null && result['log'].statusCode == '400') { + return { + 'success': false, + 'error': 400 + }; + } + else { + return { + 'success': false, + 'error': null + }; + } + } + + Future> saveUpstreamDnsConfig(Map value) async { + final result = await _serversProvider!.apiClient!.setDnsConfig( + data: value + ); + + if (result['result'] == 'success') { + DnsInfo data = dnsInfo!; + data.upstreamDns = List.from(value['upstream_dns']); + data.upstreamMode = value['upstream_mode']; + setDnsInfoData(data); + return { 'success': true }; + } + else if (result['log'] != null && result['log'].statusCode == '400') { + return { + 'success': false, + 'error': 400 + }; + } + else { + return { + 'success': false, + 'error': null + }; + } + } + + Future> saveBootstrapDnsConfig(Map value) async { + final result = await _serversProvider!.apiClient!.setDnsConfig( + data: value + ); + + if (result['result'] == 'success') { + DnsInfo data = dnsInfo!; + data.bootstrapDns = List.from(value['bootstrap_dns']); + setDnsInfoData(data); + return { 'success': true }; + } + else if (result['log'] != null && result['log'].statusCode == '400') { + return { + 'success': false, + 'error': 400 + }; + } + else { + return { + 'success': false, + 'error': null + }; + } + } + + Future> saveCacheCacheConfig(Map value) async { + final result = await _serversProvider!.apiClient!.setDnsConfig( + data: value + ); + + if (result['result'] == 'success') { + DnsInfo data = dnsInfo!; + data.cacheSize = value['cache_size']; + data.cacheTtlMin = value['cache_ttl_min']; + data.cacheTtlMax = value['cache_ttl_max']; + data.cacheOptimistic = value['cache_optimistic']; + setDnsInfoData(data); + return { 'success': true }; + } + else if (result['log'] != null && result['log'].statusCode == '400') { + return { + 'success': false, + 'error': 400 + }; + } + else { + return { + 'success': false, + 'error': null + }; + } + } + + Future> saveDnsServerConfig(Map value) async { + final result = await _serversProvider!.apiClient!.setDnsConfig( + data: value + ); + + if (result['result'] == 'success') { + DnsInfo data = dnsInfo!; + data.ratelimit = value['ratelimit']; + data.ednsCsEnabled = value['edns_cs_enabled']; + data.dnssecEnabled = value['dnssec_enabled']; + data.disableIpv6 = value['disable_ipv6']; + data.blockingMode = value['blocking_mode']; + data.blockingIpv4 = value['blocking_ipv4']; + data.blockingIpv6 = value['blocking_ipv6']; + setDnsInfoData(data); + return { 'success': true }; + } + else if (result['log'] != null && result['log'].statusCode == '400') { + return { + 'success': false, + 'error': 400 + }; + } + else { + return { + 'success': false, + 'error': null + }; + } + } } \ No newline at end of file diff --git a/lib/providers/filtering_provider.dart b/lib/providers/filtering_provider.dart index f7734b8..8b2d459 100644 --- a/lib/providers/filtering_provider.dart +++ b/lib/providers/filtering_provider.dart @@ -1,17 +1,20 @@ import 'package:flutter/material.dart'; import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/models/blocked_services.dart'; import 'package:adguard_home_manager/models/filtering.dart'; import 'package:adguard_home_manager/providers/status_provider.dart'; +enum FilteringListActions { edit, enable, disable } + class FilteringProvider with ChangeNotifier { StatusProvider? _statusProvider; + ServersProvider? _serversProvider; - updateStatus(StatusProvider? statusProvider) { - if (statusProvider != null) { - _statusProvider = statusProvider; - } + update(ServersProvider? servers, StatusProvider? status) { + _serversProvider = servers; + _statusProvider = status; } LoadStatus _loadStatus = LoadStatus.loading; @@ -47,10 +50,10 @@ class FilteringProvider with ChangeNotifier { } } - void setFilteringProtectionStatus(bool status) { + void setFilteringProtectionStatus(bool status, bool notify) { _statusProvider!.setFilteringEnabledStatus(status); _filtering!.enabled = status; - notifyListeners(); + if (notify == true) notifyListeners(); } void setFiltersUpdateFrequency(int frequency) { @@ -78,4 +81,307 @@ class FilteringProvider with ChangeNotifier { notifyListeners(); } } + + Future getBlockedServices({ + bool? showLoader + }) async { + _blockedServicesLoadStatus = LoadStatus.loading; + if (showLoader == true) notifyListeners(); + + final result = await _serversProvider!.apiClient!.getBlockedServices(); + if (result['result'] == 'success') { + _blockedServicesLoadStatus = LoadStatus.loaded; + _blockedServicesList = BlockedServices(services: result['data']); + + notifyListeners(); + return true; + } + else { + if (showLoader == true) { + _blockedServicesLoadStatus = LoadStatus.error; + notifyListeners(); + } + return false; + } + } + + Future fetchFilters({ + bool? showLoading + }) async { + if (showLoading == true) { + _loadStatus = LoadStatus.loading; + } + + final result = await _serversProvider!.apiClient!.getFiltering(); + if (result['result'] == 'success') { + _filtering = result['data']; + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + _loadStatus = LoadStatus.error; + notifyListeners(); + return false; + } + } + + Future> updateLists() async { + final result = await _serversProvider!.apiClient!.updateLists(); + if (result['result'] == 'success') { + final result2 = await _serversProvider!.apiClient!.getFiltering(); + if (result2['result'] == 'success') { + _filtering = result2['data']; + notifyListeners(); + return { + "success": true, + "data": result['data'] + }; + } + else { + notifyListeners(); + return { "success": false }; + } + } + else { + notifyListeners(); + return { "success": false }; + } + } + + Future enableDisableFiltering() async { + final newValue = !_statusProvider!.serverStatus!.filteringEnabled; + final result = await _serversProvider!.apiClient!.updateFiltering( + enable: newValue + ); + if (result['result'] == 'success') { + setFilteringProtectionStatus(newValue, false); + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future changeUpdateFrequency(int value) async { + final result = await _serversProvider!.apiClient!.requestChangeUpdateFrequency( + data: { + "enabled": filtering!.enabled, + "interval": value + } + ); + if (result['result'] == 'success') { + setFiltersUpdateFrequency(value); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future removeCustomRule(String rule) async { + final List newRules = filtering!.userRules.where((r) => r != rule).toList(); + + final result = await _serversProvider!.apiClient!.setCustomRules(rules: newRules); + + if (result['result'] == 'success') { + Filtering filteringData = filtering!; + filteringData.userRules = newRules; + _filtering = filteringData; + + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future deleteList({ + required String listUrl, + required String type + }) async { + final result1 = await _serversProvider!.apiClient!.deleteFilterList( + data: { + "url": listUrl, + "whitelist": type == 'whitelist' ? true : false + } + ); + + if (result1['result'] == 'success') { + final result2 = await _serversProvider!.apiClient!.getFiltering(); + + if (result2['result'] == 'success') { + _filtering = result2['data']; + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + else { + notifyListeners(); + return false; + } + } + + Future updateList({ + required Filter list, + required String type, + required FilteringListActions action + }) async { + final result1 = await _serversProvider!.apiClient!.updateFilterList( + data: { + "data": { + "enabled": action == FilteringListActions.disable || action == FilteringListActions.enable + ? !list.enabled + : list.enabled, + "name": list.name, + "url": list.url + }, + "url": list.url, + "whitelist": type == 'whitelist' ? true : false + } + ); + + if (result1['result'] == 'success') { + final result2 = await _serversProvider!.apiClient!.getFiltering(); + + if (result2['result'] == 'success') { + _filtering = result2['data']; + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + else { + notifyListeners(); + return false; + } + } + + Future addCustomRule(String rule) async { + final List newRules = filtering!.userRules; + newRules.add(rule); + + final result = await _serversProvider!.apiClient!.setCustomRules(rules: newRules); + + if (result['result'] == 'success') { + Filtering filteringData = filtering!; + filteringData.userRules = newRules; + _filtering = filteringData; + notifyListeners(); + return true; + } + else { + notifyListeners(); + return false; + } + } + Future> addList({required String name, required String url, required String type}) async { + final result1 = await _serversProvider!.apiClient!.addFilteringList( + data: { + 'name': name, + 'url': url, + 'whitelist': type == 'whitelist' ? true : false + } + ); + + if (result1['result'] == 'success') { + if (result1['data'].toString().contains("OK")) { + final result2 = await _serversProvider!.apiClient!.getFiltering(); + final items = result1['data'].toString().split(' ')[1]; + + if (result2['result'] == 'success') { + _filtering = result2['data']; + notifyListeners(); + return { + 'success': true, + 'data': items + }; + } + else { + notifyListeners(); + return { + 'success': false, + 'error': null + }; + } + } + else { + notifyListeners(); + return { + 'success': false, + 'error': null + }; + } + } + else if (result1['result'] == 'error' && result1['log'].statusCode == '400' && result1['log'].resBody.toString().contains("Couldn't fetch filter from url")) { + notifyListeners(); + return { + 'success': false, + 'error': 'invalid_url' + }; + } + else if (result1['result'] == 'error' && result1['log'].statusCode == '400' && result1['log'].resBody.toString().contains('Filter URL already added')) { + notifyListeners(); + return { + 'success': false, + 'error': 'url_exists' + }; + } + else { + notifyListeners(); + return { + 'success': false, + 'error': null + }; + } + } + + Future loadBlockedServices({ + bool? showLoading + }) async { + if (showLoading == true) { + _blockedServicesLoadStatus = LoadStatus.loading; + } + + final result = await _serversProvider!.apiClient!.getBlockedServices(); + if (result['result'] == 'success') { + _blockedServicesList = BlockedServices(services: result['data']); + _blockedServicesLoadStatus = LoadStatus.loaded; + + notifyListeners(); + return true; + } + else { + if (showLoading == true) _blockedServicesLoadStatus = LoadStatus.error; + notifyListeners(); + return false; + } + } + + Future updateBlockedServices(List values) async { + final result = await _serversProvider!.apiClient!.setBlockedServices( + data: values + ); + + if (result['result'] == 'success') { + setBlockedServices(values); + return true; + } + else { + notifyListeners(); + return false; + } + } } \ No newline at end of file diff --git a/lib/providers/logs_provider.dart b/lib/providers/logs_provider.dart index 9c3d3a7..e999470 100644 --- a/lib/providers/logs_provider.dart +++ b/lib/providers/logs_provider.dart @@ -1,14 +1,21 @@ import 'package:flutter/material.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/constants/enums.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'; class LogsProvider with ChangeNotifier { - int _loadStatus = 0; + ServersProvider? _serversProvider; + + update(ServersProvider? provider) { + _serversProvider = provider; + } + + LoadStatus _loadStatus = LoadStatus.loading; LogsData? _logsData; List? _clients; - int _clientsLoadStatus = 0; DateTime? _logsOlderThan; String _selectedResultStatus = 'all'; @@ -18,13 +25,15 @@ class LogsProvider with ChangeNotifier { int _logsQuantity = 100; int _offset = 0; + bool _isLoadingMore = false; + AppliedFiters _appliedFilters = AppliedFiters( selectedResultStatus: 'all', searchText: null, clients: null ); - int get loadStatus { + LoadStatus get loadStatus { return _loadStatus; } @@ -60,16 +69,15 @@ class LogsProvider with ChangeNotifier { return _selectedClients; } - int get clientsLoadStatus { - return _clientsLoadStatus; - } - AppliedFiters get appliedFilters { return _appliedFilters; } + bool get isLoadingMore { + return _isLoadingMore; + } - void setLoadStatus(int value) { + void setLoadStatus(LoadStatus value) { _loadStatus = value; notifyListeners(); } @@ -83,11 +91,6 @@ class LogsProvider with ChangeNotifier { _clients = clients; notifyListeners(); } - - void setClientsLoadStatus(int status) { - _clientsLoadStatus = status; - notifyListeners(); - } void setLogsOlderThan(DateTime? value) { _logsOlderThan = value; @@ -130,4 +133,136 @@ class LogsProvider with ChangeNotifier { _appliedFilters = value; notifyListeners(); } + + void setIsLoadingMore(bool status) { + _isLoadingMore = status; + } + + Future fetchLogs({ + int? inOffset, + bool? loadingMore, + String? responseStatus, + String? searchText, + }) async { + int offst = inOffset ?? offset; + + String resStatus = responseStatus ?? selectedResultStatus; + String? search = searchText ?? searchText; + + if (loadingMore != null && loadingMore == true) { + _isLoadingMore = true; + notifyListeners(); + } + + final result = await _serversProvider!.apiClient!.getLogs( + count: logsQuantity, + offset: offst, + olderThan: logsOlderThan, + responseStatus: resStatus, + search: search + ); + + if (loadingMore != null && loadingMore == true) { + _isLoadingMore = false; + notifyListeners(); + } + + if (result['result'] == 'success') { + _offset = inOffset != null ? inOffset+logsQuantity : offset+logsQuantity; + if (loadingMore != null && loadingMore == true && logsData != null) { + LogsData newLogsData = result['data']; + newLogsData.data = [...logsData!.data, ...result['data'].data]; + if (appliedFilters.clients != null) { + newLogsData.data = newLogsData.data.where( + (item) => appliedFilters.clients!.contains(item.client) + ).toList(); + } + _logsData = newLogsData; + } + else { + LogsData newLogsData = result['data']; + if (appliedFilters.clients != null) { + newLogsData.data = newLogsData.data.where( + (item) => appliedFilters.clients!.contains(item.client) + ).toList(); + } + _logsData = newLogsData; + } + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + _loadStatus = LoadStatus.error; + notifyListeners(); + return false; + } + } + + Future requestResetFilters() async { + _loadStatus = LoadStatus.loading; + notifyListeners(); + + resetFilters(); + + final result = await _serversProvider!.apiClient!.getLogs( + count: logsQuantity + ); + + _appliedFilters = AppliedFiters( + selectedResultStatus: 'all', + searchText: null, + clients: null + ); + + if (result['result'] == 'success') { + _logsData = result['data']; + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + _loadStatus = LoadStatus.error; + notifyListeners(); + return false; + } + } + + Future filterLogs() async { + _loadStatus = LoadStatus.loading; + notifyListeners(); + + setOffset(0); + + final result = await _serversProvider!.apiClient!.getLogs( + count: logsQuantity, + olderThan: logsOlderThan, + responseStatus: selectedResultStatus, + search: searchText, + ); + + _appliedFilters = AppliedFiters( + selectedResultStatus: selectedResultStatus, + searchText: searchText, + clients: selectedClients + ); + + if (result['result'] == 'success') { + LogsData newLogsData = result['data']; + if (appliedFilters.clients != null) { + newLogsData.data = newLogsData.data.where( + (item) => appliedFilters.clients!.contains(item.client) + ).toList(); + } + _logsData = newLogsData; + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + _loadStatus = LoadStatus.error; + notifyListeners(); + return false; + } + } } \ No newline at end of file diff --git a/lib/providers/rewrite_rules_provider.dart b/lib/providers/rewrite_rules_provider.dart index a4c6825..1db40c5 100644 --- a/lib/providers/rewrite_rules_provider.dart +++ b/lib/providers/rewrite_rules_provider.dart @@ -1,9 +1,16 @@ import 'package:flutter/material.dart'; import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/models/rewrite_rules.dart'; class RewriteRulesProvider with ChangeNotifier { + ServersProvider? _serversProvider; + + update(ServersProvider? provider) { + _serversProvider = provider; + } + LoadStatus _loadStatus = LoadStatus.loading; List? _rewriteRules; @@ -26,4 +33,68 @@ class RewriteRulesProvider with ChangeNotifier { notifyListeners(); } } + + Future addDnsRewrite(RewriteRules rule) async { + final result = await _serversProvider!.apiClient!.addDnsRewriteRule( + data: { + "domain": rule.domain, + "answer": rule.answer + } + ); + + if (result['result'] == 'success') { + List data = rewriteRules!; + data.add(rule); + setRewriteRulesData(data); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future deleteDnsRewrite(RewriteRules rule) async { + final result = await _serversProvider!.apiClient!.deleteDnsRewriteRule( + data: { + "domain": rule.domain, + "answer": rule.answer + } + ); + + if (result['result'] == 'success') { + List data = rewriteRules!; + data = data.where((item) => item.domain != rule.domain).toList(); + setRewriteRulesData(data); + return true; + } + else { + notifyListeners(); + return false; + } + } + + Future fetchRules({ + bool? showLoading + }) async { + if (showLoading == true) { + _loadStatus = LoadStatus.loading; + } + + final result = await _serversProvider!.apiClient!.getDnsRewriteRules(); + + if (result['result'] == 'success') { + _rewriteRules = result['data']; + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + if (showLoading == true) { + _loadStatus = LoadStatus.error; + notifyListeners(); + } + return false; + } + } } \ No newline at end of file diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index 25b3480..2ed27be 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:sqflite/sqflite.dart'; -import 'package:adguard_home_manager/models/dns_info.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'; @@ -15,12 +14,17 @@ class ServersProvider with ChangeNotifier { List _serversList = []; Server? _selectedServer; + ApiClient? _apiClient; final UpdateAvailable _updateAvailable = UpdateAvailable( loadStatus: LoadStatus.loading, data: null, ); + ApiClient? get apiClient { + return _apiClient; + } + List get serversList { return _serversList; } @@ -59,6 +63,11 @@ class ServersProvider with ChangeNotifier { notifyListeners(); } + void setApiClient(ApiClient client) { + _apiClient = client; + notifyListeners(); + } + Future createServer(Server server) async { final saved = await saveServerQuery(_dbInstance!, server); if (saved == null) { @@ -118,6 +127,11 @@ class ServersProvider with ChangeNotifier { } }).toList(); _serversList = newServers; + + if (selectedServer != null &&server.id == selectedServer!.id) { + _apiClient = ApiClient(server: server); + } + notifyListeners(); return null; } @@ -130,6 +144,7 @@ class ServersProvider with ChangeNotifier { final result = await removeServerQuery(_dbInstance!, server.id); if (result == true) { _selectedServer = null; + _apiClient = null; List newServers = _serversList.where((s) => s.id != server.id).toList(); _serversList = newServers; notifyListeners(); @@ -142,10 +157,10 @@ class ServersProvider with ChangeNotifier { void checkServerUpdatesAvailable(Server server) async { setUpdateAvailableLoadStatus(LoadStatus.loading, true); - final result = await checkServerUpdates(server: server); + final result = await _apiClient!.checkServerUpdates(); if (result['result'] == 'success') { UpdateAvailableData data = UpdateAvailableData.fromJson(result['data']); - final gitHubResult = await getUpdateChangelog(server: server, releaseTag: data.newVersion ?? data.currentVersion); + final gitHubResult = await _apiClient!.getUpdateChangelog(releaseTag: data.newVersion ?? data.currentVersion); if (gitHubResult['result'] == 'success') { data.changelog = gitHubResult['body']; } @@ -171,21 +186,11 @@ class ServersProvider with ChangeNotifier { } } - Future> initializateServer(Server server) async { - _selectedServer = server; - final serverStatus = await getServerStatus(server); + Future initializateServer(Server server) async { + final serverStatus = await _apiClient!.getServerStatus(); if (serverStatus['result'] == 'success') { checkServerUpdatesAvailable(server); // Do not await - return { - "success": true, - "serverData": serverStatus['data'] - }; } - else { - return { - "success": false - }; - } } Future?> saveFromDb(List>? data) async { @@ -214,8 +219,9 @@ class ServersProvider with ChangeNotifier { notifyListeners(); if (defaultServer != null) { - final result = await initializateServer(defaultServer); - return result; + _selectedServer = defaultServer; + _apiClient = ApiClient(server: defaultServer); + initializateServer(defaultServer); } else { return null; diff --git a/lib/providers/status_provider.dart b/lib/providers/status_provider.dart index 1ba9d30..006a753 100644 --- a/lib/providers/status_provider.dart +++ b/lib/providers/status_provider.dart @@ -3,12 +3,17 @@ import 'package:flutter/material.dart'; import 'package:adguard_home_manager/models/server_status.dart'; import 'package:adguard_home_manager/models/filtering_status.dart'; import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/servers_provider.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? provider) { + _serversProvider = provider; + } + LoadStatus _loadStatus = LoadStatus.loading; ServerStatus? _serverStatus; // serverStatus != null means server is connected List _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled @@ -48,7 +53,6 @@ class StatusProvider with ChangeNotifier { } Future updateBlocking({ - required Server server, required String block, required bool newStatus, int? time @@ -58,8 +62,7 @@ class StatusProvider with ChangeNotifier { _protectionsManagementProcess.add('general'); notifyListeners(); - final result = await updateGeneralProtection( - server: server, + final result = await _serversProvider!.apiClient!.updateGeneralProtection( enable: newStatus, time: time ); @@ -88,7 +91,7 @@ class StatusProvider with ChangeNotifier { _protectionsManagementProcess.add('general'); notifyListeners(); - final result = await updateGeneralProtectionLegacy(server, newStatus); + final result = await _serversProvider!.apiClient!.updateGeneralProtectionLegacy(newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'general').toList(); @@ -107,8 +110,7 @@ class StatusProvider with ChangeNotifier { _protectionsManagementProcess.add('filtering'); notifyListeners(); - final result = await updateFiltering( - server: server, + final result = await _serversProvider!.apiClient!.updateFiltering( enable: newStatus, ); @@ -134,8 +136,8 @@ class StatusProvider with ChangeNotifier { referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true - ? await updateSafeSearchSettings(server: server, body: { 'enabled': newStatus }) - : await updateSafeSearchLegacy(server, newStatus); + ? await _serversProvider!.apiClient!.updateSafeSearchSettings(body: { 'enabled': newStatus }) + : await _serversProvider!.apiClient!.updateSafeSearchLegacy(newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeSearch').toList(); @@ -153,7 +155,7 @@ class StatusProvider with ChangeNotifier { _protectionsManagementProcess.add('safeBrowsing'); notifyListeners(); - final result = await updateSafeBrowsing(server, newStatus); + final result = await _serversProvider!.apiClient!.updateSafeBrowsing(newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'safeBrowsing').toList(); @@ -171,7 +173,7 @@ class StatusProvider with ChangeNotifier { _protectionsManagementProcess.add('parentalControl'); notifyListeners(); - final result = await updateParentalControl(server, newStatus); + final result = await _serversProvider!.apiClient!.updateParentalControl(newStatus); _protectionsManagementProcess = _protectionsManagementProcess.where((e) => e != 'parentalControl').toList(); @@ -193,4 +195,98 @@ class StatusProvider with ChangeNotifier { void setFilteringEnabledStatus(bool status) { _serverStatus!.filteringEnabled = status; } + + Future getFilteringRules() async { + final result = await _serversProvider!.apiClient!.getFilteringRules(); + if (result['result'] == 'success') { + _filteringStatus = result['data']; + notifyListeners(); + return true; + } + else { + return false; + } + } + + Future getServerStatus({ + bool? withLoadingIndicator + }) async { + if (withLoadingIndicator == true) { + _loadStatus = LoadStatus.loading; + } + + final result = await _serversProvider!.apiClient!.getServerStatus(); + if (result['result'] == 'success') { + setServerStatusData( + data: result['data'] + ); + _loadStatus = LoadStatus.loaded; + notifyListeners(); + return true; + } + else { + if (withLoadingIndicator == true) _loadStatus = LoadStatus.error; + notifyListeners(); + return false; + } + } + + Future blockUnblockDomain({ + required String domain, + required String newStatus + }) async { + final rules = await _serversProvider!.apiClient!.getFilteringRules(); + + if (rules['result'] == 'success') { + FilteringStatus oldStatus = serverStatus!.filteringStatus; + + List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); + if (newStatus == 'block') { + newRules.add("||$domain^"); + } + else if (newStatus == 'unblock') { + newRules.add("@@||$domain^"); + } + FilteringStatus newObj = serverStatus!.filteringStatus; + newObj.userRules = newRules; + _filteringStatus = newObj; + + final result = await _serversProvider!.apiClient!.postFilteringRules(data: {'rules': newRules}); + + if (result['result'] == 'success') { + return true; + } + else { + _filteringStatus = oldStatus; + return false; + } + } + else { + return false; + } + } + + Future updateSafeSearchConfig(Map status) async { + final result = await _serversProvider!.apiClient!.updateSafeSearchSettings( + body: status + ); + + if (result['result'] == 'success') { + ServerStatus data = serverStatus!; + data.safeSearchEnabled = status['enabled'] ?? false; + data.safeSeachBing = status['bing'] ?? false; + data.safeSearchDuckduckgo = status['duckduckgo'] ?? false; + data.safeSearchGoogle = status['google'] ?? false; + data.safeSearchPixabay = status['pixabay'] ?? false; + data.safeSearchYandex = status['yandex'] ?? false; + data.safeSearchYoutube = status['youtube'] ?? false; + + setServerStatusData(data: data); + return true; + } + else { + notifyListeners(); + return false; + } + } } \ No newline at end of file diff --git a/lib/screens/clients/added_list.dart b/lib/screens/clients/added_list.dart index 5c876f0..6b7f33c 100644 --- a/lib/screens/clients/added_list.dart +++ b/lib/screens/clients/added_list.dart @@ -17,22 +17,16 @@ import 'package:adguard_home_manager/screens/clients/options_modal.dart'; 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/providers/clients_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'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class AddedList extends StatefulWidget { final ScrollController scrollController; - final LoadStatus loadStatus; final List data; - final Future Function() fetchClients; final void Function(Client) onClientSelected; final Client? selectedClient; final bool splitView; @@ -40,9 +34,7 @@ class AddedList extends StatefulWidget { const AddedList({ Key? key, required this.scrollController, - required this.loadStatus, required this.data, - required this.fetchClients, required this.onClientSelected, this.selectedClient, required this.splitView @@ -78,7 +70,6 @@ class _AddedListState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); final clientsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -89,31 +80,11 @@ class _AddedListState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingClient); - final result = await postUpdateClient(server: serversProvider.selectedServer!, data: { - 'name': client.name, - 'data': serverVersionIsAhead( - currentVersion: statusProvider.serverStatus!.serverVersion, - referenceVersion: 'v0.107.28', - referenceVersionBeta: 'v0.108.0-b.33' - ) == false - ? removePropFromMap(client.toJson(), 'safesearch_enabled') - : removePropFromMap(client.toJson(), 'safe_search') - }); + final result = await clientsProvider.editClient(client); processModal.close(); - if (result['result'] == 'success') { - Clients clientsData = clientsProvider.clients!; - clientsData.clients = clientsData.clients.map((e) { - if (e.name == client.name) { - return client; - } - else { - return e; - } - }).toList(); - clientsProvider.setClientsData(clientsData); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientUpdatedSuccessfully, @@ -121,8 +92,6 @@ class _AddedListState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientNotUpdated, @@ -135,19 +104,14 @@ class _AddedListState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.removingClient); - final result = await postDeleteClient(server: serversProvider.selectedServer!, name: client.name); + final result = await clientsProvider.deleteClient(client); processModal.close(); - if (result['result'] == 'success') { - Clients clientsData = clientsProvider.clients!; - clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList(); - clientsProvider.setClientsData(clientsData); - + if (result == true) { if (widget.splitView == true) { SplitView.of(context).popUntil(0); } - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientDeletedSuccessfully, @@ -155,15 +119,13 @@ class _AddedListState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientNotDeleted, color: Colors.red ); } - } + } void openClientModal(Client client) { if (width > 900 || !(Platform.isAndroid | Platform.isIOS)) { @@ -264,7 +226,7 @@ class _AddedListState extends State { ), const SizedBox(height: 30), TextButton.icon( - onPressed: widget.fetchClients, + onPressed: () => clientsProvider.fetchClients(updateLoading: true), icon: const Icon(Icons.refresh_rounded), label: Text(AppLocalizations.of(context)!.refresh), ) @@ -294,8 +256,10 @@ class _AddedListState extends State { ], ), ), - loadStatus: widget.loadStatus, - onRefresh: widget.fetchClients, + loadStatus: statusProvider.loadStatus == LoadStatus.loading || clientsProvider.loadStatus == LoadStatus.loading + ? LoadStatus.loading + : clientsProvider.loadStatus, + onRefresh: () => clientsProvider.fetchClients(updateLoading: false), fab: const ClientsFab(), fabVisible: isVisible, ); diff --git a/lib/screens/clients/clients.dart b/lib/screens/clients/clients.dart index 98a9391..1dada10 100644 --- a/lib/screens/clients/clients.dart +++ b/lib/screens/clients/clients.dart @@ -14,7 +14,6 @@ import 'package:adguard_home_manager/screens/clients/added_list.dart'; import 'package:adguard_home_manager/providers/clients_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -32,28 +31,11 @@ class _ClientsState extends State with TickerProviderStateMixin { bool searchMode = false; final TextEditingController searchController = TextEditingController(); - Future fetchClients() async { - final clientsProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - clientsProvider.setClientsLoadStatus(LoadStatus.loading, false); - final result = await getClients(serversProvider.selectedServer!); - if (mounted) { - if (result['result'] == 'success') { - clientsProvider.setClientsData(result['data']); - clientsProvider.setClientsLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result['log']); - clientsProvider.setClientsLoadStatus(LoadStatus.error, true); - } - } - } - @override void initState() { - fetchClients(); + final clientsProvider = Provider.of(context, listen: false); + clientsProvider.fetchClients(updateLoading: true); + super.initState(); tabController = TabController( initialIndex: 0, @@ -112,10 +94,8 @@ class _ClientsState extends State with TickerProviderStateMixin { children: [ ClientsList( scrollController: scrollController, - loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.filteredActiveClients : [], - fetchClients: fetchClients, onClientSelected: (client) => Navigator.push(context, MaterialPageRoute( builder: (context) => LogsListClient( ip: client.ip, @@ -128,10 +108,8 @@ class _ClientsState extends State with TickerProviderStateMixin { ), AddedList( scrollController: scrollController, - loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.filteredAddedClients : [], - fetchClients: fetchClients, onClientSelected: (client) => Navigator.push(context, MaterialPageRoute( builder: (context) => LogsListClient( ip: client.ids[0], @@ -165,7 +143,6 @@ class _ClientsState extends State with TickerProviderStateMixin { child: ClientsDesktopView( serversProvider: serversProvider, appConfigProvider: appConfigProvider, - fetchClients: fetchClients, ) ); } diff --git a/lib/screens/clients/clients_desktop_view.dart b/lib/screens/clients/clients_desktop_view.dart index 04bfc35..d6707ad 100644 --- a/lib/screens/clients/clients_desktop_view.dart +++ b/lib/screens/clients/clients_desktop_view.dart @@ -19,13 +19,11 @@ import 'package:adguard_home_manager/providers/servers_provider.dart'; class ClientsDesktopView extends StatefulWidget { final ServersProvider serversProvider; final AppConfigProvider appConfigProvider; - final Future Function() fetchClients; const ClientsDesktopView({ Key? key, required this.serversProvider, required this.appConfigProvider, - required this.fetchClients }) : super(key: key); @override @@ -94,10 +92,8 @@ class _ClientsDesktopViewState extends State with TickerPro children: [ ClientsList( scrollController: scrollController, - loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.filteredActiveClients : [], - fetchClients: widget.fetchClients, onClientSelected: (client) => setState(() { selectedAddedClient = null; selectedActiveClient = client; @@ -116,10 +112,8 @@ class _ClientsDesktopViewState extends State with TickerPro ), AddedList( scrollController: scrollController, - loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.filteredAddedClients : [], - fetchClients: widget.fetchClients, onClientSelected: (client) => setState(() { selectedActiveClient = null; selectedAddedClient = client; diff --git a/lib/screens/clients/clients_list.dart b/lib/screens/clients/clients_list.dart index de284c5..4ecd98c 100644 --- a/lib/screens/clients/clients_list.dart +++ b/lib/screens/clients/clients_list.dart @@ -1,18 +1,17 @@ import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/clients/active_client_tile.dart'; import 'package:adguard_home_manager/widgets/tab_content_list.dart'; +import 'package:adguard_home_manager/providers/clients_provider.dart'; import 'package:adguard_home_manager/models/clients.dart'; -import 'package:adguard_home_manager/constants/enums.dart'; class ClientsList extends StatelessWidget { final ScrollController scrollController; - final LoadStatus loadStatus; final List data; - final Future Function() fetchClients; final void Function(AutoClient) onClientSelected; final AutoClient? selectedClient; final bool splitView; @@ -21,9 +20,7 @@ class ClientsList extends StatelessWidget { const ClientsList({ Key? key, required this.scrollController, - required this.loadStatus, required this.data, - required this.fetchClients, required this.onClientSelected, this.selectedClient, required this.splitView, @@ -32,6 +29,8 @@ class ClientsList extends StatelessWidget { @override Widget build(BuildContext context) { + final clientsProvider = Provider.of(context); + return CustomTabContentList( listPadding: splitView == true ? const EdgeInsets.only(top: 8) @@ -79,7 +78,7 @@ class ClientsList extends StatelessWidget { ), const SizedBox(height: 30), TextButton.icon( - onPressed: fetchClients, + onPressed: () => clientsProvider.fetchClients(updateLoading: false), icon: const Icon(Icons.refresh_rounded), label: Text(AppLocalizations.of(context)!.refresh) ) @@ -110,8 +109,8 @@ class ClientsList extends StatelessWidget { ], ), ), - loadStatus: loadStatus, - onRefresh: fetchClients + loadStatus: clientsProvider.loadStatus, + onRefresh: () => clientsProvider.fetchClients(updateLoading: false), ); } } \ No newline at end of file diff --git a/lib/screens/clients/fab.dart b/lib/screens/clients/fab.dart index 61b2aec..8d73050 100644 --- a/lib/screens/clients/fab.dart +++ b/lib/screens/clients/fab.dart @@ -10,13 +10,9 @@ import 'package:adguard_home_manager/screens/clients/client_screen.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/providers/clients_provider.dart'; -import 'package:adguard_home_manager/functions/compare_versions.dart'; 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'; class ClientsFab extends StatelessWidget { @@ -24,7 +20,6 @@ class ClientsFab extends StatelessWidget { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final statusProvider = Provider.of(context); final clientsProvider = Provider.of(context); @@ -35,24 +30,11 @@ class ClientsFab extends StatelessWidget { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingClient); - final result = await postAddClient( - server: serversProvider.selectedServer!, - data: serverVersionIsAhead( - currentVersion: statusProvider.serverStatus!.serverVersion, - referenceVersion: 'v0.107.28', - referenceVersionBeta: 'v0.108.0-b.33' - ) == false - ? removePropFromMap(client.toJson(), 'safesearch_enabled') - : removePropFromMap(client.toJson(), 'safe_search') - ); + final result = await clientsProvider.addClient(client); processModal.close(); - if (result['result'] == 'success') { - Clients clientsData = clientsProvider.clients!; - clientsData.clients.add(client); - clientsProvider.setClientsData(clientsData); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientAddedSuccessfully, @@ -60,8 +42,6 @@ class ClientsFab extends StatelessWidget { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientNotAdded, diff --git a/lib/screens/clients/logs_list_client.dart b/lib/screens/clients/logs_list_client.dart index 6fe4782..0ddc99a 100644 --- a/lib/screens/clients/logs_list_client.dart +++ b/lib/screens/clients/logs_list_client.dart @@ -2,6 +2,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:async/async.dart'; +import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/logs/log_tile.dart'; @@ -10,7 +11,6 @@ import 'package:adguard_home_manager/screens/logs/log_details_screen.dart'; import 'package:adguard_home_manager/models/logs.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'; class LogsListClient extends StatefulWidget { final String ip; @@ -53,6 +53,8 @@ class _LogsListClientState extends State { String? responseStatus, String? searchText, }) async { + final serversProvider = Provider.of(context, listen: false); + int offst = inOffset ?? offset; if (loadingMore != null && loadingMore == true) { @@ -62,8 +64,7 @@ class _LogsListClientState extends State { if (cancelableRequest != null) cancelableRequest!.cancel(); cancelableRequest = CancelableOperation.fromFuture( - getLogs( - server: widget.serversProvider.selectedServer!, + serversProvider.apiClient!.getLogs( count: logsQuantity, offset: offst, search: '"${widget.ip}"' diff --git a/lib/screens/clients/search_clients.dart b/lib/screens/clients/search_clients.dart index 569d50c..4d2c754 100644 --- a/lib/screens/clients/search_clients.dart +++ b/lib/screens/clients/search_clients.dart @@ -14,7 +14,6 @@ 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'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; @@ -22,7 +21,6 @@ import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/clients_provider.dart'; import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/providers/status_provider.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class SearchClients extends StatefulWidget { const SearchClients({Key? key}) : super(key: key); @@ -84,7 +82,6 @@ class _SearchClientsState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); final clientsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -95,19 +92,11 @@ class _SearchClientsState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.removingClient); - final result = await postDeleteClient(server: serversProvider.selectedServer!, name: client.name); + final result = await clientsProvider.deleteClient(client); processModal.close(); - if (result['result'] == 'success') { - Clients clientsData = clientsProvider.clients!; - clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList(); - clientsProvider.setClientsData(clientsData); - setState(() { - clients = clientsData.clients; - }); - search(searchController.text); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientDeletedSuccessfully, @@ -115,44 +104,23 @@ class _SearchClientsState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientNotDeleted, color: Colors.red ); } - } + } void confirmEditClient(Client client) async { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingClient); - final result = await postUpdateClient(server: serversProvider.selectedServer!, data: { - 'name': client.name, - 'data': client.toJson() - }); + final result = await clientsProvider.editClient(client); processModal.close(); - if (result['result'] == 'success') { - Clients clientsData = clientsProvider.clients!; - clientsData.clients = clientsData.clients.map((e) { - if (e.name == client.name) { - return client; - } - else { - return e; - } - }).toList(); - clientsProvider.setClientsData(clientsData); - - setState(() { - clients = clientsData.clients; - }); - search(searchController.text); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientUpdatedSuccessfully, @@ -160,8 +128,6 @@ class _SearchClientsState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientNotUpdated, diff --git a/lib/screens/clients/services_modal.dart b/lib/screens/clients/services_modal.dart index 827f2d3..1a98275 100644 --- a/lib/screens/clients/services_modal.dart +++ b/lib/screens/clients/services_modal.dart @@ -2,11 +2,8 @@ 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/app_config_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/filtering_provider.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; class ServicesModal extends StatefulWidget { final List blockedServices; @@ -25,28 +22,14 @@ class ServicesModal extends StatefulWidget { class _ServicesModalStateWidget extends State { List blockedServices = []; - Future loadBlockedServices() async { - final filteringProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - final result = await getBlockedServices(server: serversProvider.selectedServer!); - if (result['result'] == 'success') { - filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.loaded, true); - filteringProvider.setBlockedServiceListData(result['data']); - } - else { - filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.error, true); - appConfigProvider.addLog(result['log']); - } - } + @override void initState() { final filteringProvider = Provider.of(context, listen: false); if (filteringProvider.blockedServicesLoadStatus != LoadStatus.loaded) { - loadBlockedServices(); + filteringProvider.getBlockedServices(); } blockedServices = widget.blockedServices; diff --git a/lib/screens/filters/add_button.dart b/lib/screens/filters/add_button.dart index 34bf53e..0292d3a 100644 --- a/lib/screens/filters/add_button.dart +++ b/lib/screens/filters/add_button.dart @@ -40,18 +40,11 @@ class AddFiltersButton extends StatelessWidget { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingRule); - final List newRules = filteringProvider.filtering!.userRules; - newRules.add(rule); - - final result = await setCustomRules(server: serversProvider.selectedServer!, rules: newRules); + final result = await filteringProvider.addCustomRule(rule); processModal.close(); - if (result['result'] == 'success') { - Filtering filteringData = filteringProvider.filtering!; - filteringData.userRules = newRules; - filteringProvider.setFilteringData(filteringData); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.ruleAddedSuccessfully, @@ -59,8 +52,6 @@ class AddFiltersButton extends StatelessWidget { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.ruleNotAdded, @@ -97,58 +88,25 @@ class AddFiltersButton extends StatelessWidget { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingList); - final result1 = await addFilteringList(server: serversProvider.selectedServer!, data: { - 'name': name, - 'url': url, - 'whitelist': type == 'whitelist' ? true : false - }); + final result = await filteringProvider.addList(name: name, url: url, type: type); - if (result1['result'] == 'success') { - if (result1['data'].toString().contains("OK")) { - final result2 = await getFiltering(server: serversProvider.selectedServer!); - final items = result1['data'].toString().split(' ')[1]; + processModal.close(); - if (result2['result'] == 'success') { - filteringProvider.setFilteringData(result2['data']); - filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result2['log']); - filteringProvider.setFilteringLoadStatus(LoadStatus.error, true); - } - - processModal.close(); - - showSnacbkar( - appConfigProvider: appConfigProvider, - label: "${AppLocalizations.of(context)!.listAdded} $items.", - color: Colors.green - ); - } - else { - processModal.close(); - - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listNotAdded, - color: Colors.red - ); - } + if (result['success'] == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: "${AppLocalizations.of(context)!.listAdded} ${result['data']}.", + color: Colors.green + ); } - else if (result1['result'] == 'error' && result1['log'].statusCode == '400' && result1['log'].resBody.toString().contains("Couldn't fetch filter from url")) { - processModal.close(); - appConfigProvider.addLog(result1['log']); - + else if (result['success'] == false && result['error'] == 'invalid_url') { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.listUrlInvalid, color: Colors.red ); } - else if (result1['result'] == 'error' && result1['log'].statusCode == '400' && result1['log'].resBody.toString().contains('Filter URL already added')) { - processModal.close(); - appConfigProvider.addLog(result1['log']); - + else if (result['success'] == false && result['error'] == 'url_exists') { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.listAlreadyAdded, @@ -156,9 +114,6 @@ class AddFiltersButton extends StatelessWidget { ); } else { - processModal.close(); - appConfigProvider.addLog(result1['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.listNotAdded, diff --git a/lib/screens/filters/blocked_services_screen.dart b/lib/screens/filters/blocked_services_screen.dart index 786711a..75d941b 100644 --- a/lib/screens/filters/blocked_services_screen.dart +++ b/lib/screens/filters/blocked_services_screen.dart @@ -9,9 +9,7 @@ import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/filtering_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class BlockedServicesScreen extends StatefulWidget { final bool dialog; @@ -28,28 +26,12 @@ class BlockedServicesScreen extends StatefulWidget { class _BlockedServicesScreenStateWidget extends State { List values = []; - Future loadBlockedServices() async { - final serversProvider = Provider.of(context, listen: false); - final filteringProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - final result = await getBlockedServices(server: serversProvider.selectedServer!); - if (result['result'] == 'success') { - filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.loaded, true); - filteringProvider.setBlockedServiceListData(result['data']); - } - else { - filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.loaded, true); - appConfigProvider.addLog(result['log']); - } - } - @override void initState() { final filteringProvider = Provider.of(context, listen: false); if (filteringProvider.blockedServicesLoadStatus != LoadStatus.loaded) { - loadBlockedServices(); + filteringProvider.loadBlockedServices(showLoading: true); } values = filteringProvider.filtering!.blockedServices; @@ -59,7 +41,6 @@ class _BlockedServicesScreenStateWidget extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final filteringProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -80,13 +61,11 @@ class _BlockedServicesScreenStateWidget extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.updating); - final result = await setBlockedServices(server: serversProvider.selectedServer!, data: values); + final result = await filteringProvider.updateBlockedServices(values); processModal.close(); - if (result['result'] == 'success') { - filteringProvider.setBlockedServices(values); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.blockedServicesUpdated, @@ -265,7 +244,16 @@ class _BlockedServicesScreenStateWidget extends State { ], ), body: RefreshIndicator( - onRefresh: loadBlockedServices, + onRefresh: () async { + final result = await filteringProvider.loadBlockedServices(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.blockedServicesListNotLoaded, + color: Colors.red + ); + } + }, child: body() ), ); diff --git a/lib/screens/filters/check_host_modal.dart b/lib/screens/filters/check_host_modal.dart index 6678ddb..90e93ab 100644 --- a/lib/screens/filters/check_host_modal.dart +++ b/lib/screens/filters/check_host_modal.dart @@ -6,7 +6,6 @@ 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/get_filtered_status.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; class CheckHostModal extends StatefulWidget { @@ -57,11 +56,11 @@ class _CheckHostModalState extends State { final appConfigProvider = Provider.of(context); void checkHost() async { + setState(() => resultWidget = checking()); + + final result = await serversProvider.apiClient!.checkHostFiltered(host: domainController.text); + if (mounted) { - setState(() => resultWidget = checking()); - - final result = await checkHostFiltered(server: serversProvider.selectedServer!, host: domainController.text); - if (result['result'] == 'success') { final status = getFilteredStatus(context, appConfigProvider, result['data']['reason'], true); if (mounted) { @@ -98,26 +97,24 @@ class _CheckHostModalState extends State { } } else { - if (mounted) { - setState(() => resultWidget = Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Icon( - Icons.cancel, - size: 18, + setState(() => resultWidget = Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Icon( + Icons.cancel, + size: 18, + color: Colors.red, + ), + const SizedBox(width: 10), + Text( + AppLocalizations.of(context)!.check, + style: const TextStyle( color: Colors.red, + fontWeight: FontWeight.w500 ), - const SizedBox(width: 10), - Text( - AppLocalizations.of(context)!.check, - style: const TextStyle( - color: Colors.red, - fontWeight: FontWeight.w500 - ), - ) - ], - )); - } + ) + ], + )); } } } diff --git a/lib/screens/filters/custom_rules_list.dart b/lib/screens/filters/custom_rules_list.dart index 5a96716..8706f1a 100644 --- a/lib/screens/filters/custom_rules_list.dart +++ b/lib/screens/filters/custom_rules_list.dart @@ -2,18 +2,21 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; +import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/filters/add_button.dart'; import 'package:adguard_home_manager/widgets/tab_content_list.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/filtering_provider.dart'; class CustomRulesList extends StatefulWidget { final LoadStatus loadStatus; final ScrollController scrollController; final List data; - final Future Function() fetchData; final void Function(String) onRemoveCustomRule; const CustomRulesList({ @@ -21,7 +24,6 @@ class CustomRulesList extends StatefulWidget { required this.loadStatus, required this.scrollController, required this.data, - required this.fetchData, required this.onRemoveCustomRule }) : super(key: key); @@ -55,6 +57,9 @@ class _CustomRulesListState extends State { @override Widget build(BuildContext context) { + final filteringProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); + bool checkIfComment(String value) { final regex = RegExp(r'^(!|#).*$'); if (regex.hasMatch(value)) { @@ -155,7 +160,16 @@ class _CustomRulesListState extends State { ), const SizedBox(height: 30), TextButton.icon( - onPressed: widget.fetchData, + onPressed: () async { + final result = await filteringProvider.fetchFilters(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.errorLoadFilters, + color: Colors.red + ); + } + }, icon: const Icon(Icons.refresh_rounded), label: Text(AppLocalizations.of(context)!.refresh), ) @@ -186,7 +200,16 @@ class _CustomRulesListState extends State { ), ), loadStatus: widget.loadStatus, - onRefresh: widget.fetchData, + onRefresh: () async { + final result = await filteringProvider.fetchFilters(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.errorLoadFilters, + color: Colors.red + ); + } + }, fab: AddFiltersButton( type: 'custom_rule', widget: (fn) => FloatingActionButton( diff --git a/lib/screens/filters/filters.dart b/lib/screens/filters/filters.dart index 763eb95..00cc214 100644 --- a/lib/screens/filters/filters.dart +++ b/lib/screens/filters/filters.dart @@ -21,9 +21,7 @@ import 'package:adguard_home_manager/providers/filtering_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/models/filtering.dart'; import 'package:adguard_home_manager/constants/enums.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/clients.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class Filters extends StatefulWidget { const Filters({Key? key}) : super(key: key); @@ -33,83 +31,41 @@ class Filters extends StatefulWidget { } class _FiltersState extends State { - Future fetchFilters() async { - final filteringProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - filteringProvider.setFilteringLoadStatus(LoadStatus.loading, false); - - final result = await getFiltering(server: serversProvider.selectedServer!); - - if (mounted) { - if (result['result'] == 'success') { - filteringProvider.setFilteringData(result['data']); - filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, false); - } - else { - appConfigProvider.addLog(result['log']); - filteringProvider.setFilteringLoadStatus(LoadStatus.error, false); - } - } - } - List generateClientsList(List clients, List ips) { return clients.where((client) => ips.contains(client.ip)).toList(); } @override void initState() { - fetchFilters(); + final filteringProvider = Provider.of(context, listen: false); + filteringProvider.fetchFilters(showLoading: true); super.initState(); } @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final filteringProvider = Provider.of(context); final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; - void fetchUpdateLists() async { + void updateLists() async { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.updatingLists); - final result = await updateLists(server: serversProvider.selectedServer!); + final result = await filteringProvider.updateLists(); - if (result['result'] == 'success') { - final result2 = await getFiltering(server: serversProvider.selectedServer!); + processModal.close(); - processModal.close(); - - if (mounted) { - if (result2['result'] == 'success') { - filteringProvider.setFilteringData(result2['data']); - - showSnacbkar( - appConfigProvider: appConfigProvider, - label: "${result['data']['updated']} ${AppLocalizations.of(context)!.listsUpdated}", - color: Colors.green - ); - } - else { - appConfigProvider.addLog(result2['log']); - - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listsNotLoaded, - color: Colors.red - ); - } - } - + if (result['success'] == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: "${result['data']['updated']} ${AppLocalizations.of(context)!.listsUpdated}", + color: Colors.green + ); } else { - processModal.close(); - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.listsNotUpdated, @@ -149,16 +105,11 @@ class _FiltersState extends State { : AppLocalizations.of(context)!.enableFiltering ); - final result = await updateFiltering( - server: serversProvider.selectedServer!, - enable: !statusProvider.serverStatus!.filteringEnabled - ); + final result = await filteringProvider.enableDisableFiltering(); processModal.close(); - if (result['result'] == 'success') { - filteringProvider.setFilteringProtectionStatus(!statusProvider.serverStatus!.filteringEnabled); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.filteringStatusUpdated, @@ -178,16 +129,11 @@ class _FiltersState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.changingUpdateFrequency); - final result = await requestChangeUpdateFrequency(server: serversProvider.selectedServer!, data: { - "enabled": filteringProvider.filtering!.enabled, - "interval": value - }); + final result = await filteringProvider.changeUpdateFrequency(value); processModal.close(); - if (result['result'] == 'success') { - filteringProvider.setFiltersUpdateFrequency(value); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.updateFrequencyChanged, @@ -230,17 +176,11 @@ class _FiltersState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.deletingRule); - final List newRules = filteringProvider.filtering!.userRules.where((r) => r != rule).toList(); - - final result = await setCustomRules(server: serversProvider.selectedServer!, rules: newRules); + final result = await filteringProvider.removeCustomRule(rule); processModal.close(); - if (result['result'] == 'success') { - Filtering filteringData = filteringProvider.filtering!; - filteringData.userRules = newRules; - filteringProvider.setFilteringData(filteringData); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.ruleRemovedSuccessfully, @@ -248,13 +188,11 @@ class _FiltersState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.ruleNotRemoved, color: Colors.red - ); + ); } } @@ -295,7 +233,7 @@ class _FiltersState extends State { List actions() { if (filteringProvider.loadStatus == LoadStatus.loaded) { return [ - IconButton( + if (statusProvider.loadStatus == LoadStatus.loaded) IconButton( onPressed: enableDisableFiltering, tooltip: filteringProvider.filtering!.enabled == true ? AppLocalizations.of(context)!.disableFiltering @@ -364,7 +302,7 @@ class _FiltersState extends State { PopupMenuButton( itemBuilder: (context) => [ PopupMenuItem( - onTap: fetchUpdateLists, + onTap: updateLists, child: Row( children: [ const Icon(Icons.sync_rounded), @@ -408,13 +346,11 @@ class _FiltersState extends State { onRemoveCustomRule: openRemoveCustomRuleModal, onOpenDetailsModal: openListDetails, actions: actions(), - refreshData: fetchFilters, ); } else { return FiltersTabsView( - appConfigProvider: appConfigProvider, - fetchFilters: fetchFilters, + appConfigProvider: appConfigProvider, actions: actions(), onRemoveCustomRule: openRemoveCustomRuleModal, onOpenDetailsModal: openListDetails, diff --git a/lib/screens/filters/filters_list.dart b/lib/screens/filters/filters_list.dart index 8f87b34..3fdf3d5 100644 --- a/lib/screens/filters/filters_list.dart +++ b/lib/screens/filters/filters_list.dart @@ -14,6 +14,8 @@ import 'package:adguard_home_manager/widgets/tab_content_list.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/providers/filtering_provider.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; import 'package:adguard_home_manager/models/filtering.dart'; @@ -21,7 +23,6 @@ class FiltersList extends StatefulWidget { final LoadStatus loadStatus; final ScrollController scrollController; final List data; - final Future Function() fetchData; final String type; final void Function(Filter, String) onOpenDetailsScreen; @@ -30,7 +31,6 @@ class FiltersList extends StatefulWidget { required this.loadStatus, required this.scrollController, required this.data, - required this.fetchData, required this.type, required this.onOpenDetailsScreen }) : super(key: key); @@ -65,6 +65,7 @@ class _FiltersListState extends State { @override Widget build(BuildContext context) { + final filteringProvider = Provider.of(context); final appConfigProvider = Provider.of(context); return CustomTabContentList( @@ -129,7 +130,16 @@ class _FiltersListState extends State { ), const SizedBox(height: 30), TextButton.icon( - onPressed: widget.fetchData, + onPressed: () async { + final result = await filteringProvider.fetchFilters(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.errorLoadFilters, + color: Colors.red + ); + } + }, icon: const Icon(Icons.refresh_rounded), label: Text(AppLocalizations.of(context)!.refresh), ) @@ -160,7 +170,16 @@ class _FiltersListState extends State { ), ), loadStatus: widget.loadStatus, - onRefresh: widget.fetchData, + onRefresh: () async { + final result = await filteringProvider.fetchFilters(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.errorLoadFilters, + color: Colors.red + ); + } + }, fab: AddFiltersButton( type: widget.type, widget: (fn) => FloatingActionButton( diff --git a/lib/screens/filters/filters_tabs_view.dart b/lib/screens/filters/filters_tabs_view.dart index a4c08cd..81cd67a 100644 --- a/lib/screens/filters/filters_tabs_view.dart +++ b/lib/screens/filters/filters_tabs_view.dart @@ -12,7 +12,6 @@ import 'package:adguard_home_manager/providers/app_config_provider.dart'; class FiltersTabsView extends StatefulWidget { final AppConfigProvider appConfigProvider; - final Future Function() fetchFilters; final List actions; final void Function(String) onRemoveCustomRule; final void Function(Filter, String) onOpenDetailsModal; @@ -20,7 +19,6 @@ class FiltersTabsView extends StatefulWidget { const FiltersTabsView({ Key? key, required this.appConfigProvider, - required this.fetchFilters, required this.actions, required this.onOpenDetailsModal, required this.onRemoveCustomRule @@ -36,7 +34,6 @@ class _FiltersTabsViewState extends State with TickerProviderSt @override void initState() { - widget.fetchFilters(); super.initState(); tabController = TabController( initialIndex: 0, @@ -115,7 +112,6 @@ class _FiltersTabsViewState extends State with TickerProviderSt type: 'whitelist', data: filteringProvider.loadStatus == LoadStatus.loaded ? filteringProvider.filtering!.whitelistFilters : [], - fetchData: widget.fetchFilters, onOpenDetailsScreen: widget.onOpenDetailsModal, ), FiltersList( @@ -124,7 +120,6 @@ class _FiltersTabsViewState extends State with TickerProviderSt type: 'blacklist', data: filteringProvider.loadStatus == LoadStatus.loaded ? filteringProvider.filtering!.filters : [], - fetchData: widget.fetchFilters, onOpenDetailsScreen: widget.onOpenDetailsModal, ), CustomRulesList( @@ -132,7 +127,6 @@ class _FiltersTabsViewState extends State with TickerProviderSt scrollController: scrollController, data: filteringProvider.loadStatus == LoadStatus.loaded ? filteringProvider.filtering!.userRules : [], - fetchData: widget.fetchFilters, onRemoveCustomRule: widget.onRemoveCustomRule, ), ] diff --git a/lib/screens/filters/filters_triple_column.dart b/lib/screens/filters/filters_triple_column.dart index ba65e12..c481749 100644 --- a/lib/screens/filters/filters_triple_column.dart +++ b/lib/screens/filters/filters_triple_column.dart @@ -14,6 +14,7 @@ import 'package:adguard_home_manager/widgets/options_modal.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/models/menu_option.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/copy_clipboard.dart'; import 'package:adguard_home_manager/providers/filtering_provider.dart'; import 'package:adguard_home_manager/models/filtering.dart'; @@ -24,14 +25,12 @@ class FiltersTripleColumn extends StatelessWidget { final void Function(String) onRemoveCustomRule; final void Function(Filter, String) onOpenDetailsModal; final List actions; - final Future Function() refreshData; const FiltersTripleColumn({ Key? key, required this.onRemoveCustomRule, required this.onOpenDetailsModal, required this.actions, - required this.refreshData }) : super(key: key); @override @@ -330,7 +329,16 @@ class FiltersTripleColumn extends StatelessWidget { title: Text(AppLocalizations.of(context)!.filters), actions: [ IconButton( - onPressed: refreshData, + onPressed: () async { + final result = await filteringProvider.fetchFilters(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.errorLoadFilters, + color: Colors.red + ); + } + }, icon: const Icon(Icons.refresh_rounded), tooltip: AppLocalizations.of(context)!.refresh, ), diff --git a/lib/screens/filters/list_details_screen.dart b/lib/screens/filters/list_details_screen.dart index f68693b..42464ec 100644 --- a/lib/screens/filters/list_details_screen.dart +++ b/lib/screens/filters/list_details_screen.dart @@ -9,11 +9,11 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/filters/add_list_modal.dart'; import 'package:adguard_home_manager/screens/filters/delete_list_modal.dart'; -import 'package:adguard_home_manager/screens/filters/list_functions.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/functions/format_time.dart'; import 'package:adguard_home_manager/providers/filtering_provider.dart'; +import 'package:adguard_home_manager/classes/process_modal.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/filtering.dart'; @@ -76,6 +76,35 @@ class _ListDetailsScreenState extends State { // ------- // } + void updateList(FilteringListActions action) async { + ProcessModal processModal = ProcessModal(context: context); + processModal.open( + list!.enabled == true + ? AppLocalizations.of(context)!.disablingList + : AppLocalizations.of(context)!.enablingList, + ); + final result = await filteringProvider.updateList( + list: list, + type: widget.type, + action: action + ); + processModal.close(); + if (result == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.listDataUpdated, + color: Colors.green + ); + } + else { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.listDataNotUpdated, + color: Colors.red + ); + } + } + List content() { return [ CustomListTile( @@ -174,27 +203,9 @@ class _ListDetailsScreenState extends State { builder: (ctx) => AddListModal( list: list, type: widget.type, - onEdit: ({required Filter list, required String type}) async { - final result = await editList( - context: context, - list: list, - type: widget.type - ); - if (result == true) { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataUpdated, - color: Colors.green - ); - } - else { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataNotUpdated, - color: Colors.red - ); - } - }, + onEdit: ({required Filter list, required String type}) async => updateList( + FilteringListActions.edit + ), dialog: true, ), ) @@ -205,27 +216,9 @@ class _ListDetailsScreenState extends State { builder: (ctx) => AddListModal( list: list, type: widget.type, - onEdit: ({required Filter list, required String type}) async { - final result = await editList( - context: context, - list: list, - type: widget.type - ); - if (result == true) { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataUpdated, - color: Colors.green - ); - } - else { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataNotUpdated, - color: Colors.red - ); - } - }, + onEdit: ({required Filter list, required String type}) async => updateList( + FilteringListActions.edit + ), dialog: false, ), isScrollControlled: true, @@ -242,11 +235,13 @@ class _ListDetailsScreenState extends State { context: context, builder: (c) => DeleteListModal( onConfirm: () async { - final result = await deleteList( - context: context, - list: list!, + ProcessModal processModal = ProcessModal(context: context); + processModal.open(AppLocalizations.of(context)!.deletingList); + final result = await filteringProvider.deleteList( + listUrl: list!.url, type: widget.type, ); + processModal.close(); if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, @@ -306,27 +301,11 @@ class _ListDetailsScreenState extends State { if (list != null) Row( children: [ IconButton( - onPressed: () async { - final result = await enableDisableList( - context: context, - list: list!, - listType: widget.type, - ); - if (result == true) { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataUpdated, - color: Colors.green - ); - } - else { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataNotUpdated, - color: Colors.red - ); - } - }, + onPressed: () => updateList( + list!.enabled == true + ? FilteringListActions.disable + : FilteringListActions.enable + ), icon: Icon( list.enabled == true ? Icons.gpp_bad_rounded @@ -391,27 +370,11 @@ class _ListDetailsScreenState extends State { : -70, right: 20, child: FloatingActionButton( - onPressed: () async { - final result = await enableDisableList( - context: context, - list: list!, - listType: widget.type, - ); - if (result == true) { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataUpdated, - color: Colors.green - ); - } - else { - showSnacbkar( - appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.listDataNotUpdated, - color: Colors.red - ); - } - }, + onPressed: () => updateList( + list!.enabled == true + ? FilteringListActions.disable + : FilteringListActions.enable + ), child: Icon( list.enabled == true ? Icons.gpp_bad_rounded diff --git a/lib/screens/filters/list_functions.dart b/lib/screens/filters/list_functions.dart deleted file mode 100644 index 2075495..0000000 --- a/lib/screens/filters/list_functions.dart +++ /dev/null @@ -1,149 +0,0 @@ -// ignore_for_file: use_build_context_synchronously - -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; - -import 'package:adguard_home_manager/classes/process_modal.dart'; -import 'package:adguard_home_manager/providers/filtering_provider.dart'; -import 'package:adguard_home_manager/models/filtering.dart'; -import 'package:adguard_home_manager/constants/enums.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'; - -Future enableDisableList({ - required BuildContext context, - required Filter list, - required String listType, -}) async { - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - final filteringProvider = Provider.of(context, listen: false); - - ProcessModal processModal = ProcessModal(context: context); - processModal.open( - list.enabled == true - ? AppLocalizations.of(context)!.disablingList - : AppLocalizations.of(context)!.enablingList, - ); - - final result = await updateFilterList(server: serversProvider.selectedServer!, data: { - "data": { - "enabled": !list.enabled, - "name": list.name, - "url": list.url - }, - "url": list.url, - "whitelist": listType == 'whitelist' ? true : false - }); - - processModal.close(); - - if (result['result'] == 'success') { - final result2 = await getFiltering(server: serversProvider.selectedServer!); - - if (result2['result'] == 'success') { - filteringProvider.setFilteringData(result2['data']); - filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result2['log']); - filteringProvider.setFilteringLoadStatus(LoadStatus.error, true); - } - - return true; - } - else { - appConfigProvider.addLog(result['log']); - - return false; - } -} - -Future editList({ - required BuildContext context, - required Filter list, - required String type -}) async { - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - final filteringProvider = Provider.of(context, listen: false); - - ProcessModal processModal = ProcessModal(context: context); - processModal.open(AppLocalizations.of(context)!.updatingListData); - - final result1 = await updateFilterList(server: serversProvider.selectedServer!, data: { - "data": { - "enabled": list.enabled, - "name": list.name, - "url": list.url - }, - "url": list.url, - "whitelist": type == 'whitelist' ? true : false - }); - - if (result1['result'] == 'success') { - final result2 = await getFiltering(server: serversProvider.selectedServer!); - - if (result2['result'] == 'success') { - filteringProvider.setFilteringData(result2['data']); - filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result2['log']); - filteringProvider.setFilteringLoadStatus(LoadStatus.error, true); - } - - processModal.close(); - - return true; - } - else { - processModal.close(); - appConfigProvider.addLog(result1['log']); - - return false; - } -} - -Future deleteList({ - required BuildContext context, - required Filter list, - required String type -}) async { - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - final filteringProvider = Provider.of(context, listen: false); - - ProcessModal processModal = ProcessModal(context: context); - processModal.open(AppLocalizations.of(context)!.deletingList); - - final result1 = await deleteFilterList(server: serversProvider.selectedServer!, data: { - "url": list.url, - "whitelist": type == 'whitelist' ? true : false - }); - - if (result1['result'] == 'success') { - final result2 = await getFiltering(server: serversProvider.selectedServer!); - - if (result2['result'] == 'success') { - filteringProvider.setFilteringData(result2['data']); - filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result2['log']); - filteringProvider.setFilteringLoadStatus(LoadStatus.loading, true); - } - - processModal.close(); - - return true; - } - else { - processModal.close(); - appConfigProvider.addLog(result1['log']); - - return false; - } -} \ No newline at end of file diff --git a/lib/screens/filters/list_options_menu.dart b/lib/screens/filters/list_options_menu.dart index 7a9dc2a..6482ecd 100644 --- a/lib/screens/filters/list_options_menu.dart +++ b/lib/screens/filters/list_options_menu.dart @@ -1,16 +1,17 @@ // ignore_for_file: use_build_context_synchronously +import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:flutter/material.dart'; import 'package:contextmenu/contextmenu.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:adguard_home_manager/screens/filters/list_functions.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/widgets/options_modal.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/models/filtering.dart'; +import 'package:adguard_home_manager/providers/filtering_provider.dart'; import 'package:adguard_home_manager/functions/copy_clipboard.dart'; import 'package:adguard_home_manager/models/menu_option.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; @@ -29,14 +30,27 @@ class ListOptionsMenu extends StatelessWidget { @override Widget build(BuildContext context) { + final filteringProvider = Provider.of(context); final appConfigProvider = Provider.of(context); void enableDisable() async { - final result = await enableDisableList( - context: context, - list: list, - listType: listType, + ProcessModal processModal = ProcessModal(context: context); + processModal.open( + list.enabled == true + ? AppLocalizations.of(context)!.disablingList + : AppLocalizations.of(context)!.enablingList ); + + final result = await filteringProvider.updateList( + list: list, + type: listType, + action: list.enabled == true + ? FilteringListActions.disable + : FilteringListActions.enable + ); + + processModal.close(); + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index 31912e9..e288175 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -18,9 +18,7 @@ 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'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class Home extends StatefulWidget { const Home({Key? key}) : super(key: key); @@ -35,6 +33,8 @@ class _HomeState extends State { @override initState(){ + Provider.of(context, listen: false).getServerStatus(); + super.initState(); isVisible = true; @@ -56,7 +56,6 @@ class _HomeState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -280,14 +279,8 @@ class _HomeState extends State { builder: (context) => RefreshIndicator( color: Theme.of(context).colorScheme.primary, onRefresh: () async { - final result = await getServerStatus(serversProvider.selectedServer!); - if (result['result'] == 'success') { - statusProvider.setServerStatusData( - data: result['data'] - ); - } - else { - appConfigProvider.addLog(result['log']); + final result = await statusProvider.getServerStatus(); + if (result == false) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.serverStatusNotRefreshed, diff --git a/lib/screens/home/management_modal.dart b/lib/screens/home/management_modal.dart index 5329d3c..f35820c 100644 --- a/lib/screens/home/management_modal.dart +++ b/lib/screens/home/management_modal.dart @@ -13,8 +13,6 @@ 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'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class ManagementModal extends StatefulWidget { final bool dialog; @@ -74,7 +72,6 @@ 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); @@ -92,16 +89,12 @@ class _ManagementModalState extends State with SingleTickerProv setState(() { timer.cancel(); }); - final result = await getServerStatus(serversProvider.selectedServer!); - if (result['result'] == 'success') { - statusProvider.setServerStatusData( - data: result['data'] - ); + final result = await statusProvider.getServerStatus(); + if (result == false) { + setState(() { + start = start - 1; + }); } - } else { - setState(() { - start = start - 1; - }); } }, ); @@ -133,7 +126,6 @@ class _ManagementModalState extends State with SingleTickerProv int? time }) async { final result = await statusProvider.updateBlocking( - server: serversProvider.selectedServer!, block: filter, newStatus: value, time: time diff --git a/lib/screens/home/top_items.dart b/lib/screens/home/top_items.dart index 6356b7a..f2b836c 100644 --- a/lib/screens/home/top_items.dart +++ b/lib/screens/home/top_items.dart @@ -9,17 +9,14 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/domain_options.dart'; import 'package:adguard_home_manager/screens/top_items/top_items_modal.dart'; -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/functions/snackbar.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'; -import 'package:adguard_home_manager/models/filtering_status.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; class TopItems extends StatelessWidget { final String type; @@ -37,7 +34,6 @@ 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); @@ -60,52 +56,26 @@ class TopItems extends StatelessWidget { final ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingUserFilters); - final rules = await getFilteringRules(server: serversProvider.selectedServer!); + final rules = await statusProvider.blockUnblockDomain( + domain: domain, + newStatus: newStatus + ); - if (rules['result'] == 'success') { - FilteringStatus oldStatus = statusProvider.serverStatus!.filteringStatus; + processModal.close(); - List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); - if (newStatus == 'block') { - newRules.add("||$domain^"); - } - else if (newStatus == 'unblock') { - newRules.add("@@||$domain^"); - } - FilteringStatus newObj = statusProvider.serverStatus!.filteringStatus; - newObj.userRules = newRules; - statusProvider.setFilteringStatus(newObj); - - final result = await postFilteringRules(server: serversProvider.selectedServer!, data: {'rules': newRules}); - - processModal.close(); - - if (result['result'] == 'success') { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated), - backgroundColor: Colors.green, - ) - ); - } - else { - appConfigProvider.addLog(result['log']); - statusProvider.setFilteringStatus(oldStatus); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated), - backgroundColor: Colors.red, - ) - ); - } + if (rules == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.userFilteringRulesUpdated, + color: Colors.green + ); } else { - appConfigProvider.addLog(rules['log']); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated), - backgroundColor: Colors.red, - ) + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.userFilteringRulesNotUpdated, + color: Colors.red + ); } } @@ -143,15 +113,6 @@ class TopItems extends StatelessWidget { ]; } - void openOptionsModal(String domain, String type) { - showDialog( - context: context, - builder: (context) => OptionsModal( - options: generateOptions(domain), - ) - ); - } - Widget rowItem(Map item) { String? name; if (clients != null && clients == true) { diff --git a/lib/screens/logs/clients_modal.dart b/lib/screens/logs/clients_modal.dart index bd39541..fcd9d74 100644 --- a/lib/screens/logs/clients_modal.dart +++ b/lib/screens/logs/clients_modal.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/clients_provider.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; class ClientsModal extends StatefulWidget { @@ -32,6 +33,7 @@ class _ClientsModalState extends State { @override Widget build(BuildContext context) { final logsProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final height = MediaQuery.of(context).size.height; @@ -86,7 +88,7 @@ class _ClientsModalState extends State { void selectAll() { setState(() { - selectedClients = logsProvider.clients!.map((item) => item.ip).toList(); + selectedClients = clientsProvider.clients!.autoClients.map((item) => item.ip).toList(); }); } @@ -126,20 +128,20 @@ class _ClientsModalState extends State { ), Flexible( child: ListView.builder( - itemCount: logsProvider.clients!.length, + itemCount: clientsProvider.clients!.autoClients.length, itemBuilder: (context, index) => listItem( - label: logsProvider.clients![index].ip, + label: clientsProvider.clients!.autoClients[index].ip, onChanged: () { - if (selectedClients.contains(logsProvider.clients![index].ip)) { + if (selectedClients.contains(clientsProvider.clients!.autoClients[index].ip)) { setState(() { selectedClients = selectedClients.where( - (item) => item != logsProvider.clients![index].ip + (item) => item != clientsProvider.clients!.autoClients[index].ip ).toList(); }); } else { setState(() { - selectedClients.add(logsProvider.clients![index].ip); + selectedClients.add(clientsProvider.clients!.autoClients[index].ip); }); } } @@ -152,11 +154,11 @@ class _ClientsModalState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextButton( - onPressed: selectedClients.length == logsProvider.clients!.length + onPressed: selectedClients.length == clientsProvider.clients!.autoClients.length ? () => unselectAll() : () => selectAll(), child: Text( - selectedClients.length == logsProvider.clients!.length + selectedClients.length == clientsProvider.clients!.autoClients.length ? AppLocalizations.of(context)!.unselectAll : AppLocalizations.of(context)!.selectAll ) diff --git a/lib/screens/logs/log_details_screen.dart b/lib/screens/logs/log_details_screen.dart index 1f6c100..32fbd73 100644 --- a/lib/screens/logs/log_details_screen.dart +++ b/lib/screens/logs/log_details_screen.dart @@ -10,12 +10,11 @@ import 'package:adguard_home_manager/screens/logs/log_list_tile.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/get_filtered_status.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/models/logs.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/format_time.dart'; import 'package:adguard_home_manager/models/filtering_status.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; class LogDetailsScreen extends StatelessWidget { @@ -30,7 +29,6 @@ class LogDetailsScreen extends StatelessWidget { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final statusProvider = Provider.of(context); @@ -55,56 +53,29 @@ class LogDetailsScreen extends StatelessWidget { ); } - void blockUnblock(Log log, String newStatus) async { + void blockUnblock(String domain, String newStatus) async { final ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingUserFilters); - final rules = await getFilteringRules(server: serversProvider.selectedServer!); + final rules = await statusProvider.blockUnblockDomain( + domain: domain, + newStatus: newStatus + ); - if (rules['result'] == 'success') { - FilteringStatus oldStatus = statusProvider.filteringStatus!; + processModal.close(); - List newRules = rules['data'].userRules.where((domain) => !domain.contains(log.question.name)).toList(); - if (newStatus == 'block') { - newRules.add("||${log.question.name}^"); - } - else if (newStatus == 'unblock') { - newRules.add("@@||${log.question.name}^"); - } - FilteringStatus newObj = statusProvider.filteringStatus!; - newObj.userRules = newRules; - statusProvider.setFilteringStatus(newObj); - - final result = await postFilteringRules(server: serversProvider.selectedServer!, data: {'rules': newRules}); - - processModal.close(); - - if (result['result'] == 'success') { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated), - backgroundColor: Colors.green, - ) - ); - } - else { - appConfigProvider.addLog(result['log']); - statusProvider.setFilteringStatus(oldStatus); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated), - backgroundColor: Colors.red, - ) - ); - } + if (rules == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.userFilteringRulesUpdated, + color: Colors.green + ); } else { - appConfigProvider.addLog(rules['log']); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated), - backgroundColor: Colors.red, - ) + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.userFilteringRulesNotUpdated, + color: Colors.red ); } } @@ -268,7 +239,12 @@ class LogDetailsScreen extends StatelessWidget { Row( children: [ IconButton( - onPressed: () => blockUnblock(log, getFilteredStatus(context, appConfigProvider, log.reason, true)['filtered'] == true ? 'unblock' : 'block'), + onPressed: log.question.name != null + ? () => blockUnblock( + log.question.name!, + getFilteredStatus(context, appConfigProvider, log.reason, true)['filtered'] == true ? 'unblock' : 'block' + ) + : null, icon: Icon( getFilteredStatus(context, appConfigProvider, log.reason, true)['filtered'] == true ? Icons.check_circle_rounded @@ -301,7 +277,12 @@ class LogDetailsScreen extends StatelessWidget { title: Text(AppLocalizations.of(context)!.logDetails), actions: [ if (statusProvider.filteringStatus != null) IconButton( - onPressed: () => blockUnblock(log, getFilteredStatus(context, appConfigProvider, log.reason, true)['filtered'] == true ? 'unblock' : 'block'), + onPressed: log.question.name != null + ? () => blockUnblock( + log.question.name!, + getFilteredStatus(context, appConfigProvider, log.reason, true)['filtered'] == true ? 'unblock' : 'block' + ) + : null, icon: Icon( getFilteredStatus(context, appConfigProvider, log.reason, true)['filtered'] == true ? Icons.check_circle_rounded diff --git a/lib/screens/logs/logs.dart b/lib/screens/logs/logs.dart index b70e7b7..a48024c 100644 --- a/lib/screens/logs/logs.dart +++ b/lib/screens/logs/logs.dart @@ -15,10 +15,11 @@ 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/clients_provider.dart'; +import 'package:adguard_home_manager/constants/enums.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'; import 'package:adguard_home_manager/models/logs.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -31,125 +32,44 @@ class Logs extends StatefulWidget { class _LogsState extends State { late ScrollController scrollController; - - bool isLoadingMore = false; bool showDivider = true; Log? selectedLog; - Future fetchLogs({ - int? inOffset, - bool? loadingMore, - String? responseStatus, - String? searchText, - }) async { - final logsProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - - int offst = inOffset ?? logsProvider.offset; - - String resStatus = responseStatus ?? logsProvider.selectedResultStatus; - String? search = searchText ?? logsProvider.searchText; - - if (loadingMore != null && loadingMore == true) { - setState(() => isLoadingMore = true); - } - - final result = await getLogs( - server: serversProvider.selectedServer!, - count: logsProvider.logsQuantity, - offset: offst, - olderThan: logsProvider.logsOlderThan, - responseStatus: resStatus, - search: search - ); - - if (loadingMore != null && loadingMore == true) { - setState(() => isLoadingMore = false); - } - - if (mounted) { - if (result['result'] == 'success') { - logsProvider.setOffset(inOffset != null ? inOffset+logsProvider.logsQuantity : logsProvider.offset+logsProvider.logsQuantity); - if (loadingMore != null && loadingMore == true && logsProvider.logsData != null) { - LogsData newLogsData = result['data']; - newLogsData.data = [...logsProvider.logsData!.data, ...result['data'].data]; - if (logsProvider.appliedFilters.clients != null) { - newLogsData.data = newLogsData.data.where( - (item) => logsProvider.appliedFilters.clients!.contains(item.client) - ).toList(); - } - logsProvider.setLogsData(newLogsData); - } - else { - LogsData newLogsData = result['data']; - if (logsProvider.appliedFilters.clients != null) { - newLogsData.data = newLogsData.data.where( - (item) => logsProvider.appliedFilters.clients!.contains(item.client) - ).toList(); - } - logsProvider.setLogsData(newLogsData); - } - logsProvider.setLoadStatus(1); - } - else { - logsProvider.setLoadStatus(2); - appConfigProvider.addLog(result['log']); - } - } - } - void fetchFilteringRules() async { final appConfigProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); final statusProvider = Provider.of(context, listen: false); - final result = await getFilteringRules(server: serversProvider.selectedServer!); - if (mounted) { - if (result['result'] == 'success') { - statusProvider.setFilteringStatus(result['data']); - } - else { - appConfigProvider.addLog(result['log']); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.couldntGetFilteringStatus), - backgroundColor: Colors.red, - ) - ); - } + final result = await statusProvider.getFilteringRules(); + if (mounted && result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.couldntGetFilteringStatus, + color: Colors.red + ); } } Future fetchClients() async { - final logsProvider = Provider.of(context, listen: false); + final clientsProvider = Provider.of(context, listen: false); final appConfigProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final result = await getClients(serversProvider.selectedServer!); - if (mounted) { - if (result['result'] == 'success') { - logsProvider.setClientsLoadStatus(1); - logsProvider.setClients(result['data'].autoClients); - } - else { - logsProvider.setClientsLoadStatus(2); - appConfigProvider.addLog(result['log']); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.couldntGetFilteringStatus), - backgroundColor: Colors.red, - ) - ); - } + final result = await clientsProvider.fetchClients(); + if (mounted && result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.couldntGetFilteringStatus, + color: Colors.red + ); } } void scrollListener() { - if (scrollController.position.extentAfter < 500 && isLoadingMore == false) { - fetchLogs(loadingMore: true); + final logsProvider = Provider.of(context, listen: false); + + if (scrollController.position.extentAfter < 500 && logsProvider.isLoadingMore == false) { + logsProvider.fetchLogs(loadingMore: true); } if (scrollController.position.pixels > 0) { setState(() => showDivider = false); @@ -161,8 +81,10 @@ class _LogsState extends State { @override void initState() { + final logsProvider = Provider.of(context, listen: false); + scrollController = ScrollController()..addListener(scrollListener); - fetchLogs(inOffset: 0); + logsProvider.fetchLogs(inOffset: 0); fetchFilteringRules(); fetchClients(); super.initState(); @@ -186,8 +108,8 @@ class _LogsState extends State { referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true - ? await updateQueryLogParameters(server: serversProvider.selectedServer!, data: data) - : await updateQueryLogParametersLegacy(server: serversProvider.selectedServer!, data: data); + ? await serversProvider.apiClient!.updateQueryLogParameters(data: data) + : await serversProvider.apiClient!.updateQueryLogParametersLegacy(data: data); processModal.close(); @@ -213,7 +135,7 @@ class _LogsState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.updatingSettings); - final result = await clearLogs(server: serversProvider.selectedServer!); + final result = await serversProvider.apiClient!.clearLogs(); processModal.close(); @@ -225,8 +147,6 @@ class _LogsState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.logsNotCleared, @@ -271,7 +191,7 @@ class _LogsState extends State { Widget generateBody() { switch (logsProvider.loadStatus) { - case 0: + case LoadStatus.loading: return SizedBox( width: double.maxFinite, child: Column( @@ -291,20 +211,20 @@ class _LogsState extends State { ), ); - case 1: + case LoadStatus.loaded: return RefreshIndicator( onRefresh: () async { - await fetchLogs(inOffset: 0); + await logsProvider.fetchLogs(inOffset: 0); }, child: logsProvider.logsData!.data.isNotEmpty ? ListView.builder( controller: scrollController, padding: const EdgeInsets.only(top: 0), - itemCount: isLoadingMore == true + itemCount: logsProvider.isLoadingMore == true ? logsProvider.logsData!.data.length+1 : logsProvider.logsData!.data.length, itemBuilder: (context, index) { - if (isLoadingMore == true && index == logsProvider.logsData!.data.length) { + if (logsProvider.isLoadingMore == true && index == logsProvider.logsData!.data.length) { return const Padding( padding: EdgeInsets.symmetric(vertical: 20), child: Center( @@ -367,7 +287,7 @@ class _LogsState extends State { ) ); - case 2: + case LoadStatus.error: return SizedBox( width: double.maxFinite, child: Column( @@ -403,11 +323,11 @@ class _LogsState extends State { centerTitle: false, actions: [ if (!(Platform.isAndroid || Platform.isIOS)) IconButton( - onPressed: () => fetchLogs(inOffset: 0), + onPressed: () => logsProvider.fetchLogs(inOffset: 0), icon: const Icon(Icons.refresh_rounded), tooltip: AppLocalizations.of(context)!.refresh, ), - logsProvider.loadStatus == 1 + logsProvider.loadStatus == LoadStatus.loaded ? IconButton( onPressed: openFilersModal, icon: const Icon(Icons.filter_list_rounded), @@ -492,7 +412,7 @@ class _LogsState extends State { ) ); logsProvider.setSearchText(null); - fetchLogs( + logsProvider.fetchLogs( inOffset: 0, searchText: '' ); @@ -525,7 +445,7 @@ class _LogsState extends State { ) ); logsProvider.setSelectedResultStatus('all'); - fetchLogs( + logsProvider.fetchLogs( inOffset: 0, responseStatus: 'all' ); @@ -560,7 +480,7 @@ class _LogsState extends State { ) ); logsProvider.setSelectedClients(null); - fetchLogs( + logsProvider.fetchLogs( inOffset: 0, responseStatus: logsProvider.appliedFilters.selectedResultStatus ); diff --git a/lib/screens/logs/logs_config_modal.dart b/lib/screens/logs/logs_config_modal.dart index 26ef299..2f16721 100644 --- a/lib/screens/logs/logs_config_modal.dart +++ b/lib/screens/logs/logs_config_modal.dart @@ -4,7 +4,6 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -74,13 +73,15 @@ class _LogsConfigModalWidgetState extends State { int loadStatus = 0; void loadData() async { + final serversProvider = Provider.of(context, listen: false); + final result = serverVersionIsAhead( currentVersion: widget.serverVersion, referenceVersion: 'v0.107.28', referenceVersionBeta: 'v0.108.0-b.33' ) == true - ? await getQueryLogInfo(server: widget.serversProvider.selectedServer!) - : await getQueryLogInfoLegacy(server: widget.serversProvider.selectedServer!); + ? await serversProvider.apiClient!.getQueryLogInfo() + : await serversProvider.apiClient!.getQueryLogInfoLegacy(); if (mounted) { if (result['result'] == 'success') { diff --git a/lib/screens/logs/logs_filters_modal.dart b/lib/screens/logs/logs_filters_modal.dart index 19ba0c0..6b040d3 100644 --- a/lib/screens/logs/logs_filters_modal.dart +++ b/lib/screens/logs/logs_filters_modal.dart @@ -10,11 +10,8 @@ import 'package:adguard_home_manager/screens/logs/clients_modal.dart'; import 'package:adguard_home_manager/screens/logs/filter_status_modal.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; -import 'package:adguard_home_manager/models/logs.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'; -import 'package:adguard_home_manager/models/applied_filters.dart'; +import 'package:adguard_home_manager/constants/enums.dart'; +import 'package:adguard_home_manager/providers/clients_provider.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; class LogsFiltersModal extends StatelessWidget { @@ -62,8 +59,7 @@ class _LogsFiltersModalWidgetState extends State { @override Widget build(BuildContext context) { final logsProvider = Provider.of(context); - final serversProvider = Provider.of(context); - final appConfigProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -78,38 +74,6 @@ class _LogsFiltersModalWidgetState extends State { "safe_search": AppLocalizations.of(context)!.blockedSafeSearchRow, }; - void resetFilters() async { - setState(() { - searchController.text = ''; - }); - - logsProvider.setLoadStatus(0); - - logsProvider.resetFilters(); - - final result = await getLogs( - server: serversProvider.selectedServer!, - count: logsProvider.logsQuantity - ); - - logsProvider.setAppliedFilters( - AppliedFiters( - selectedResultStatus: 'all', - searchText: null, - clients: null - ) - ); - - if (result['result'] == 'success') { - logsProvider.setLogsData(result['data']); - logsProvider.setLoadStatus(1); - } - else { - appConfigProvider.addLog(result['log']); - logsProvider.setLoadStatus(2); - } - } - void openSelectFilterStatus() { if (width > 700 || !(Platform.isAndroid || Platform.isIOS)) { showDialog( @@ -158,45 +122,6 @@ class _LogsFiltersModalWidgetState extends State { } } - void filterLogs() async { - Navigator.pop(context); - - logsProvider.setLoadStatus(0); - - logsProvider.setOffset(0); - - final result = await getLogs( - server: serversProvider.selectedServer!, - count: logsProvider.logsQuantity, - olderThan: logsProvider.logsOlderThan, - responseStatus: logsProvider.selectedResultStatus, - search: logsProvider.searchText, - ); - - logsProvider.setAppliedFilters( - AppliedFiters( - selectedResultStatus: logsProvider.selectedResultStatus, - searchText: logsProvider.searchText, - clients: logsProvider.selectedClients - ) - ); - - if (result['result'] == 'success') { - LogsData newLogsData = result['data']; - if (widget.logsProvider.appliedFilters.clients != null) { - newLogsData.data = newLogsData.data.where( - (item) => widget.logsProvider.appliedFilters.clients!.contains(item.client) - ).toList(); - } - logsProvider.setLogsData(newLogsData); - logsProvider.setLoadStatus(1); - } - else { - appConfigProvider.addLog(result['log']); - logsProvider.setLoadStatus(2); - } - } - Widget content() { return Column( mainAxisSize: MainAxisSize.min, @@ -273,13 +198,13 @@ class _LogsFiltersModalWidgetState extends State { subtitle: logsProvider.selectedClients != null ? "${logsProvider.selectedClients!.length} ${AppLocalizations.of(context)!.clientsSelected}" : AppLocalizations.of(context)!.all, - onTap: logsProvider.clientsLoadStatus == 1 + onTap: clientsProvider.loadStatus == LoadStatus.loaded ? openSelectClients : null, - disabled: logsProvider.clientsLoadStatus != 1 , + disabled: clientsProvider.loadStatus != LoadStatus.loaded, icon: Icons.smartphone_rounded, padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 12), - trailing: logsProvider.clientsLoadStatus == 0 + trailing: clientsProvider.loadStatus == LoadStatus.loading ? const SizedBox( width: 20, height: 20, @@ -287,7 +212,7 @@ class _LogsFiltersModalWidgetState extends State { strokeWidth: 2, ), ) - : logsProvider.clientsLoadStatus == 2 + : clientsProvider.loadStatus == LoadStatus.error ? const Icon( Icons.error_rounded, color: Colors.red, @@ -311,11 +236,17 @@ class _LogsFiltersModalWidgetState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextButton( - onPressed: resetFilters, + onPressed: () { + searchController.text = ""; + logsProvider.requestResetFilters(); + }, child: Text(AppLocalizations.of(context)!.resetFilters) ), TextButton( - onPressed: () => filterLogs(), + onPressed: () { + Navigator.pop(context); + logsProvider.filterLogs(); + }, child: Text(AppLocalizations.of(context)!.apply) ), ], diff --git a/lib/screens/settings/access_settings/access_settings.dart b/lib/screens/settings/access_settings/access_settings.dart index 6b3e046..46ea0f3 100644 --- a/lib/screens/settings/access_settings/access_settings.dart +++ b/lib/screens/settings/access_settings/access_settings.dart @@ -23,29 +23,9 @@ class _AccessSettingsState extends State with TickerProviderStat final ScrollController scrollController = ScrollController(); late TabController tabController; - Future fetchClients() async { - final clientsProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - clientsProvider.setClientsLoadStatus(LoadStatus.loading, false); - final result = await getClients(serversProvider.selectedServer!); - if (mounted) { - if (result['result'] == 'success') { - clientsProvider.setClientsData(result['data']); - clientsProvider.setClientsLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result['log']); - clientsProvider.setClientsLoadStatus(LoadStatus.error, true); - } - } - } - - @override void initState() { - fetchClients(); + Provider.of(context, listen: false).fetchClients(updateLoading: true); super.initState(); tabController = TabController( initialIndex: 0, @@ -68,7 +48,6 @@ class _AccessSettingsState extends State with TickerProviderStat loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.clients!.clientsAllowedBlocked!.allowedClients : [], - fetchClients: fetchClients ), ClientsList( type: 'disallowed', @@ -76,7 +55,6 @@ class _AccessSettingsState extends State with TickerProviderStat loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.clients!.clientsAllowedBlocked!.disallowedClients : [], - fetchClients: fetchClients ), ClientsList( type: 'domains', @@ -84,7 +62,6 @@ class _AccessSettingsState extends State with TickerProviderStat loadStatus: clientsProvider.loadStatus, data: clientsProvider.loadStatus == LoadStatus.loaded ? clientsProvider.clients!.clientsAllowedBlocked!.blockedHosts : [], - fetchClients: fetchClients ), ] ); diff --git a/lib/screens/settings/access_settings/clients_list.dart b/lib/screens/settings/access_settings/clients_list.dart index 8e9fb30..2466e11 100644 --- a/lib/screens/settings/access_settings/clients_list.dart +++ b/lib/screens/settings/access_settings/clients_list.dart @@ -13,11 +13,8 @@ import 'package:adguard_home_manager/widgets/tab_content_list.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_allowed_blocked.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/clients_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; class ClientsList extends StatefulWidget { @@ -25,7 +22,6 @@ class ClientsList extends StatefulWidget { final ScrollController scrollController; final LoadStatus loadStatus; final List data; - final Future Function() fetchClients; const ClientsList({ Key? key, @@ -33,7 +29,6 @@ class ClientsList extends StatefulWidget { required this.scrollController, required this.loadStatus, required this.data, - required this.fetchClients }) : super(key: key); @override @@ -68,12 +63,22 @@ class _ClientsListState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final clientsProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; + Future refetchClients() async { + final result = await clientsProvider.fetchClients(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.clientsNotLoaded, + color: Colors.red + ); + } + } + void confirmRemoveItem(String client, String type) async { Map> body = { "allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [], @@ -94,20 +99,18 @@ class _ClientsListState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.removingClient); - final result = await requestAllowedBlockedClientsHosts(serversProvider.selectedServer!, body); + final result = await clientsProvider.removeClientList(client, type); processModal.close(); - if (result['result'] == 'success') { - clientsProvider.setAllowedDisallowedClientsBlockedDomains( - ClientsAllowedBlocked( - allowedClients: body['allowed_clients'] ?? [], - disallowedClients: body['disallowed_clients'] ?? [], - blockedHosts: body['blocked_hosts'] ?? [], - ) + if (result['success'] == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.clientRemovedSuccessfully, + color: Colors.green ); } - else if (result['result'] == 'error' && result['message'] == 'client_another_list') { + else if (result['success'] == false && result['error'] == 'client_another_list') { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientAnotherList, @@ -115,50 +118,32 @@ class _ClientsListState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, - label: AppLocalizations.of(context)!.clientNotRemoved, + label: type == 'allowed' || type == 'blocked' + ? AppLocalizations.of(context)!.clientNotRemoved + : AppLocalizations.of(context)!.domainNotAdded, color: Colors.red ); } } void confirmAddItem(String item, String type) async { - Map> body = { - "allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [], - "disallowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.disallowedClients ?? [], - "blocked_hosts": clientsProvider.clients!.clientsAllowedBlocked?.blockedHosts ?? [], - }; - - if (type == 'allowed') { - body['allowed_clients']!.add(item); - } - else if (type == 'disallowed') { - body['disallowed_clients']!.add(item); - } - else if (type == 'domains') { - body['blocked_hosts']!.add(item); - } - ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.removingClient); - final result = await requestAllowedBlockedClientsHosts(serversProvider.selectedServer!, body); + final result = await clientsProvider.addClientList(item, type); processModal.close(); - if (result['result'] == 'success') { - clientsProvider.setAllowedDisallowedClientsBlockedDomains( - ClientsAllowedBlocked( - allowedClients: body['allowed_clients'] ?? [], - disallowedClients: body['disallowed_clients'] ?? [], - blockedHosts: body['blocked_hosts'] ?? [], - ) + if (result['success'] == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.clientAddedSuccessfully, + color: Colors.green ); } - else if (result['result'] == 'error' && result['message'] == 'client_another_list') { + else if (result['success'] == false && result['error'] == 'client_another_list') { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.clientAnotherList, @@ -166,8 +151,6 @@ class _ClientsListState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: type == 'allowed' || type == 'blocked' @@ -327,7 +310,7 @@ class _ClientsListState extends State { ), const SizedBox(height: 30), TextButton.icon( - onPressed: widget.fetchClients, + onPressed: refetchClients, icon: const Icon(Icons.refresh_rounded), label: Text(AppLocalizations.of(context)!.refresh), ) @@ -361,7 +344,7 @@ class _ClientsListState extends State { ), ), loadStatus: widget.loadStatus, - onRefresh: widget.fetchClients, + onRefresh: refetchClients, refreshIndicatorOffset: 0, fab: FloatingActionButton( onPressed: () { diff --git a/lib/screens/settings/advanced_setings.dart b/lib/screens/settings/advanced_setings.dart index 2ed0ee4..402b69a 100644 --- a/lib/screens/settings/advanced_setings.dart +++ b/lib/screens/settings/advanced_setings.dart @@ -71,29 +71,29 @@ class AdvancedSettings extends StatelessWidget { right: 10 ) ), - CustomListTile( - icon: Icons.list_rounded, - title: AppLocalizations.of(context)!.logs, - subtitle: AppLocalizations.of(context)!.checkAppLogs, - onTap: () => { - if (width > 900 || !(Platform.isAndroid || Platform.isIOS)) { - SplitView.of(context).push(const AppLogs()) - } - else { - Navigator.of(context).push( - MaterialPageRoute( - builder: (context) => const AppLogs() - ) - ) - } - }, - padding: const EdgeInsets.only( - top: 10, - bottom: 10, - left: 20, - right: 10 - ) - ), + // CustomListTile( + // icon: Icons.list_rounded, + // title: AppLocalizations.of(context)!.logs, + // subtitle: AppLocalizations.of(context)!.checkAppLogs, + // onTap: () => { + // if (width > 900 || !(Platform.isAndroid || Platform.isIOS)) { + // SplitView.of(context).push(const AppLogs()) + // } + // else { + // Navigator.of(context).push( + // MaterialPageRoute( + // builder: (context) => const AppLogs() + // ) + // ) + // } + // }, + // padding: const EdgeInsets.only( + // top: 10, + // bottom: 10, + // left: 20, + // right: 10 + // ) + // ), ], ) ); diff --git a/lib/screens/settings/dhcp/dhcp.dart b/lib/screens/settings/dhcp/dhcp.dart index 1e9d796..49ab29c 100644 --- a/lib/screens/settings/dhcp/dhcp.dart +++ b/lib/screens/settings/dhcp/dhcp.dart @@ -16,7 +16,6 @@ import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/providers/dhcp_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/dhcp.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -54,34 +53,22 @@ class _DhcpScreenState extends State { bool dataValid = false; void loadDhcpStatus() async { - final serversProvider = Provider.of(context, listen: false); - final dhcpProvider = Provider.of(context, listen: false); - - dhcpProvider.setDhcpLoadStatus(LoadStatus.loading, false); - - final result = await getDhcpData(server: serversProvider.selectedServer!); - - if (mounted) { - if (result['result'] == 'success') { - dhcpProvider.setDhcpData(result['data']); - dhcpProvider.setDhcpLoadStatus(LoadStatus.loaded, true); + final result = await Provider.of(context, listen: false).loadDhcpStatus(); + if (mounted && result == true) { + final dhcpProvider = Provider.of(context, listen: false); + if (dhcpProvider.dhcp != null) { setState(() { - if (result['data'].dhcpStatus.interfaceName != '') { - selectedInterface = result['data'].networkInterfaces.firstWhere((iface) => iface.name == result['data'].dhcpStatus.interfaceName); - - enabled = result['data'].dhcpStatus.enabled; - ipv4StartRangeController.text = result['data'].dhcpStatus.v4.rangeStart; - ipv4StartRangeController.text = result['data'].dhcpStatus.v4.rangeStart; - ipv4EndRangeController.text = result['data'].dhcpStatus.v4.rangeEnd; - ipv4SubnetMaskController.text = result['data'].dhcpStatus.v4.subnetMask; - ipv4GatewayController.text = result['data'].dhcpStatus.v4.gatewayIp; - ipv4LeaseTimeController.text = result['data'].dhcpStatus.v4.leaseDuration.toString(); + if (dhcpProvider.dhcp!.dhcpStatus.interfaceName != '') { + selectedInterface = dhcpProvider.dhcp!.networkInterfaces.firstWhere((iface) => iface.name == dhcpProvider.dhcp!.dhcpStatus.interfaceName); + enabled = dhcpProvider.dhcp!.dhcpStatus.enabled; + ipv4StartRangeController.text = dhcpProvider.dhcp!.dhcpStatus.v4.rangeStart; + ipv4EndRangeController.text = dhcpProvider.dhcp!.dhcpStatus.v4.rangeEnd ?? ''; + ipv4SubnetMaskController.text = dhcpProvider.dhcp!.dhcpStatus.v4.subnetMask ?? ''; + ipv4GatewayController.text = dhcpProvider.dhcp!.dhcpStatus.v4.gatewayIp ?? ''; + ipv4LeaseTimeController.text = dhcpProvider.dhcp!.dhcpStatus.v4.leaseDuration.toString(); } }); } - else { - dhcpProvider.setDhcpLoadStatus(LoadStatus.error, true); - } } checkDataValid(); } @@ -205,22 +192,24 @@ class _DhcpScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingSettings); - final result = await saveDhcpConfig(server: serversProvider.selectedServer!, data: { - "enabled": enabled, - "interface_name": selectedInterface!.name, - if (selectedInterface!.ipv4Addresses.isNotEmpty) "v4": { - "gateway_ip": ipv4GatewayController.text, - "subnet_mask": ipv4SubnetMaskController.text, - "range_start": ipv4StartRangeController.text, - "range_end": ipv4EndRangeController.text, - "lease_duration": ipv4LeaseTimeController.text != '' ? int.parse(ipv4LeaseTimeController.text) : null - }, - if (selectedInterface!.ipv6Addresses.isNotEmpty) "v6": { - "range_start": ipv6StartRangeController.text, - "range_end": ipv6EndRangeController.text, - "lease_duration": ipv6LeaseTimeController.text != '' ? int.parse(ipv6LeaseTimeController.text) : null + final result = await serversProvider.apiClient!.saveDhcpConfig( + data: { + "enabled": enabled, + "interface_name": selectedInterface!.name, + if (selectedInterface!.ipv4Addresses.isNotEmpty) "v4": { + "gateway_ip": ipv4GatewayController.text, + "subnet_mask": ipv4SubnetMaskController.text, + "range_start": ipv4StartRangeController.text, + "range_end": ipv4EndRangeController.text, + "lease_duration": ipv4LeaseTimeController.text != '' ? int.parse(ipv4LeaseTimeController.text) : null + }, + if (selectedInterface!.ipv6Addresses.isNotEmpty) "v6": { + "range_start": ipv6StartRangeController.text, + "range_end": ipv6EndRangeController.text, + "lease_duration": ipv6LeaseTimeController.text != '' ? int.parse(ipv6LeaseTimeController.text) : null + } } - }); + ); processModal.close(); @@ -232,8 +221,6 @@ class _DhcpScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.settingsNotSaved, @@ -247,7 +234,7 @@ class _DhcpScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.restoringConfig); - final result = await resetDhcpConfig(server: serversProvider.selectedServer!); + final result = await serversProvider.apiClient!.resetDhcpConfig(); processModal.close(); @@ -261,8 +248,6 @@ class _DhcpScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.configNotRestored, @@ -277,7 +262,7 @@ class _DhcpScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.restoringLeases); - final result = await restoreAllLeases(server: serversProvider.selectedServer!); + final result = await serversProvider.apiClient!.restoreAllLeases(); processModal.close(); @@ -294,8 +279,6 @@ class _DhcpScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.leasesNotRestored, diff --git a/lib/screens/settings/dhcp/dhcp_leases.dart b/lib/screens/settings/dhcp/dhcp_leases.dart index ede2ef1..3763704 100644 --- a/lib/screens/settings/dhcp/dhcp_leases.dart +++ b/lib/screens/settings/dhcp/dhcp_leases.dart @@ -13,10 +13,8 @@ import 'package:adguard_home_manager/screens/settings/dhcp/add_static_lease_moda import 'package:adguard_home_manager/providers/dhcp_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/models/dhcp.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; class DhcpLeases extends StatelessWidget { final List items; @@ -30,7 +28,6 @@ class DhcpLeases extends StatelessWidget { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final dhcpProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -40,19 +37,11 @@ class DhcpLeases extends StatelessWidget { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.deleting); - final result = await deleteStaticLease(server: serversProvider.selectedServer!, data: { - "mac": lease.mac, - "ip": lease.ip, - "hostname": lease.hostname - }); + final result = await dhcpProvider.deleteLease(lease); processModal.close(); - if (result['result'] == 'success') { - DhcpModel data = dhcpProvider.dhcp!; - data.dhcpStatus.staticLeases = data.dhcpStatus.staticLeases.where((l) => l.mac != lease.mac).toList(); - dhcpProvider.setDhcpData(data); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.staticLeaseDeleted, @@ -60,7 +49,6 @@ class DhcpLeases extends StatelessWidget { ); } else { - appConfigProvider.addLog(result['log']); showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.staticLeaseNotDeleted, @@ -73,35 +61,25 @@ class DhcpLeases extends StatelessWidget { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.creating); - final result = await createStaticLease(server: serversProvider.selectedServer!, data: { - "mac": lease.mac, - "ip": lease.ip, - "hostname": lease.hostname, - }); + final result = await dhcpProvider.createLease(lease); processModal.close(); - if (result['result'] == 'success') { - DhcpModel data = dhcpProvider.dhcp!; - data.dhcpStatus.staticLeases.add(lease); - dhcpProvider.setDhcpData(data); - + if (result['success'] == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.staticLeaseCreated, color: Colors.green ); } - else if (result['result'] == 'error' && result['message'] == 'already_exists' ) { - appConfigProvider.addLog(result['log']); + else if (result['success'] == false && result['error'] == 'already_exists' ) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.staticLeaseExists, color: Colors.red ); } - else if (result['result'] == 'error' && result['message'] == 'server_not_configured' ) { - appConfigProvider.addLog(result['log']); + else if (result['success'] == false && result['error'] == 'server_not_configured' ) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.serverNotConfigured, @@ -109,7 +87,6 @@ class DhcpLeases extends StatelessWidget { ); } else { - appConfigProvider.addLog(result['log']); showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.staticLeaseNotCreated, diff --git a/lib/screens/settings/dns/bootstrap_dns.dart b/lib/screens/settings/dns/bootstrap_dns.dart index 389ceae..055042d 100644 --- a/lib/screens/settings/dns/bootstrap_dns.dart +++ b/lib/screens/settings/dns/bootstrap_dns.dart @@ -4,13 +4,10 @@ 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/servers_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/providers/dns_provider.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; -import 'package:adguard_home_manager/models/dns_info.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; class BootstrapDnsScreen extends StatefulWidget { const BootstrapDnsScreen({Key? key}) : super(key: key); @@ -66,7 +63,6 @@ class _BootstrapDnsScreenState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final dnsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -74,26 +70,20 @@ class _BootstrapDnsScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingConfig); - final result = await setDnsConfig(server: serversProvider.selectedServer!, data: { + final result = await dnsProvider.saveBootstrapDnsConfig({ "bootstrap_dns": bootstrapControllers.map((e) => e['controller'].text).toList(), }); processModal.close(); - if (result['result'] == 'success') { - DnsInfo data = dnsProvider.dnsInfo!; - data.bootstrapDns = List.from(bootstrapControllers.map((e) => e['controller'].text)); - dnsProvider.setDnsInfoData(data); - + if (result['success'] == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigSaved, color: Colors.green ); } - else if (result['log'] != null && result['log'].statusCode == '400') { - appConfigProvider.addLog(result['log']); - + else if (result['success'] == false && result['error'] == 400) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.someValueNotValid, @@ -101,8 +91,6 @@ class _BootstrapDnsScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigNotSaved, diff --git a/lib/screens/settings/dns/cache_config.dart b/lib/screens/settings/dns/cache_config.dart index 313919f..bbd78c3 100644 --- a/lib/screens/settings/dns/cache_config.dart +++ b/lib/screens/settings/dns/cache_config.dart @@ -75,7 +75,7 @@ class _CacheConfigDnsScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingConfig); - final result = await setDnsConfig(server: serversProvider.selectedServer!, data: { + final result = await dnsProvider.saveCacheCacheConfig({ "cache_size": int.parse(cacheSizeController.text), "cache_ttl_min": int.parse(overrideMinTtlController.text), "cache_ttl_max": int.parse(overrideMaxTtlController.text), @@ -84,23 +84,14 @@ class _CacheConfigDnsScreenState extends State { processModal.close(); - if (result['result'] == 'success') { - DnsInfo data = dnsProvider.dnsInfo!; - data.cacheSize = int.parse(cacheSizeController.text); - data.cacheTtlMin = int.parse(overrideMinTtlController.text); - data.cacheTtlMax = int.parse(overrideMaxTtlController.text); - data.cacheOptimistic = optimisticCache; - dnsProvider.setDnsInfoData(data); - + if (result['success'] == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigSaved, color: Colors.green ); } - else if (result['log'] != null && result['log'].statusCode == '400') { - appConfigProvider.addLog(result['log']); - + else if (result['success'] == false && result['error'] == 400) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.someValueNotValid, @@ -108,8 +99,6 @@ class _CacheConfigDnsScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigNotSaved, diff --git a/lib/screens/settings/dns/dns.dart b/lib/screens/settings/dns/dns.dart index bd1feee..eac3c2c 100644 --- a/lib/screens/settings/dns/dns.dart +++ b/lib/screens/settings/dns/dns.dart @@ -21,7 +21,6 @@ import 'package:adguard_home_manager/functions/clear_dns_cache.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; class DnsSettings extends StatefulWidget { const DnsSettings({Key? key}) : super(key: key); @@ -31,31 +30,9 @@ class DnsSettings extends StatefulWidget { } class _DnsSettingsState extends State { - - void fetchData({bool? showRefreshIndicator}) async { - final dnsProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - dnsProvider.setDnsInfoLoadStatus(LoadStatus.loading, showRefreshIndicator ?? false); - - final result = await getDnsInfo(server: serversProvider.selectedServer!); - - if (mounted) { - if (result['result'] == 'success') { - dnsProvider.setDnsInfoData(result['data']); - dnsProvider.setDnsInfoLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result['log']); - dnsProvider.setDnsInfoLoadStatus(LoadStatus.error, true); - } - } - } - @override void initState() { - fetchData(); + Provider.of(context, listen: false).fetchDnsData(showLoading: true); super.initState(); } @@ -192,7 +169,7 @@ class _DnsSettingsState extends State { PopupMenuButton( itemBuilder: (context) => [ PopupMenuItem( - onTap: () => fetchData(showRefreshIndicator: true), + onTap: () => dnsProvider.fetchDnsData(), child: Row( children: [ const Icon(Icons.refresh_rounded), diff --git a/lib/screens/settings/dns/dns_server_settings.dart b/lib/screens/settings/dns/dns_server_settings.dart index cc1db2a..fffd43a 100644 --- a/lib/screens/settings/dns/dns_server_settings.dart +++ b/lib/screens/settings/dns/dns_server_settings.dart @@ -100,7 +100,6 @@ class _DnsServerSettingsScreenState extends State { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final dnsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -108,36 +107,26 @@ class _DnsServerSettingsScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingConfig); - final result = await setDnsConfig(server: serversProvider.selectedServer!, data: { + final result = await dnsProvider.saveDnsServerConfig({ "ratelimit": int.parse(limitRequestsController.text), "edns_cs_enabled": enableEdns, "dnssec_enabled": enableDnssec, "disable_ipv6": disableIpv6Resolving, - "blocking_mode": blockingMode + "blocking_mode": blockingMode, + "blocking_ipv4": ipv4controller.text, + "blocking_ipv6": ipv6controller.text }); processModal.close(); - if (result['result'] == 'success') { - DnsInfo data = dnsProvider.dnsInfo!; - data.ratelimit = int.parse(limitRequestsController.text); - data.ednsCsEnabled = enableEdns; - data.dnssecEnabled = enableDnssec; - data.disableIpv6 = disableIpv6Resolving; - data.blockingMode = blockingMode; - data.blockingIpv4 = ipv4controller.text; - data.blockingIpv6 = ipv6controller.text; - dnsProvider.setDnsInfoData(data); - + if (result['success'] == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigSaved, color: Colors.green ); } - else if (result['log'] != null && result['log'].statusCode == '400') { - appConfigProvider.addLog(result['log']); - + else if (result['success'] == false && result['error'] == 400) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.someValueNotValid, @@ -145,8 +134,6 @@ class _DnsServerSettingsScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigNotSaved, diff --git a/lib/screens/settings/dns/private_reverse_servers.dart b/lib/screens/settings/dns/private_reverse_servers.dart index 5bab4c0..bf6f63b 100644 --- a/lib/screens/settings/dns/private_reverse_servers.dart +++ b/lib/screens/settings/dns/private_reverse_servers.dart @@ -6,13 +6,10 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/custom_switch_list_tile.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/dns_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; -import 'package:adguard_home_manager/models/dns_info.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; class PrivateReverseDnsServersScreen extends StatefulWidget { const PrivateReverseDnsServersScreen({Key? key}) : super(key: key); @@ -89,7 +86,6 @@ class _PrivateReverseDnsServersScreenState extends State(context); final dnsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -97,36 +93,28 @@ class _PrivateReverseDnsServersScreenState extends State.from(reverseResolversControllers.map((e) => e['controller'].text)), - "use_private_ptr_resolvers": usePrivateReverseDnsResolvers, - "resolve_clients": enableReverseResolve - } : { - "use_private_ptr_resolvers": usePrivateReverseDnsResolvers, - "resolve_clients": enableReverseResolve - }); + final result = await dnsProvider.savePrivateReverseServersConfig( + editReverseResolvers == true + ? { + "local_ptr_upstreams": List.from(reverseResolversControllers.map((e) => e['controller'].text)), + "use_private_ptr_resolvers": usePrivateReverseDnsResolvers, + "resolve_clients": enableReverseResolve + } : { + "use_private_ptr_resolvers": usePrivateReverseDnsResolvers, + "resolve_clients": enableReverseResolve + } + ); processModal.close(); - if (result['result'] == 'success') { - DnsInfo data = dnsProvider.dnsInfo!; - if (editReverseResolvers == true) { - data.localPtrUpstreams = List.from(reverseResolversControllers.map((e) => e['controller'].text)); - } - data.usePrivatePtrResolvers = usePrivateReverseDnsResolvers; - data.resolveClients = enableReverseResolve; - dnsProvider.setDnsInfoData(data); - + if (result['success'] == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigSaved, color: Colors.green ); } - else if (result['log'] != null && result['log'].statusCode == '400') { - appConfigProvider.addLog(result['log']); - + else if (result['success'] == false && result['error'] == 400) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.someValueNotValid, @@ -134,8 +122,6 @@ class _PrivateReverseDnsServersScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingConfig); - final result = await setDnsConfig(server: serversProvider.selectedServer!, data: { + final result = await dnsProvider.saveUpstreamDnsConfig({ "upstream_dns": dnsServers.map((e) => e['controller'] != null ? e['controller'].text : e['comment']).toList(), "upstream_mode": upstreamMode }); processModal.close(); - if (result['result'] == 'success') { - DnsInfo data = dnsProvider.dnsInfo!; - data.upstreamDns = List.from(dnsServers.map((e) => e['controller'] != null ? e['controller'].text : e['comment'])); - data.upstreamMode = upstreamMode; - dnsProvider.setDnsInfoData(data); - + if (result['success'] == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigSaved, color: Colors.green ); } - else if (result['log'] != null && result['log'].statusCode == '400') { - appConfigProvider.addLog(result['log']); - + else if (result['success'] == false && result['error'] == 400) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.someValueNotValid, @@ -174,8 +165,6 @@ class _UpstreamDnsScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); - showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsConfigNotSaved, diff --git a/lib/screens/settings/dns_rewrites/dns_rewrites.dart b/lib/screens/settings/dns_rewrites/dns_rewrites.dart index 923580d..d2ec726 100644 --- a/lib/screens/settings/dns_rewrites/dns_rewrites.dart +++ b/lib/screens/settings/dns_rewrites/dns_rewrites.dart @@ -9,13 +9,11 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/settings/dns_rewrites/add_dns_rewrite_modal.dart'; import 'package:adguard_home_manager/screens/settings/dns_rewrites/delete_dns_rewrite.dart'; -import 'package:adguard_home_manager/services/http_requests.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/rewrite_rules_provider.dart'; import 'package:adguard_home_manager/models/rewrite_rules.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/classes/process_modal.dart'; class DnsRewritesScreen extends StatefulWidget { @@ -26,34 +24,14 @@ class DnsRewritesScreen extends StatefulWidget { } class _DnsRewritesScreenState extends State { - Future fetchData() async { - final rewriteRulesProvider = Provider.of(context, listen: false); - final serversProvider = Provider.of(context, listen: false); - final appConfigProvider = Provider.of(context, listen: false); - - rewriteRulesProvider.setRewriteRulesLoadStatus(LoadStatus.loading, false); - - final result = await getDnsRewriteRules(server: serversProvider.selectedServer!); - - if (result['result'] == 'success') { - rewriteRulesProvider.setRewriteRulesData(result['data']); - rewriteRulesProvider.setRewriteRulesLoadStatus(LoadStatus.loaded, true); - } - else { - appConfigProvider.addLog(result['log']); - rewriteRulesProvider.setRewriteRulesLoadStatus(LoadStatus.error, true); - } - } - @override void initState() { - fetchData(); + Provider.of(context, listen: false).fetchRules(); super.initState(); } @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final rewriteRulesProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -63,18 +41,11 @@ class _DnsRewritesScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.deleting); - final result = await deleteDnsRewriteRule(server: serversProvider.selectedServer!, data: { - "domain": rule.domain, - "answer": rule.answer - }); + final result = await rewriteRulesProvider.deleteDnsRewrite(rule); processModal.close(); - if (result['result'] == 'success') { - List data = rewriteRulesProvider.rewriteRules!; - data = data.where((item) => item.domain != rule.domain).toList(); - rewriteRulesProvider.setRewriteRulesData(data); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsRewriteRuleDeleted, @@ -82,7 +53,6 @@ class _DnsRewritesScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsRewriteRuleNotDeleted, @@ -95,18 +65,11 @@ class _DnsRewritesScreenState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.addingRewrite); - final result = await addDnsRewriteRule(server: serversProvider.selectedServer!, data: { - "domain": rule.domain, - "answer": rule.answer - }); + final result = await rewriteRulesProvider.addDnsRewrite(rule); processModal.close(); - if (result['result'] == 'success') { - List data = rewriteRulesProvider.rewriteRules!; - data.add(rule); - rewriteRulesProvider.setRewriteRulesData(data); - + if (result == true) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsRewriteRuleAdded, @@ -114,7 +77,6 @@ class _DnsRewritesScreenState extends State { ); } else { - appConfigProvider.addLog(result['log']); showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.dnsRewriteRuleNotAdded, @@ -149,7 +111,14 @@ class _DnsRewritesScreenState extends State { if (rewriteRulesProvider.rewriteRules!.isNotEmpty) { return RefreshIndicator( onRefresh: () async { - await fetchData(); + final result = await rewriteRulesProvider.fetchRules(); + if (result == false) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.rewriteRulesNotLoaded, + color: Colors.red + ); + } }, child: ListView.builder( padding: const EdgeInsets.only(top: 0), diff --git a/lib/screens/settings/encryption/encryption.dart b/lib/screens/settings/encryption/encryption.dart index b99efd7..1282279 100644 --- a/lib/screens/settings/encryption/encryption.dart +++ b/lib/screens/settings/encryption/encryption.dart @@ -16,7 +16,6 @@ import 'package:adguard_home_manager/screens/settings/encryption/error_message.d import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/base64.dart'; import 'package:adguard_home_manager/functions/snackbar.dart'; -import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; @@ -98,7 +97,7 @@ class _EncryptionSettingsWidgetState extends State { void fetchData({bool? showRefreshIndicator}) async { setState(() => loadStatus = 0); - final result = await getEncryptionSettings(server: widget.serversProvider.selectedServer!); + final result = await Provider.of(context, listen: false).apiClient!.getEncryptionSettings(); if (mounted) { if (result['result'] == 'success') { @@ -141,19 +140,21 @@ class _EncryptionSettingsWidgetState extends State { Future checkValidDataApi({Map? data}) async { setState(() => certKeyValidApi = 0); - final result = await checkEncryptionSettings(server: widget.serversProvider.selectedServer!, data: data ?? { - "enabled": enabled, - "server_name": domainNameController.text, - "force_https": redirectHttps, - "port_https": httpsPortController.text != '' ? int.parse(httpsPortController.text) : null, - "port_dns_over_tls": tlsPortController.text != '' ? int.parse(tlsPortController.text) : null, - "port_dns_over_quic": dnsOverQuicPortController.text != '' ? int.parse(dnsOverQuicPortController.text) : null, - if (certificateOption == 1) "certificate_chain": encodeBase64(certificateContentController.text), - if (privateKeyOption == 1 && usePreviouslySavedKey == false) "private_key": encodeBase64(pastePrivateKeyController.text), - "private_key_saved": usePreviouslySavedKey, - if (certificateOption == 0) "certificate_path": certificatePathController.text, - if (privateKeyOption == 0) "private_key_path": privateKeyPathController.text, - }); + final result = await Provider.of(context, listen: false).apiClient!.checkEncryptionSettings( + data: data ?? { + "enabled": enabled, + "server_name": domainNameController.text, + "force_https": redirectHttps, + "port_https": httpsPortController.text != '' ? int.parse(httpsPortController.text) : null, + "port_dns_over_tls": tlsPortController.text != '' ? int.parse(tlsPortController.text) : null, + "port_dns_over_quic": dnsOverQuicPortController.text != '' ? int.parse(dnsOverQuicPortController.text) : null, + if (certificateOption == 1) "certificate_chain": encodeBase64(certificateContentController.text), + if (privateKeyOption == 1 && usePreviouslySavedKey == false) "private_key": encodeBase64(pastePrivateKeyController.text), + "private_key_saved": usePreviouslySavedKey, + if (certificateOption == 0) "certificate_path": certificatePathController.text, + if (privateKeyOption == 0) "private_key_path": privateKeyPathController.text, + } + ); if (mounted) { if (result['result'] == 'success') { @@ -224,19 +225,21 @@ class _EncryptionSettingsWidgetState extends State { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingConfig); - final result = await saveEncryptionSettings(server: serversProvider.selectedServer!, data: { - "enabled": enabled, - "server_name": domainNameController.text, - "force_https": redirectHttps, - "port_https": int.tryParse(httpsPortController.text), - "port_dns_over_tls": int.tryParse(tlsPortController.text), - "port_dns_over_quic": int.tryParse(dnsOverQuicPortController.text), - "certificate_chain": encodeBase64(certificateContentController.text), - "private_key": encodeBase64(pastePrivateKeyController.text), - "private_key_saved": usePreviouslySavedKey, - "certificate_path": certificatePathController.text, - "private_key_path": privateKeyPathController.text, - }); + final result = await serversProvider.apiClient!.saveEncryptionSettings( + data: { + "enabled": enabled, + "server_name": domainNameController.text, + "force_https": redirectHttps, + "port_https": int.tryParse(httpsPortController.text), + "port_dns_over_tls": int.tryParse(tlsPortController.text), + "port_dns_over_quic": int.tryParse(dnsOverQuicPortController.text), + "certificate_chain": encodeBase64(certificateContentController.text), + "private_key": encodeBase64(pastePrivateKeyController.text), + "private_key_saved": usePreviouslySavedKey, + "certificate_path": certificatePathController.text, + "private_key_path": privateKeyPathController.text, + } + ); processModal.close(); diff --git a/lib/screens/settings/safe_search_settings.dart b/lib/screens/settings/safe_search_settings.dart index 986e7b7..461b6a6 100644 --- a/lib/screens/settings/safe_search_settings.dart +++ b/lib/screens/settings/safe_search_settings.dart @@ -10,45 +10,16 @@ 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'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; -import 'package:adguard_home_manager/providers/servers_provider.dart'; -class SafeSearchSettingsScreen extends StatelessWidget { +class SafeSearchSettingsScreen extends StatefulWidget { const SafeSearchSettingsScreen({Key? key}) : super(key: key); @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, - ); - } + State createState() => _SafeSearchSettingsScreenState(); } -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); - - @override - State createState() => _SafeSearchSettingsScreenWidgetState(); -} - -class _SafeSearchSettingsScreenWidgetState extends State { +class _SafeSearchSettingsScreenState extends State { bool generalEnabled = false; bool bingEnabled = false; bool duckduckgoEnabled = false; @@ -56,54 +27,46 @@ class _SafeSearchSettingsScreenWidgetState extends State(context, listen: false).getServerStatus(); + if (mounted && result == true) { + final statusProvider = Provider.of(context, listen: false); + if (statusProvider.serverStatus != null) { + setState(() { + generalEnabled = statusProvider.serverStatus!.safeSearchEnabled; + bingEnabled = statusProvider.serverStatus!.safeSeachBing ?? false; + duckduckgoEnabled = statusProvider.serverStatus!.safeSearchDuckduckgo ?? false; + googleEnabled = statusProvider.serverStatus!.safeSearchGoogle ?? false; + pixabayEnabled = statusProvider.serverStatus!.safeSearchPixabay ?? false; + yandexEnabled = statusProvider.serverStatus!.safeSearchYandex ?? false; + youtubeEnabled = statusProvider.serverStatus!.safeSearchYoutube ?? false; + }); } } } @override void initState() { - if (widget.statusProvider.loadStatus == LoadStatus.loading) { + final statusProvider = Provider.of(context, listen: false); + + if (statusProvider.loadStatus == LoadStatus.loading) { requestSafeSearchSettings(); } - else if (widget.statusProvider.loadStatus == LoadStatus.loaded) { - generalEnabled = widget.statusProvider.serverStatus!.safeSearchEnabled; - bingEnabled = widget.statusProvider.serverStatus!.safeSeachBing!; - duckduckgoEnabled = widget.statusProvider.serverStatus!.safeSearchDuckduckgo!; - googleEnabled = widget.statusProvider.serverStatus!.safeSearchGoogle!; - pixabayEnabled = widget.statusProvider.serverStatus!.safeSearchPixabay!; - yandexEnabled = widget.statusProvider.serverStatus!.safeSearchYandex!; - youtubeEnabled = widget.statusProvider.serverStatus!.safeSearchYoutube!; + else if (statusProvider.loadStatus == LoadStatus.loaded) { + generalEnabled = statusProvider.serverStatus!.safeSearchEnabled; + bingEnabled = statusProvider.serverStatus!.safeSeachBing!; + duckduckgoEnabled = statusProvider.serverStatus!.safeSearchDuckduckgo!; + googleEnabled = statusProvider.serverStatus!.safeSearchGoogle!; + pixabayEnabled = statusProvider.serverStatus!.safeSearchPixabay!; + yandexEnabled = statusProvider.serverStatus!.safeSearchYandex!; + youtubeEnabled = statusProvider.serverStatus!.safeSearchYoutube!; } super.initState(); } @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -111,35 +74,19 @@ class _SafeSearchSettingsScreenWidgetState extends State { - ServerInfo serverInfo = ServerInfo(loadStatus: 0); + ServerInfo serverInfo = ServerInfo(loadStatus: LoadStatus.loading); void fetchServerInfo() async { - final result = await getServerInfo(server: widget.serversProvider.selectedServer!); + final result = await Provider.of(context, listen: false).apiClient!.getServerInfo(); if (mounted) { if (result['result'] == 'success') { setState(() { - serverInfo.loadStatus = 1; + serverInfo.loadStatus = LoadStatus.loaded; serverInfo.data = result['data']; }); } else { - widget.appConfigProvider.addLog(result['log']); - setState(() => serverInfo.loadStatus = 2); + setState(() => serverInfo.loadStatus = LoadStatus.loaded); } } } @@ -69,7 +68,7 @@ class _ServerInformationWidgetState extends State { Widget build(BuildContext context) { Widget generateBody() { switch (serverInfo.loadStatus) { - case 0: + case LoadStatus.loading: return SizedBox( width: double.maxFinite, child: Column( @@ -93,7 +92,7 @@ class _ServerInformationWidgetState extends State { ), ); - case 1: + case LoadStatus.loaded: return ListView( children: [ CustomListTile( @@ -145,7 +144,7 @@ class _ServerInformationWidgetState extends State { ] ); - case 2: + case LoadStatus.error: return SizedBox( width: double.maxFinite, child: Column( diff --git a/lib/screens/settings/settings.dart b/lib/screens/settings/settings.dart index 08b9d8c..b0763f6 100644 --- a/lib/screens/settings/settings.dart +++ b/lib/screens/settings/settings.dart @@ -131,7 +131,11 @@ class SettingsWidget extends StatelessWidget { ], body: ListView( children: [ - if (serversProvider.selectedServer != null && statusProvider.serverStatus != null) ...[ + if ( + serversProvider.selectedServer != null && + statusProvider.serverStatus != null && + serversProvider.apiClient != null + ) ...[ SectionLabel(label: AppLocalizations.of(context)!.serverSettings), if (serverVersionIsAhead( currentVersion: statusProvider.serverStatus!.serverVersion, diff --git a/lib/screens/settings/update_server/update.dart b/lib/screens/settings/update_server/update.dart index 5e88a2e..f84e01a 100644 --- a/lib/screens/settings/update_server/update.dart +++ b/lib/screens/settings/update_server/update.dart @@ -10,7 +10,6 @@ import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.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'; import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/functions/open_url.dart'; @@ -36,7 +35,7 @@ class UpdateScreen extends StatelessWidget { ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.requestingUpdate); - final result = await requestUpdateServer(server: serversProvider.selectedServer!); + final result = await serversProvider.apiClient!.requestUpdateServer(); processModal.close(); @@ -56,7 +55,6 @@ class UpdateScreen extends StatelessWidget { color: Colors.red, labelColor: Colors.white, ); - appConfigProvider.addLog(result['log']); } } @@ -92,8 +90,8 @@ class UpdateScreen extends StatelessWidget { child: Column( children: [ serversProvider.updateAvailable.loadStatus == LoadStatus.loading - ? Column( - children: const [ + ? const Column( + children: [ CircularProgressIndicator(), SizedBox(height: 4) ], diff --git a/lib/screens/top_items/top_items.dart b/lib/screens/top_items/top_items.dart index db3584a..8db5464 100644 --- a/lib/screens/top_items/top_items.dart +++ b/lib/screens/top_items/top_items.dart @@ -132,14 +132,8 @@ class _TopItemsScreenState extends State { ), body: RefreshIndicator( onRefresh: () async { - final result = await getServerStatus(serversProvider.selectedServer!); - if (result['result'] == 'success') { - statusProvider.setServerStatusData( - data: result['data'] - ); - } - else { - appConfigProvider.addLog(result['log']); + final result = await statusProvider.getServerStatus(); + if (result == false) { showSnacbkar( appConfigProvider: appConfigProvider, label: AppLocalizations.of(context)!.serverStatusNotRefreshed, diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index b9cda5c..2cf9820 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -23,7 +23,7 @@ import 'package:adguard_home_manager/constants/urls.dart'; Future> apiRequest({ - required Server server, + required Server server, required String method, required String urlPath, dynamic body, @@ -262,81 +262,101 @@ Future loginHA(Server server) async { } } -Future getServerVersion(Server server) async { - final result = await apiRequest( - server: server, - method: 'get', - urlPath: '/status', - type: 'get_server_version' - ); +class ApiClient { + final Server server; - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200 && result['body'] != null) { - return { - 'result': 'success', - 'data': jsonDecode(result['body'])['version'] - }; + ApiClient({ + required this.server + }); + + Future getServerVersion() async { + final result = await apiRequest( + server: server, + method: 'get', + urlPath: '/status', + type: 'get_server_version' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200 && result['body'] != null) { + return { + 'result': 'success', + 'data': jsonDecode(result['body'])['version'] + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_server_version', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } } else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_server_version', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; + return result; } } - else { - return result; - } -} -Future getServerStatus(Server server) async { - final result = await Future.wait([ - apiRequest(server: server, method: 'get', urlPath: '/stats', type: 'server_status'), - apiRequest(server: server, method: 'get', urlPath: '/status', type: 'server_status'), - apiRequest(server: server, method: 'get', urlPath: '/filtering/status', type: 'server_status'), - apiRequest(server: server, method: 'get', urlPath: '/safesearch/status', type: 'server_status'), - apiRequest(server: server, method: 'get', urlPath: '/safebrowsing/status', type: 'server_status'), - apiRequest(server: server, method: 'get', urlPath: '/parental/status', type: 'server_status'), - apiRequest(server: server, method: 'get', urlPath: '/clients', type: 'server_status'), - ]); + Future getServerStatus() async { + final result = await Future.wait([ + apiRequest(server: server, method: 'get', urlPath: '/stats', type: 'server_status'), + apiRequest(server: server, method: 'get', urlPath: '/status', type: 'server_status'), + apiRequest(server: server, method: 'get', urlPath: '/filtering/status', type: 'server_status'), + apiRequest(server: server, method: 'get', urlPath: '/safesearch/status', type: 'server_status'), + apiRequest(server: server, method: 'get', urlPath: '/safebrowsing/status', type: 'server_status'), + apiRequest(server: server, method: 'get', urlPath: '/parental/status', type: 'server_status'), + apiRequest(server: server, method: 'get', urlPath: '/clients', type: 'server_status'), + ]); - if ( - result[0]['hasResponse'] == true && - result[1]['hasResponse'] == true && - result[2]['hasResponse'] == true && - result[3]['hasResponse'] == true && - result[4]['hasResponse'] == true && - result[5]['hasResponse'] == true && - result[6]['hasResponse'] == true - ) { if ( - result[0]['statusCode'] == 200 && - result[1]['statusCode'] == 200 && - result[2]['statusCode'] == 200 && - result[3]['statusCode'] == 200 && - result[4]['statusCode'] == 200 && - result[5]['statusCode'] == 200 && - result[6]['statusCode'] == 200 + result[0]['hasResponse'] == true && + result[1]['hasResponse'] == true && + result[2]['hasResponse'] == true && + result[3]['hasResponse'] == true && + result[4]['hasResponse'] == true && + result[5]['hasResponse'] == true && + result[6]['hasResponse'] == true ) { - final Map mappedData = { - 'stats': jsonDecode(result[0]['body']), - 'clients': jsonDecode(result[6]['body'])['clients'], - 'status': jsonDecode(result[1]['body']), - 'filtering': jsonDecode(result[2]['body']), - 'safeSearch': jsonDecode(result[3]['body']), - 'safeBrowsingEnabled': jsonDecode(result[4]['body']), - 'parentalControlEnabled': jsonDecode(result[5]['body']), - }; - return { - 'result': 'success', - 'data': ServerStatus.fromJson(mappedData) - }; + if ( + result[0]['statusCode'] == 200 && + result[1]['statusCode'] == 200 && + result[2]['statusCode'] == 200 && + result[3]['statusCode'] == 200 && + result[4]['statusCode'] == 200 && + result[5]['statusCode'] == 200 && + result[6]['statusCode'] == 200 + ) { + final Map mappedData = { + 'stats': jsonDecode(result[0]['body']), + 'clients': jsonDecode(result[6]['body'])['clients'], + 'status': jsonDecode(result[1]['body']), + 'filtering': jsonDecode(result[2]['body']), + 'safeSearch': jsonDecode(result[3]['body']), + 'safeBrowsingEnabled': jsonDecode(result[4]['body']), + 'parentalControlEnabled': jsonDecode(result[5]['body']), + }; + return { + 'result': 'success', + 'data': ServerStatus.fromJson(mappedData) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_server_status', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode']).toString(), + resBody: result.map((res) => res['body']).toString() + ) + }; + } } else { return { @@ -344,259 +364,257 @@ Future getServerStatus(Server server) async { 'log': AppLog( type: 'get_server_status', dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result.map((res) => res['statusCode']).toString(), - resBody: result.map((res) => res['body']).toString() + message: 'no_response', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString() ) }; } } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_server_status', - dateTime: DateTime.now(), - message: 'no_response', - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString() - ) - }; - } -} -Future updateFiltering({ - required Server server, - required bool enable, -}) async { - final result = await apiRequest( - urlPath: '/filtering/config', - method: 'post', - server: server, - body: { - 'enabled': enable - }, - type: 'update_filtering' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_filtering', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future updateSafeSearchLegacy(Server server, bool enable) async { - final result = enable == true - ? await apiRequest( - urlPath: '/safesearch/enable', - method: 'post', - server: server, - type: 'enable_safe_search' - ) - : await apiRequest( - urlPath: '/safesearch/disable', - method: 'post', - server: server, - type: 'disable_safe_search' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'safe_search', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future updateSafeBrowsing(Server server, bool enable) async { - final result = enable == true - ? await apiRequest( - urlPath: '/safebrowsing/enable', - method: 'post', - server: server, - type: 'enable_safe_browsing' - ) - : await apiRequest( - urlPath: '/safebrowsing/disable', - method: 'post', - server: server, - type: 'disable_safe_browsing' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'safe_browsing', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future updateParentalControl(Server server, bool enable) async { - final result = enable == true - ? await apiRequest( - urlPath: '/parental/enable', - method: 'post', - server: server, - type: 'enable_parental_control' - ) - : await apiRequest( - urlPath: '/parental/disable', - method: 'post', - server: server, - type: 'disable_parental_control' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'parental_control', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future updateGeneralProtection({ - required Server server, - required bool enable, - int? time -}) async { + Future updateFiltering({ + required bool enable, + }) async { final result = await apiRequest( - urlPath: '/protection', - method: 'post', - server: server, - body: { - 'enabled': enable, - 'duration': time - }, - type: 'general_protection' - ); + urlPath: '/filtering/config', + method: 'post', + server: server, + body: { + 'enabled': enable + }, + type: 'update_filtering' + ); - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_filtering', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } } else { - return { - 'result': 'error', - 'log': AppLog( - type: 'general_protection', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; + return result; } } - else { - return result; - } -} -Future updateGeneralProtectionLegacy(Server server, bool enable) async { - final result = await apiRequest( - urlPath: '/dns_config', - method: 'post', - server: server, - body: { - 'protection_enabled': enable - }, - type: 'general_protection' - ); + Future updateSafeSearchLegacy(bool enable) async { + final result = enable == true + ? await apiRequest( + urlPath: '/safesearch/enable', + method: 'post', + server: server, + type: 'enable_safe_search' + ) + : await apiRequest( + urlPath: '/safesearch/disable', + method: 'post', + server: server, + type: 'disable_safe_search' + ); - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'safe_search', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } } else { - return { - 'result': 'error', - 'log': AppLog( - type: 'general_protection', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; + return result; } } - else { - return result; + + Future updateSafeBrowsing(bool enable) async { + final result = enable == true + ? await apiRequest( + urlPath: '/safebrowsing/enable', + method: 'post', + server: server, + type: 'enable_safe_browsing' + ) + : await apiRequest( + urlPath: '/safebrowsing/disable', + method: 'post', + server: server, + type: 'disable_safe_browsing' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'safe_browsing', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } } -} -Future getClients(Server server) async { - final result = await Future.wait([ - apiRequest(server: server, method: 'get', urlPath: '/clients', type: 'get_clients'), - apiRequest(server: server, method: 'get', urlPath: '/access/list', type: 'get_clients'), - ]); + Future updateParentalControl(bool enable) async { + final result = enable == true + ? await apiRequest( + urlPath: '/parental/enable', + method: 'post', + server: server, + type: 'enable_parental_control' + ) + : await apiRequest( + urlPath: '/parental/disable', + method: 'post', + server: server, + type: 'disable_parental_control' + ); - if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { - if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { - final clients = Clients.fromJson(jsonDecode(result[0]['body'])); - clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(result[1]['body'])); - return { - 'result': 'success', - 'data': clients - }; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'parental_control', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future updateGeneralProtection({ + required bool enable, + int? time + }) async { + final result = await apiRequest( + urlPath: '/protection', + method: 'post', + server: server, + body: { + 'enabled': enable, + 'duration': time + }, + type: 'general_protection' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'general_protection', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future updateGeneralProtectionLegacy(bool enable) async { + final result = await apiRequest( + urlPath: '/dns_config', + method: 'post', + server: server, + body: { + 'protection_enabled': enable + }, + type: 'general_protection' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'general_protection', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future getClients() async { + final result = await Future.wait([ + apiRequest(server: server, method: 'get', urlPath: '/clients', type: 'get_clients'), + apiRequest(server: server, method: 'get', urlPath: '/access/list', type: 'get_clients'), + ]); + + if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { + if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { + final clients = Clients.fromJson(jsonDecode(result[0]['body'])); + clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(result[1]['body'])); + return { + 'result': 'success', + 'data': clients + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_clients', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), + ) + }; + } } else { return { @@ -604,304 +622,295 @@ Future getClients(Server server) async { 'log': AppLog( type: 'get_clients', dateTime: DateTime.now(), - message: 'error_code_not_expected', + message: 'no_response', statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), resBody: result.map((res) => res['body'] ?? 'null').toString(), ) }; } } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_clients', - dateTime: DateTime.now(), - message: 'no_response', - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString(), - ) - }; - } -} -Future requestAllowedBlockedClientsHosts(Server server, Map?> body) async { - final result = await apiRequest( - urlPath: '/access/set', - method: 'post', - server: server, - body: body, - type: 'get_clients' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - if (result['statusCode'] == 400) { - return { - 'result': 'error', - 'message': 'client_another_list' - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_clients', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future getLogs({ - required Server server, - required int count, - int? offset, - DateTime? olderThan, - String? responseStatus, - String? search -}) async { - final result = await apiRequest( - server: server, - method: 'get', - urlPath: '/querylog?limit=$count${offset != null ? '&offset=$offset' : ''}${olderThan != null ? '&older_than=${olderThan.toIso8601String()}' : ''}${responseStatus != null ? '&response_status=$responseStatus' : ''}${search != null ? '&search=$search' : ''}', - type: 'get_logs' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': LogsData.fromJson(jsonDecode(result['body'])) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_logs', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future getFilteringRules({ - required Server server, -}) async { - final result = await apiRequest( - server: server, - method: 'get', - urlPath: '/filtering/status', - type: 'get_filtering_rules' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': FilteringStatus.fromJson(jsonDecode(result['body'])) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_filtering_rules', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future postFilteringRules({ - required Server server, - required Map> data, -}) async { + Future requestAllowedBlockedClientsHosts(Map?> body) async { final result = await apiRequest( - urlPath: '/filtering/set_rules', - method: 'post', - server: server, - body: data, - type: 'post_filering_rules' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'post_filtering_rules', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future postAddClient({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/clients/add', - method: 'post', - server: server, - body: data, - type: 'add_client' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'add_client', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future postUpdateClient({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/clients/update', - method: 'post', - server: server, - body: data, - type: 'update_client' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_client', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future postDeleteClient({ - required Server server, - required String name, -}) async { - final result = await apiRequest( - urlPath: '/clients/delete', - method: 'post', - server: server, - body: {'name': name}, - type: 'remove_client' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'remove_client', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future getFiltering({ - required Server server, -}) async { - final result = await Future.wait([ - apiRequest( - urlPath: '/filtering/status', - method: 'get', + urlPath: '/access/set', + method: 'post', server: server, - type: 'get_filtering_status' - ), - apiRequest( - urlPath: '/blocked_services/list', - method: 'get', - server: server, - type: 'get_filtering_status' - ), - ]); + body: body, + type: 'get_clients' + ); - if (result[0]['hasResponse'] == true && result[0]['hasResponse'] == true) { - if (result[0]['statusCode'] == 200 && result[0]['statusCode'] == 200) { - return { - 'result': 'success', - 'data': Filtering.fromJson({ - ...jsonDecode(result[0]['body']), - "blocked_services": result[1]['body'] != null - ? jsonDecode(result[1]['body']) - : [] - }) - }; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + if (result['statusCode'] == 400) { + return { + 'result': 'error', + 'message': 'client_another_list' + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_clients', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future getLogs({ + required int count, + int? offset, + DateTime? olderThan, + String? responseStatus, + String? search + }) async { + final result = await apiRequest( + server: server, + method: 'get', + urlPath: '/querylog?limit=$count${offset != null ? '&offset=$offset' : ''}${olderThan != null ? '&older_than=${olderThan.toIso8601String()}' : ''}${responseStatus != null ? '&response_status=$responseStatus' : ''}${search != null ? '&search=$search' : ''}', + type: 'get_logs' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': LogsData.fromJson(jsonDecode(result['body'])) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_logs', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future getFilteringRules() async { + final result = await apiRequest( + server: server, + method: 'get', + urlPath: '/filtering/status', + type: 'get_filtering_rules' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': FilteringStatus.fromJson(jsonDecode(result['body'])) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_filtering_rules', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future postFilteringRules({ + required Map> data, + }) async { + final result = await apiRequest( + urlPath: '/filtering/set_rules', + method: 'post', + server: server, + body: data, + type: 'post_filering_rules' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'post_filtering_rules', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future postAddClient({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/clients/add', + method: 'post', + server: server, + body: data, + type: 'add_client' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'add_client', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future postUpdateClient({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/clients/update', + method: 'post', + server: server, + body: data, + type: 'update_client' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_client', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future postDeleteClient({ + required String name, + }) async { + final result = await apiRequest( + urlPath: '/clients/delete', + method: 'post', + server: server, + body: {'name': name}, + type: 'remove_client' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'remove_client', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future getFiltering() async { + final result = await Future.wait([ + apiRequest( + urlPath: '/filtering/status', + method: 'get', + server: server, + type: 'get_filtering_status' + ), + apiRequest( + urlPath: '/blocked_services/list', + method: 'get', + server: server, + type: 'get_filtering_status' + ), + ]); + + if (result[0]['hasResponse'] == true && result[0]['hasResponse'] == true) { + if (result[0]['statusCode'] == 200 && result[0]['statusCode'] == 200) { + return { + 'result': 'success', + 'data': Filtering.fromJson({ + ...jsonDecode(result[0]['body']), + "blocked_services": result[1]['body'] != null + ? jsonDecode(result[1]['body']) + : [] + }) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_filtering_status', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), + ) + }; + } } else { return { @@ -909,230 +918,222 @@ Future getFiltering({ 'log': AppLog( type: 'get_filtering_status', dateTime: DateTime.now(), - message: 'error_code_not_expected', + message: 'no_response', statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), resBody: result.map((res) => res['body'] ?? 'null').toString(), ) }; } } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_filtering_status', - dateTime: DateTime.now(), - message: 'no_response', - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString(), - ) - }; - } -} -Future setCustomRules({ - required Server server, - required List rules, -}) async { - final result = await apiRequest( - urlPath: '/filtering/set_rules', - method: 'post', - server: server, - body: {'rules': rules}, - type: 'set_custom_rules' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'set_custom_rules', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } - -} - -Future addFilteringList({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/filtering/add_url', - method: 'post', - server: server, - body: data, - type: 'add_filtering_url' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': result['body'] - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'add_filtering_url', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future updateFilterList({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/filtering/set_url', - method: 'post', - server: server, - body: data, - type: 'update_filter_list' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_filter_list', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future deleteFilterList({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/filtering/remove_url', - method: 'post', - server: server, - body: data, - type: 'delete_filter_list' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'delete_filter_list', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future getServerInfo({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/status', - method: 'get', - server: server, - type: 'server_info' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': ServerInfoData.fromJson(jsonDecode(result['body'])) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'server_info', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'] - ) - }; - } - } - else { - return result; - } -} - -Future updateLists({ - required Server server, -}) async { - final result = await Future.wait([ - apiRequest( - urlPath: '/filtering/refresh', + Future setCustomRules({ + required List rules, + }) async { + final result = await apiRequest( + urlPath: '/filtering/set_rules', method: 'post', server: server, - body: {'whitelist': true}, - type: 'update_lists', - overrideTimeout: true - ), - apiRequest( - urlPath: '/filtering/refresh', + body: {'rules': rules}, + type: 'set_custom_rules' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'set_custom_rules', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + + } + + Future addFilteringList({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/filtering/add_url', method: 'post', server: server, - body: {'whitelist': false}, - type: 'update_lists', - overrideTimeout: true - ), - ]); + body: data, + type: 'add_filtering_url' + ); - if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { - if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { - return { - 'result': 'success', - 'data': {'updated': jsonDecode(result[0]['body'])['updated']+jsonDecode(result[1]['body'])['updated']} - }; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': result['body'] + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'add_filtering_url', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future updateFilterList({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/filtering/set_url', + method: 'post', + server: server, + body: data, + type: 'update_filter_list' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_filter_list', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future deleteFilterList({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/filtering/remove_url', + method: 'post', + server: server, + body: data, + type: 'delete_filter_list' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'delete_filter_list', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future getServerInfo() async { + final result = await apiRequest( + urlPath: '/status', + method: 'get', + server: server, + type: 'server_info' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': ServerInfoData.fromJson(jsonDecode(result['body'])) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'server_info', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'] + ) + }; + } + } + else { + return result; + } + } + + Future updateLists() async { + final result = await Future.wait([ + apiRequest( + urlPath: '/filtering/refresh', + method: 'post', + server: server, + body: {'whitelist': true}, + type: 'update_lists', + overrideTimeout: true + ), + apiRequest( + urlPath: '/filtering/refresh', + method: 'post', + server: server, + body: {'whitelist': false}, + type: 'update_lists', + overrideTimeout: true + ), + ]); + + if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { + if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { + return { + 'result': 'success', + 'data': {'updated': jsonDecode(result[0]['body'])['updated']+jsonDecode(result[1]['body'])['updated']} + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_lists', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), + ) + }; + } } else { return { @@ -1140,914 +1141,1064 @@ Future updateLists({ 'log': AppLog( type: 'update_lists', dateTime: DateTime.now(), - message: 'error_code_not_expected', + message: [result[0]['message'], result[1]['message']].toString(), statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), resBody: result.map((res) => res['body'] ?? 'null').toString(), ) }; } } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_lists', - dateTime: DateTime.now(), - message: [result[0]['message'], result[1]['message']].toString(), - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString(), - ) - }; - } -} -Future checkHostFiltered({ - required Server server, - required String host, -}) async { - final result = await apiRequest( - urlPath: '/filtering/check_host?name=$host', - method: 'get', - server: server, - type: 'check_host_filtered' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': jsonDecode(result['body']) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_lists', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future requestChangeUpdateFrequency({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/filtering/config', - method: 'post', - server: server, - body: data, - type: 'change_update_frequency' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'change_update_frequency', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future setBlockedServices({ - required Server server, - required List data, -}) async { - final result = await apiRequest( - urlPath: '/blocked_services/set', - method: 'post', - server: server, - body: data, - type: 'update_blocked_services' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_blocked_services', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getDhcpData({ - required Server server, -}) async { - final result = await Future.wait([ - apiRequest( - urlPath: '/dhcp/interfaces', + Future checkHostFiltered({ + required String host, + }) async { + final result = await apiRequest( + urlPath: '/filtering/check_host?name=$host', method: 'get', server: server, - type: 'get_dhcp_data' - ), - apiRequest( - urlPath: '/dhcp/status', - method: 'get', + type: 'check_host_filtered' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': jsonDecode(result['body']) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_lists', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future requestChangeUpdateFrequency({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/filtering/config', + method: 'post', server: server, - type: 'get_dhcp_data' - ), - ]); + body: data, + type: 'change_update_frequency' + ); - if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { - if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { - List interfaces = List.from(jsonDecode(result[0]['body']).entries.map((entry) => NetworkInterface.fromJson(entry.value))); + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'change_update_frequency', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } - return { - 'result': 'success', - 'data': DhcpModel( - networkInterfaces: interfaces, - dhcpStatus: DhcpStatus.fromJson(jsonDecode(result[1]['body'])) - ) - }; + Future setBlockedServices({ + required List data, + }) async { + final result = await apiRequest( + urlPath: '/blocked_services/set', + method: 'post', + server: server, + body: data, + type: 'update_blocked_services' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_blocked_services', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getDhcpData() async { + final result = await Future.wait([ + apiRequest( + urlPath: '/dhcp/interfaces', + method: 'get', + server: server, + type: 'get_dhcp_data' + ), + apiRequest( + urlPath: '/dhcp/status', + method: 'get', + server: server, + type: 'get_dhcp_data' + ), + ]); + + if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { + if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { + List interfaces = List.from(jsonDecode(result[0]['body']).entries.map((entry) => NetworkInterface.fromJson(entry.value))); + + return { + 'result': 'success', + 'data': DhcpModel( + networkInterfaces: interfaces, + dhcpStatus: DhcpStatus.fromJson(jsonDecode(result[1]['body'])) + ) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_dhcp_data', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), + ) + }; + } } else { return { 'result': 'error', 'log': AppLog( - type: 'get_dhcp_data', + type: 'get_dhpc_data', dateTime: DateTime.now(), - message: 'error_code_not_expected', + message: [result[0]['log'].message, result[1]['log'].message].toString(), statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), resBody: result.map((res) => res['body'] ?? 'null').toString(), ) }; } } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_dhpc_data', - dateTime: DateTime.now(), - message: [result[0]['log'].message, result[1]['log'].message].toString(), - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString(), - ) - }; + + Future saveDhcpConfig({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/dhcp/set_config', + method: 'post', + server: server, + body: data, + type: 'save_dhcp_config' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'save_dhcp_config', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } } -} -Future saveDhcpConfig({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/dhcp/set_config', - method: 'post', - server: server, - body: data, - type: 'save_dhcp_config' - ); + Future resetDhcpConfig() async { + final result = await apiRequest( + urlPath: '/dhcp/reset', + method: 'post', + server: server, + body: {}, + type: 'reset_dhcp_config' + ); - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'reset_dhcp_config', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future deleteStaticLease({ + required Map data + }) async { + final result = await apiRequest( + urlPath: '/dhcp/remove_static_lease', + method: 'post', + server: server, + body: data, + type: 'remove_static_lease' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'remove_static_lease', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future createStaticLease({ + required Map data + }) async { + final result = await apiRequest( + urlPath: '/dhcp/add_static_lease', + method: 'post', + server: server, + body: data, + type: 'add_static_lease' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else if (result['statusCode'] == 400 && result['body'].contains('static lease already exists')) { + return { + 'result': 'error', + 'message': 'already_exists', + 'log': AppLog( + type: 'add_static_lease', + dateTime: DateTime.now(), + message: 'already_exists', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + else if (result['statusCode'] == 400 && result['body'].contains('server is unconfigured')) { + return { + 'result': 'error', + 'message': 'server_not_configured', + 'log': AppLog( + type: 'add_static_lease', + dateTime: DateTime.now(), + message: 'server_not_configured', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'add_static_lease', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future restoreAllLeases() async { + final result = await apiRequest( + urlPath: '/dhcp/reset_leases', + method: 'post', + server: server, + body: {}, + type: 'restore_all_leases' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return {'result': 'success'}; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'restore_all_leases', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getDnsRewriteRules() async { + final result = await apiRequest( + urlPath: '/rewrite/list', + method: 'get', + server: server, + type: 'get_dns_rewrite_rules' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + final List data = List.from( + jsonDecode(result['body']).map((item) => RewriteRules.fromJson(item)) + ); + + return { + 'result': 'success', + 'data': data + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_dns_rewrite_rules', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future deleteDnsRewriteRule({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/rewrite/delete', + method: 'post', + server: server, + body: data, + type: 'delete_dns_rewrite_rule' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'delete_dns_rewrite_rule', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future addDnsRewriteRule({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/rewrite/add', + method: 'post', + server: server, + body: data, + type: 'add_dns_rewrite_rule' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'add_dns_rewrite_rule', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getQueryLogInfo() async { + final result = await apiRequest( + urlPath: '/querylog/config', + method: 'get', + server: server, + type: 'get_query_log_info' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': jsonDecode(result['body']) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_query_log_info', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getQueryLogInfoLegacy() async { + final result = await apiRequest( + urlPath: '/querylog_info', + method: 'get', + server: server, + type: 'get_query_log_info' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': jsonDecode(result['body']) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_query_log_info', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future updateQueryLogParameters({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/querylog/config/update', + method: 'put', + server: server, + body: data, + type: 'update_query_log_config' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_query_log_config', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future updateQueryLogParametersLegacy({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/querylog_config', + method: 'post', + server: server, + body: data, + type: 'update_query_log_config' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_query_log_config', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future clearLogs() async { + final result = await apiRequest( + urlPath: '/querylog_clear', + method: 'post', + server: server, + body: {}, + type: 'clear_query_logs' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'clear_query_logs', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getDnsInfo() async { + final result = await apiRequest( + urlPath: '/dns_info', + method: 'get', + server: server, + type: 'get_dns_info' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success' , + 'data': DnsInfo.fromJson(jsonDecode(result['body'])) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_dns_info', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future setDnsConfig({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/dns_config', + method: 'post', + server: server, + body: data, + type: 'set_dns_config' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + if (result['statusCode'] == 400) { + return { + 'result': 'error', + 'log': AppLog( + type: 'set_dns_config', + dateTime: DateTime.now(), + message: 'data_not_valid', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'set_dns_config', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getEncryptionSettings() async { + final result = await apiRequest( + urlPath: '/tls/status', + method: 'get', + server: server, + type: 'get_encryption_settings' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': EncryptionData.fromJson(jsonDecode(result['body'])) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_encryption_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future getBlockedServices() async { + final result = await apiRequest( + urlPath: '/blocked_services/all', + method: 'get', + server: server, + type: 'get_blocked_services' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': List.from( + BlockedServicesFromApi.fromJson(jsonDecode(result['body'])).blockedServices + ) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_encryption_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future checkEncryptionSettings({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/tls/validate', + method: 'post', + server: server, + body: data, + type: 'check_encryption_settings' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { + 'result': 'success', + 'data': jsonDecode(result['body']) + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'check_encryption_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future saveEncryptionSettings({ + required Map data, + }) async { + final result = await apiRequest( + urlPath: '/tls/configure', + method: 'post', + server: server, + body: data, + type: 'update_encryption_settings' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_encryption_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future resetDnsCache() async { + final result = await apiRequest( + urlPath: '/cache_clear', + method: 'post', + server: server, + type: 'clear_dns_cache' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'clear_dns_cache', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } + } + + Future checkServerUpdates() async { + final result = await Future.wait([ + apiRequest( + urlPath: '/version.json', + method: 'get', + server: server, + type: 'check_server_updates', + body: json.encode({ + "recheck_now": true + }) + ), + apiRequest( + urlPath: '/status', + method: 'get', + server: server, + type: 'check_server_updates', + body: json.encode({ + "recheck_now": true + }) + ), + ]); + + if (result[0]['hasResponse'] == true && result[0]['hasResponse'] == true) { + if (result[0]['statusCode'] == 200 && result[0]['statusCode'] == 200) { + final Map obj = { + ...jsonDecode(result[0]['body']), + 'current_version': jsonDecode(result[1]['body'])['version'] + }; + return { + 'result': 'success', + 'data': obj + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'get_filtering_status', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), + ) + }; + } } else { return { 'result': 'error', 'log': AppLog( - type: 'save_dhcp_config', + type: 'get_filtering_status', dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], + message: 'no_response', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), ) }; } } - else { - return result; + + Future getUpdateChangelog({ + required String releaseTag + }) async { + try { + HttpClient httpClient = HttpClient(); + HttpClientRequest request = await httpClient.getUrl(Uri.parse("${Urls.adGuardHomeReleasesTags}/$releaseTag")); + HttpClientResponse response = await request.close(); + String reply = await response.transform(utf8.decoder).join(); + httpClient.close(); + if (response.statusCode == 200) { + return { + 'result': 'success', + 'hasResponse': true, + 'error': false, + 'statusCode': response.statusCode, + 'body': jsonDecode(reply)['body'] + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_encryption_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: response.statusCode.toString(), + resBody: reply, + ) + }; + } + } on SocketException { + return { + 'result': 'no_connection', + 'message': 'SocketException', + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: 'SocketException' + ) + }; + } on TimeoutException { + return { + 'result': 'no_connection', + 'message': 'TimeoutException', + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: 'TimeoutException' + ) + }; + } on HandshakeException { + return { + 'result': 'ssl_error', + 'message': 'HandshakeException', + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: 'HandshakeException' + ) + }; + } catch (e) { + return { + 'result': 'error', + 'message': e.toString(), + 'log': AppLog( + type: 'check_latest_release_github', + dateTime: DateTime.now(), + message: e.toString() + ) + }; + } } -} -Future resetDhcpConfig({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/dhcp/reset', - method: 'post', - server: server, - body: {}, - type: 'reset_dhcp_config' - ); + Future requestUpdateServer() async { + final result = await apiRequest( + urlPath: '/update', + method: 'post', + server: server, + type: 'update_server' + ); - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_server', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } } else { - return { - 'result': 'error', - 'log': AppLog( - type: 'reset_dhcp_config', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; + return result; } } - else { - return result; - } -} -Future deleteStaticLease({ - required Server server, - required Map data -}) async { - final result = await apiRequest( - urlPath: '/dhcp/remove_static_lease', - method: 'post', - server: server, - body: data, - type: 'remove_static_lease' - ); + Future updateSafeSearchSettings({ - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; + required Map body + }) async { + final result = await apiRequest( + urlPath: '/safesearch/settings', + method: 'put', + server: server, + type: 'safesearch_settings', + body: body + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'safesearch_settings', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } } else { - return { - 'result': 'error', - 'log': AppLog( - type: 'remove_static_lease', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; + return result; } } - else { - return result; - } -} - -Future createStaticLease({ - required Server server, - required Map data -}) async { - final result = await apiRequest( - urlPath: '/dhcp/add_static_lease', - method: 'post', - server: server, - body: data, - type: 'add_static_lease' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else if (result['statusCode'] == 400 && result['body'].contains('static lease already exists')) { - return { - 'result': 'error', - 'message': 'already_exists', - 'log': AppLog( - type: 'add_static_lease', - dateTime: DateTime.now(), - message: 'already_exists', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - else if (result['statusCode'] == 400 && result['body'].contains('server is unconfigured')) { - return { - 'result': 'error', - 'message': 'server_not_configured', - 'log': AppLog( - type: 'add_static_lease', - dateTime: DateTime.now(), - message: 'server_not_configured', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'add_static_lease', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future restoreAllLeases({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/dhcp/reset_leases', - method: 'post', - server: server, - body: {}, - type: 'restore_all_leases' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return {'result': 'success'}; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'restore_all_leases', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getDnsRewriteRules({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/rewrite/list', - method: 'get', - server: server, - type: 'get_dns_rewrite_rules' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - final List data = List.from( - jsonDecode(result['body']).map((item) => RewriteRules.fromJson(item)) - ); - - return { - 'result': 'success', - 'data': data - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_dns_rewrite_rules', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future deleteDnsRewriteRule({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/rewrite/delete', - method: 'post', - server: server, - body: data, - type: 'delete_dns_rewrite_rule' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'delete_dns_rewrite_rule', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future addDnsRewriteRule({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/rewrite/add', - method: 'post', - server: server, - body: data, - type: 'add_dns_rewrite_rule' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'add_dns_rewrite_rule', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getQueryLogInfo({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/querylog/config', - method: 'get', - server: server, - type: 'get_query_log_info' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': jsonDecode(result['body']) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_query_log_info', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getQueryLogInfoLegacy({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/querylog_info', - method: 'get', - server: server, - type: 'get_query_log_info' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': jsonDecode(result['body']) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_query_log_info', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future updateQueryLogParameters({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/querylog/config/update', - method: 'put', - server: server, - body: data, - type: 'update_query_log_config' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_query_log_config', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future updateQueryLogParametersLegacy({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/querylog_config', - method: 'post', - server: server, - body: data, - type: 'update_query_log_config' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_query_log_config', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future clearLogs({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/querylog_clear', - method: 'post', - server: server, - body: {}, - type: 'clear_query_logs' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'clear_query_logs', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getDnsInfo({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/dns_info', - method: 'get', - server: server, - type: 'get_dns_info' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success' , - 'data': DnsInfo.fromJson(jsonDecode(result['body'])) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_dns_info', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future setDnsConfig({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/dns_config', - method: 'post', - server: server, - body: data, - type: 'set_dns_config' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - if (result['statusCode'] == 400) { - return { - 'result': 'error', - 'log': AppLog( - type: 'set_dns_config', - dateTime: DateTime.now(), - message: 'data_not_valid', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'set_dns_config', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getEncryptionSettings({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/tls/status', - method: 'get', - server: server, - type: 'get_encryption_settings' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': EncryptionData.fromJson(jsonDecode(result['body'])) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_encryption_settings', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future getBlockedServices({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/blocked_services/all', - method: 'get', - server: server, - type: 'get_blocked_services' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': List.from( - BlockedServicesFromApi.fromJson(jsonDecode(result['body'])).blockedServices - ) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_encryption_settings', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future checkEncryptionSettings({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/tls/validate', - method: 'post', - server: server, - body: data, - type: 'check_encryption_settings' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { - 'result': 'success', - 'data': jsonDecode(result['body']) - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'check_encryption_settings', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future saveEncryptionSettings({ - required Server server, - required Map data, -}) async { - final result = await apiRequest( - urlPath: '/tls/configure', - method: 'post', - server: server, - body: data, - type: 'update_encryption_settings' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_encryption_settings', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future resetDnsCache({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/cache_clear', - method: 'post', - server: server, - type: 'clear_dns_cache' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'clear_dns_cache', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } } Future checkAppUpdatesGitHub() async { @@ -2119,206 +2270,4 @@ Future checkAppUpdatesGitHub() async { ) }; } -} - -Future checkServerUpdates({ - required Server server, -}) async { - final result = await Future.wait([ - apiRequest( - urlPath: '/version.json', - method: 'get', - server: server, - type: 'check_server_updates', - body: json.encode({ - "recheck_now": true - }) - ), - apiRequest( - urlPath: '/status', - method: 'get', - server: server, - type: 'check_server_updates', - body: json.encode({ - "recheck_now": true - }) - ), - ]); - - if (result[0]['hasResponse'] == true && result[0]['hasResponse'] == true) { - if (result[0]['statusCode'] == 200 && result[0]['statusCode'] == 200) { - final Map obj = { - ...jsonDecode(result[0]['body']), - 'current_version': jsonDecode(result[1]['body'])['version'] - }; - return { - 'result': 'success', - 'data': obj - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_filtering_status', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString(), - ) - }; - } - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'get_filtering_status', - dateTime: DateTime.now(), - message: 'no_response', - statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), - resBody: result.map((res) => res['body'] ?? 'null').toString(), - ) - }; - } -} - -Future getUpdateChangelog({ - required Server server, - required String releaseTag -}) async { - try { - HttpClient httpClient = HttpClient(); - HttpClientRequest request = await httpClient.getUrl(Uri.parse("${Urls.adGuardHomeReleasesTags}/$releaseTag")); - HttpClientResponse response = await request.close(); - String reply = await response.transform(utf8.decoder).join(); - httpClient.close(); - if (response.statusCode == 200) { - return { - 'result': 'success', - 'hasResponse': true, - 'error': false, - 'statusCode': response.statusCode, - 'body': jsonDecode(reply)['body'] - }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_encryption_settings', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: response.statusCode.toString(), - resBody: reply, - ) - }; - } - } on SocketException { - return { - 'result': 'no_connection', - 'message': 'SocketException', - 'log': AppLog( - type: 'check_latest_release_github', - dateTime: DateTime.now(), - message: 'SocketException' - ) - }; - } on TimeoutException { - return { - 'result': 'no_connection', - 'message': 'TimeoutException', - 'log': AppLog( - type: 'check_latest_release_github', - dateTime: DateTime.now(), - message: 'TimeoutException' - ) - }; - } on HandshakeException { - return { - 'result': 'ssl_error', - 'message': 'HandshakeException', - 'log': AppLog( - type: 'check_latest_release_github', - dateTime: DateTime.now(), - message: 'HandshakeException' - ) - }; - } catch (e) { - return { - 'result': 'error', - 'message': e.toString(), - 'log': AppLog( - type: 'check_latest_release_github', - dateTime: DateTime.now(), - message: e.toString() - ) - }; - } -} - -Future requestUpdateServer({ - required Server server, -}) async { - final result = await apiRequest( - urlPath: '/update', - method: 'post', - server: server, - type: 'update_server' - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'update_server', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } -} - -Future updateSafeSearchSettings({ - required Server server, - required Map body -}) async { - final result = await apiRequest( - urlPath: '/safesearch/settings', - method: 'put', - server: server, - type: 'safesearch_settings', - body: body - ); - - if (result['hasResponse'] == true) { - if (result['statusCode'] == 200) { - return { 'result': 'success' }; - } - else { - return { - 'result': 'error', - 'log': AppLog( - type: 'safesearch_settings', - dateTime: DateTime.now(), - message: 'error_code_not_expected', - statusCode: result['statusCode'].toString(), - resBody: result['body'], - ) - }; - } - } - else { - return result; - } } \ No newline at end of file diff --git a/lib/widgets/add_server_modal.dart b/lib/widgets/add_server_modal.dart index d299cf4..51d8b22 100644 --- a/lib/widgets/add_server_modal.dart +++ b/lib/widgets/add_server_modal.dart @@ -261,13 +261,16 @@ class _AddServerModalState extends State { final serverCreated = await serversProvider.createServer(serverObj); if (serverCreated == null) { statusProvider.setServerStatusLoad(LoadStatus.loading); + + final ApiClient apiClient = ApiClient(server: serverObj); - final serverStatus = await getServerStatus(serverObj); + final serverStatus = await apiClient.getServerStatus(); if (serverStatus['result'] == 'success') { statusProvider.setServerStatusData( data: serverStatus['data'] ); + serversProvider.setApiClient(apiClient); statusProvider.setServerStatusLoad(LoadStatus.loaded); if (serverStatus['data'].serverVersion.contains('a') || serverStatus['data'].serverVersion.contains('b')) { Navigator.pop(context); @@ -382,7 +385,8 @@ class _AddServerModalState extends State { final serverSaved = await serversProvider.editServer(serverObj); if (serverSaved == null) { - final version = await getServerVersion(serverObj); + final ApiClient apiClient = ApiClient(server: serverObj); + final version = await apiClient.getServerVersion(); if ( version['result'] == 'success' && (version['data'].contains('a') || version['data'].contains('b')) // alpha or beta diff --git a/lib/widgets/bottom_nav_bar.dart b/lib/widgets/bottom_nav_bar.dart index 36abbbe..8465844 100644 --- a/lib/widgets/bottom_nav_bar.dart +++ b/lib/widgets/bottom_nav_bar.dart @@ -17,11 +17,10 @@ class BottomNavBar extends StatelessWidget { final appConfigProvider = Provider.of(context); final logsProvider = Provider.of(context); - List screens = serversProvider.selectedServer != null + List screens = serversProvider.selectedServer != null && serversProvider.apiClient != null ? screensServerConnected : screensSelectServer; - String translatedName(String key) { switch (key) { case 'home': @@ -47,8 +46,14 @@ class BottomNavBar extends StatelessWidget { } } + if ((serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1) { + appConfigProvider.setSelectedScreen(0); + } + return NavigationBar( - selectedIndex: appConfigProvider.selectedScreen, + selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1 + ? 0 + : appConfigProvider.selectedScreen, destinations: screens.map((screen) => NavigationDestination( icon: Stack( children: [ diff --git a/lib/widgets/domain_options.dart b/lib/widgets/domain_options.dart index 415a8c3..58409d9 100644 --- a/lib/widgets/domain_options.dart +++ b/lib/widgets/domain_options.dart @@ -9,12 +9,10 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/options_modal.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; +import 'package:adguard_home_manager/functions/snackbar.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'; import 'package:adguard_home_manager/models/menu_option.dart'; class DomainOptions extends StatelessWidget { @@ -37,7 +35,6 @@ class DomainOptions extends StatelessWidget { @override Widget build(BuildContext context) { - final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); @@ -45,52 +42,26 @@ class DomainOptions extends StatelessWidget { final ProcessModal processModal = ProcessModal(context: context); processModal.open(AppLocalizations.of(context)!.savingUserFilters); - final rules = await getFilteringRules(server: serversProvider.selectedServer!); + final rules = await statusProvider.blockUnblockDomain( + domain: domain, + newStatus: newStatus + ); - if (rules['result'] == 'success') { - FilteringStatus oldStatus = statusProvider.serverStatus!.filteringStatus; + processModal.close(); - List newRules = rules['data'].userRules.where((d) => !d.contains(domain)).toList(); - if (newStatus == 'block') { - newRules.add("||$domain^"); - } - else if (newStatus == 'unblock') { - newRules.add("@@||$domain^"); - } - FilteringStatus newObj = statusProvider.serverStatus!.filteringStatus; - newObj.userRules = newRules; - statusProvider.setFilteringStatus(newObj); - - final result = await postFilteringRules(server: serversProvider.selectedServer!, data: {'rules': newRules}); - - processModal.close(); - - if (result['result'] == 'success') { - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated), - backgroundColor: Colors.green, - ) - ); - } - else { - appConfigProvider.addLog(result['log']); - statusProvider.setFilteringStatus(oldStatus); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated), - backgroundColor: Colors.red, - ) - ); - } + if (rules == true) { + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.userFilteringRulesUpdated, + color: Colors.green + ); } else { - appConfigProvider.addLog(rules['log']); - ScaffoldMessenger.of(context).showSnackBar( - SnackBar( - content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated), - backgroundColor: Colors.red, - ) + showSnacbkar( + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.userFilteringRulesNotUpdated, + color: Colors.red + ); } } diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index 6dc028f..063993c 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -46,8 +46,14 @@ class SideNavigationRail extends StatelessWidget { } } + if ((serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1) { + appConfigProvider.setSelectedScreen(0); + } + return NavigationRail( - selectedIndex: appConfigProvider.selectedScreen, + selectedIndex: (serversProvider.selectedServer == null || serversProvider.apiClient == null) && appConfigProvider.selectedScreen > 1 + ? 0 + : appConfigProvider.selectedScreen, destinations: screens.map((screen) => NavigationRailDestination( icon: Icon( screen.icon, diff --git a/lib/widgets/servers_list/servers_list_item.dart b/lib/widgets/servers_list/servers_list_item.dart index 1a9c482..fb3364e 100644 --- a/lib/widgets/servers_list/servers_list_item.dart +++ b/lib/widgets/servers_list/servers_list_item.dart @@ -135,10 +135,12 @@ class _ServersListItemState extends State with SingleTickerProv : await login(server); if (result['result'] == 'success') { + final ApiClient apiClient = ApiClient(server: server); + serversProvider.setApiClient(apiClient); serversProvider.setSelectedServer(server); statusProvider.setServerStatusLoad(LoadStatus.loading); - final serverStatus = await getServerStatus(server); + final serverStatus = await apiClient.getServerStatus(); if (serverStatus['result'] == 'success') { statusProvider.setServerStatusData( data: serverStatus['data'] diff --git a/lib/widgets/servers_list/servers_tile_item.dart b/lib/widgets/servers_list/servers_tile_item.dart index 32c3772..fd274d6 100644 --- a/lib/widgets/servers_list/servers_tile_item.dart +++ b/lib/widgets/servers_list/servers_tile_item.dart @@ -102,10 +102,12 @@ class _ServersTileItemState extends State with SingleTickerProv : await login(server); if (result['result'] == 'success') { + final ApiClient apiClient = ApiClient(server: server); + serversProvider.setApiClient(apiClient); serversProvider.setSelectedServer(server); statusProvider.setServerStatusLoad(LoadStatus.loading); - final serverStatus = await getServerStatus(server); + final serverStatus = await apiClient.getServerStatus(); if (serverStatus['result'] == 'success') { statusProvider.setServerStatusData( data: serverStatus['data']