Changed http requests to http client class

This commit is contained in:
Juan Gilsanz Polo 2023-05-25 15:06:21 +02:00
parent 9e0eae7c57
commit 90fa963cfc
66 changed files with 3584 additions and 3477 deletions

View file

@ -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<Map<String, dynamic>> blockUnblock(BuildContext context, String domain, String newStatus) async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final statusProvider = Provider.of<StatusProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<String> 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
};
}
}

View file

@ -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<bool> clearDnsCache(BuildContext context, Server server) async {
final serversProvider = Provider.of<ServersProvider>(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();

View file

@ -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."
}

View file

@ -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."
}

View file

@ -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<StatusProvider, FilteringProvider>(
ChangeNotifierProxyProvider2<ServersProvider, StatusProvider, ClientsProvider>(
create: (context) => clientsProvider,
update: (context, servers, status, clients) => clients!..update(servers, status),
),
ChangeNotifierProxyProvider2<ServersProvider, StatusProvider, FilteringProvider>(
create: (context) => filtersProvider,
update: (context, status, filtering) => filtering!..updateStatus(status),
update: (context, servers, status, filtering) => filtering!..update(servers, status),
),
ChangeNotifierProxyProvider<ServersProvider, StatusProvider>(
create: (context) => statusProvider,
update: (context, servers, status) => status!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, LogsProvider>(
create: (context) => logsProvider,
update: (context, servers, logs) => logs!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, DhcpProvider>(
create: (context) => dhcpProvider,
update: (context, servers, dhcp) => dhcp!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, RewriteRulesProvider>(
create: (context) => rewriteRulesProvider,
update: (context, servers, rewrite) => rewrite!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, DnsProvider>(
create: (context) => dnsProvider,
update: (context, servers, dns) => dns!..update(servers),
),
],
child: const Main(),

View file

@ -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({

View file

@ -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<bool> 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<bool> 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<bool> 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<bool> 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<Map<String, dynamic>> addClientList(String item, String type) async {
Map<String, List<String>> 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<Map<String, dynamic>> removeClientList(String client, String type) async {
Map<String, List<String>> 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
};
}
}
}

View file

@ -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<bool> 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<bool> 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<Map<String, dynamic>> 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
};
}
}
}

View file

@ -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<bool> 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<Map<String, dynamic>> savePrivateReverseServersConfig(Map<String, dynamic> 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<Map<String, dynamic>> saveUpstreamDnsConfig(Map<String, dynamic> value) async {
final result = await _serversProvider!.apiClient!.setDnsConfig(
data: value
);
if (result['result'] == 'success') {
DnsInfo data = dnsInfo!;
data.upstreamDns = List<String>.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<Map<String, dynamic>> saveBootstrapDnsConfig(Map<String, dynamic> value) async {
final result = await _serversProvider!.apiClient!.setDnsConfig(
data: value
);
if (result['result'] == 'success') {
DnsInfo data = dnsInfo!;
data.bootstrapDns = List<String>.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<Map<String, dynamic>> saveCacheCacheConfig(Map<String, dynamic> 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<Map<String, dynamic>> saveDnsServerConfig(Map<String, dynamic> 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
};
}
}
}

View file

@ -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<bool> 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<bool> 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<Map<String, dynamic>> 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<bool> 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<bool> 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<bool> removeCustomRule(String rule) async {
final List<String> 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<bool> 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<bool> 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<bool> addCustomRule(String rule) async {
final List<String> 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<Map<String, dynamic>> 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<bool> 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<bool> updateBlockedServices(List<String> values) async {
final result = await _serversProvider!.apiClient!.setBlockedServices(
data: values
);
if (result['result'] == 'success') {
setBlockedServices(values);
return true;
}
else {
notifyListeners();
return false;
}
}
}

View file

@ -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<AutoClient>? _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<bool> 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<bool> 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<bool> 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;
}
}
}

View file

@ -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>? _rewriteRules;
@ -26,4 +33,68 @@ class RewriteRulesProvider with ChangeNotifier {
notifyListeners();
}
}
Future<bool> addDnsRewrite(RewriteRules rule) async {
final result = await _serversProvider!.apiClient!.addDnsRewriteRule(
data: {
"domain": rule.domain,
"answer": rule.answer
}
);
if (result['result'] == 'success') {
List<RewriteRules> data = rewriteRules!;
data.add(rule);
setRewriteRulesData(data);
return true;
}
else {
notifyListeners();
return false;
}
}
Future<bool> deleteDnsRewrite(RewriteRules rule) async {
final result = await _serversProvider!.apiClient!.deleteDnsRewriteRule(
data: {
"domain": rule.domain,
"answer": rule.answer
}
);
if (result['result'] == 'success') {
List<RewriteRules> data = rewriteRules!;
data = data.where((item) => item.domain != rule.domain).toList();
setRewriteRulesData(data);
return true;
}
else {
notifyListeners();
return false;
}
}
Future<bool> 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;
}
}
}

View file

@ -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<Server> _serversList = [];
Server? _selectedServer;
ApiClient? _apiClient;
final UpdateAvailable _updateAvailable = UpdateAvailable(
loadStatus: LoadStatus.loading,
data: null,
);
ApiClient? get apiClient {
return _apiClient;
}
List<Server> get serversList {
return _serversList;
}
@ -59,6 +63,11 @@ class ServersProvider with ChangeNotifier {
notifyListeners();
}
void setApiClient(ApiClient client) {
_apiClient = client;
notifyListeners();
}
Future<dynamic> 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<Server> 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<Map<String, dynamic>> 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<Map<String, dynamic>?> saveFromDb(List<Map<String, dynamic>>? 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;

View file

@ -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<String> _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled
@ -48,7 +53,6 @@ class StatusProvider with ChangeNotifier {
}
Future<dynamic> 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<bool> getFilteringRules() async {
final result = await _serversProvider!.apiClient!.getFilteringRules();
if (result['result'] == 'success') {
_filteringStatus = result['data'];
notifyListeners();
return true;
}
else {
return false;
}
}
Future<bool> 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<bool> blockUnblockDomain({
required String domain,
required String newStatus
}) async {
final rules = await _serversProvider!.apiClient!.getFilteringRules();
if (rules['result'] == 'success') {
FilteringStatus oldStatus = serverStatus!.filteringStatus;
List<String> 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<bool> updateSafeSearchConfig(Map<String, bool> 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;
}
}
}

View file

@ -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<Client> 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<AddedList> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -89,31 +80,11 @@ class _AddedListState extends State<AddedList> {
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<AddedList> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.clientNotUpdated,
@ -135,19 +104,14 @@ class _AddedListState extends State<AddedList> {
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<AddedList> {
);
}
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<AddedList> {
),
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<AddedList> {
],
),
),
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,
);

View file

@ -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<Clients> with TickerProviderStateMixin {
bool searchMode = false;
final TextEditingController searchController = TextEditingController();
Future fetchClients() async {
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<ClientsProvider>(context, listen: false);
clientsProvider.fetchClients(updateLoading: true);
super.initState();
tabController = TabController(
initialIndex: 0,
@ -112,10 +94,8 @@ class _ClientsState extends State<Clients> 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<Clients> 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<Clients> with TickerProviderStateMixin {
child: ClientsDesktopView(
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
fetchClients: fetchClients,
)
);
}

View file

@ -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<ClientsDesktopView> 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<ClientsDesktopView> 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;

View file

@ -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<AutoClient> 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<ClientsProvider>(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),
);
}
}

View file

@ -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<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(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,

View file

@ -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<LogsListClient> {
String? responseStatus,
String? searchText,
}) async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
int offst = inOffset ?? offset;
if (loadingMore != null && loadingMore == true) {
@ -62,8 +64,7 @@ class _LogsListClientState extends State<LogsListClient> {
if (cancelableRequest != null) cancelableRequest!.cancel();
cancelableRequest = CancelableOperation.fromFuture(
getLogs(
server: widget.serversProvider.selectedServer!,
serversProvider.apiClient!.getLogs(
count: logsQuantity,
offset: offst,
search: '"${widget.ip}"'

View file

@ -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<SearchClients> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -95,19 +92,11 @@ class _SearchClientsState extends State<SearchClients> {
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<SearchClients> {
);
}
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<SearchClients> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.clientNotUpdated,

View file

@ -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<String> blockedServices;
@ -25,28 +22,14 @@ class ServicesModal extends StatefulWidget {
class _ServicesModalStateWidget extends State<ServicesModal> {
List<String> blockedServices = [];
Future loadBlockedServices() async {
final filteringProvider = Provider.of<FilteringProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<FilteringProvider>(context, listen: false);
if (filteringProvider.blockedServicesLoadStatus != LoadStatus.loaded) {
loadBlockedServices();
filteringProvider.getBlockedServices();
}
blockedServices = widget.blockedServices;

View file

@ -40,18 +40,11 @@ class AddFiltersButton extends StatelessWidget {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.addingRule);
final List<String> 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,

View file

@ -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<BlockedServicesScreen> {
List<String> values = [];
Future loadBlockedServices() async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final filteringProvider = Provider.of<FilteringProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<FilteringProvider>(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<BlockedServicesScreen> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -80,13 +61,11 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreen> {
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<BlockedServicesScreen> {
],
),
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()
),
);

View file

@ -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<CheckHostModal> {
final appConfigProvider = Provider.of<AppConfigProvider>(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<CheckHostModal> {
}
}
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
),
)
],
));
}
)
],
));
}
}
}

View file

@ -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<String> data;
final Future<void> 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<CustomRulesList> {
@override
Widget build(BuildContext context) {
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
bool checkIfComment(String value) {
final regex = RegExp(r'^(!|#).*$');
if (regex.hasMatch(value)) {
@ -155,7 +160,16 @@ class _CustomRulesListState extends State<CustomRulesList> {
),
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<CustomRulesList> {
),
),
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(

View file

@ -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<Filters> {
Future fetchFilters() async {
final filteringProvider = Provider.of<FilteringProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<AutoClient> generateClientsList(List<AutoClient> clients, List<String> ips) {
return clients.where((client) => ips.contains(client.ip)).toList();
}
@override
void initState() {
fetchFilters();
final filteringProvider = Provider.of<FilteringProvider>(context, listen: false);
filteringProvider.fetchFilters(showLoading: true);
super.initState();
}
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(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<Filters> {
: 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<Filters> {
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<Filters> {
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.deletingRule);
final List<String> 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<Filters> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.ruleNotRemoved,
color: Colors.red
);
);
}
}
@ -295,7 +233,7 @@ class _FiltersState extends State<Filters> {
List<Widget> 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<Filters> {
PopupMenuButton(
itemBuilder: (context) => [
PopupMenuItem(
onTap: fetchUpdateLists,
onTap: updateLists,
child: Row(
children: [
const Icon(Icons.sync_rounded),
@ -408,13 +346,11 @@ class _FiltersState extends State<Filters> {
onRemoveCustomRule: openRemoveCustomRuleModal,
onOpenDetailsModal: openListDetails,
actions: actions(),
refreshData: fetchFilters,
);
}
else {
return FiltersTabsView(
appConfigProvider: appConfigProvider,
fetchFilters: fetchFilters,
appConfigProvider: appConfigProvider,
actions: actions(),
onRemoveCustomRule: openRemoveCustomRuleModal,
onOpenDetailsModal: openListDetails,

View file

@ -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<Filter> data;
final Future<void> 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<FiltersList> {
@override
Widget build(BuildContext context) {
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return CustomTabContentList(
@ -129,7 +130,16 @@ class _FiltersListState extends State<FiltersList> {
),
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<FiltersList> {
),
),
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(

View file

@ -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<Widget> 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<FiltersTabsView> with TickerProviderSt
@override
void initState() {
widget.fetchFilters();
super.initState();
tabController = TabController(
initialIndex: 0,
@ -115,7 +112,6 @@ class _FiltersTabsViewState extends State<FiltersTabsView> 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<FiltersTabsView> 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<FiltersTabsView> with TickerProviderSt
scrollController: scrollController,
data: filteringProvider.loadStatus == LoadStatus.loaded
? filteringProvider.filtering!.userRules : [],
fetchData: widget.fetchFilters,
onRemoveCustomRule: widget.onRemoveCustomRule,
),
]

View file

@ -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<Widget> 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,
),

View file

@ -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<ListDetailsScreen> {
// ------- //
}
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<Widget> content() {
return [
CustomListTile(
@ -174,27 +203,9 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
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<ListDetailsScreen> {
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<ListDetailsScreen> {
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<ListDetailsScreen> {
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<ListDetailsScreen> {
: -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

View file

@ -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<bool> enableDisableList({
required BuildContext context,
required Filter list,
required String listType,
}) async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
final filteringProvider = Provider.of<FilteringProvider>(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<bool> editList({
required BuildContext context,
required Filter list,
required String type
}) async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
final filteringProvider = Provider.of<FilteringProvider>(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<bool> deleteList({
required BuildContext context,
required Filter list,
required String type
}) async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
final filteringProvider = Provider.of<FilteringProvider>(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;
}
}

View file

@ -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<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(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,

View file

@ -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<Home> {
@override
initState(){
Provider.of<StatusProvider>(context, listen: false).getServerStatus();
super.initState();
isVisible = true;
@ -56,7 +56,6 @@ class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -280,14 +279,8 @@ class _HomeState extends State<Home> {
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,

View file

@ -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<ManagementModal> with SingleTickerProv
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -92,16 +89,12 @@ class _ManagementModalState extends State<ManagementModal> 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<ManagementModal> with SingleTickerProv
int? time
}) async {
final result = await statusProvider.updateBlocking(
server: serversProvider.selectedServer!,
block: filter,
newStatus: value,
time: time

View file

@ -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<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final logsProvider = Provider.of<LogsProvider>(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<String> 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<String, dynamic> item) {
String? name;
if (clients != null && clients == true) {

View file

@ -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<ClientsModal> {
@override
Widget build(BuildContext context) {
final logsProvider = Provider.of<LogsProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final height = MediaQuery.of(context).size.height;
@ -86,7 +88,7 @@ class _ClientsModalState extends State<ClientsModal> {
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<ClientsModal> {
),
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<ClientsModal> {
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
)

View file

@ -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<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final statusProvider = Provider.of<StatusProvider>(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<String> 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

View file

@ -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<Logs> {
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<LogsProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(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<AppConfigProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final statusProvider = Provider.of<StatusProvider>(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<LogsProvider>(context, listen: false);
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(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<LogsProvider>(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<Logs> {
@override
void initState() {
final logsProvider = Provider.of<LogsProvider>(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<Logs> {
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<Logs> {
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<Logs> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.logsNotCleared,
@ -271,7 +191,7 @@ class _LogsState extends State<Logs> {
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<Logs> {
),
);
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<Logs> {
)
);
case 2:
case LoadStatus.error:
return SizedBox(
width: double.maxFinite,
child: Column(
@ -403,11 +323,11 @@ class _LogsState extends State<Logs> {
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<Logs> {
)
);
logsProvider.setSearchText(null);
fetchLogs(
logsProvider.fetchLogs(
inOffset: 0,
searchText: ''
);
@ -525,7 +445,7 @@ class _LogsState extends State<Logs> {
)
);
logsProvider.setSelectedResultStatus('all');
fetchLogs(
logsProvider.fetchLogs(
inOffset: 0,
responseStatus: 'all'
);
@ -560,7 +480,7 @@ class _LogsState extends State<Logs> {
)
);
logsProvider.setSelectedClients(null);
fetchLogs(
logsProvider.fetchLogs(
inOffset: 0,
responseStatus: logsProvider.appliedFilters.selectedResultStatus
);

View file

@ -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<LogsConfigModalWidget> {
int loadStatus = 0;
void loadData() async {
final serversProvider = Provider.of<ServersProvider>(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') {

View file

@ -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<LogsFiltersModalWidget> {
@override
Widget build(BuildContext context) {
final logsProvider = Provider.of<LogsProvider>(context);
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -78,38 +74,6 @@ class _LogsFiltersModalWidgetState extends State<LogsFiltersModalWidget> {
"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<LogsFiltersModalWidget> {
}
}
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<LogsFiltersModalWidget> {
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<LogsFiltersModalWidget> {
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<LogsFiltersModalWidget> {
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)
),
],

View file

@ -23,29 +23,9 @@ class _AccessSettingsState extends State<AccessSettings> with TickerProviderStat
final ScrollController scrollController = ScrollController();
late TabController tabController;
Future fetchClients() async {
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<ClientsProvider>(context, listen: false).fetchClients(updateLoading: true);
super.initState();
tabController = TabController(
initialIndex: 0,
@ -68,7 +48,6 @@ class _AccessSettingsState extends State<AccessSettings> 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<AccessSettings> 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<AccessSettings> with TickerProviderStat
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.clients!.clientsAllowedBlocked!.blockedHosts : [],
fetchClients: fetchClients
),
]
);

View file

@ -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<String> 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<ClientsList> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(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<String, List<String>> body = {
"allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [],
@ -94,20 +99,18 @@ class _ClientsListState extends State<ClientsList> {
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<ClientsList> {
);
}
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<String, List<String>> 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<ClientsList> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: type == 'allowed' || type == 'blocked'
@ -327,7 +310,7 @@ class _ClientsListState extends State<ClientsList> {
),
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<ClientsList> {
),
),
loadStatus: widget.loadStatus,
onRefresh: widget.fetchClients,
onRefresh: refetchClients,
refreshIndicatorOffset: 0,
fab: FloatingActionButton(
onPressed: () {

View file

@ -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
// )
// ),
],
)
);

View file

@ -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<DhcpScreen> {
bool dataValid = false;
void loadDhcpStatus() async {
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final dhcpProvider = Provider.of<DhcpProvider>(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<DhcpProvider>(context, listen: false).loadDhcpStatus();
if (mounted && result == true) {
final dhcpProvider = Provider.of<DhcpProvider>(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<DhcpScreen> {
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<DhcpScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.settingsNotSaved,
@ -247,7 +234,7 @@ class _DhcpScreenState extends State<DhcpScreen> {
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<DhcpScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.configNotRestored,
@ -277,7 +262,7 @@ class _DhcpScreenState extends State<DhcpScreen> {
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<DhcpScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.leasesNotRestored,

View file

@ -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<Lease> items;
@ -30,7 +28,6 @@ class DhcpLeases extends StatelessWidget {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final dhcpProvider = Provider.of<DhcpProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(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,

View file

@ -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<BootstrapDnsScreen> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final dnsProvider = Provider.of<DnsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -74,26 +70,20 @@ class _BootstrapDnsScreenState extends State<BootstrapDnsScreen> {
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<String>.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<BootstrapDnsScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,

View file

@ -75,7 +75,7 @@ class _CacheConfigDnsScreenState extends State<CacheConfigDnsScreen> {
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<CacheConfigDnsScreen> {
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<CacheConfigDnsScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,

View file

@ -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<DnsSettings> {
void fetchData({bool? showRefreshIndicator}) async {
final dnsProvider = Provider.of<DnsProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<DnsProvider>(context, listen: false).fetchDnsData(showLoading: true);
super.initState();
}
@ -192,7 +169,7 @@ class _DnsSettingsState extends State<DnsSettings> {
PopupMenuButton(
itemBuilder: (context) => [
PopupMenuItem(
onTap: () => fetchData(showRefreshIndicator: true),
onTap: () => dnsProvider.fetchDnsData(),
child: Row(
children: [
const Icon(Icons.refresh_rounded),

View file

@ -100,7 +100,6 @@ class _DnsServerSettingsScreenState extends State<DnsServerSettingsScreen> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final dnsProvider = Provider.of<DnsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -108,36 +107,26 @@ class _DnsServerSettingsScreenState extends State<DnsServerSettingsScreen> {
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<DnsServerSettingsScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,

View file

@ -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<PrivateReverseDnsServer
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final dnsProvider = Provider.of<DnsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -97,36 +93,28 @@ class _PrivateReverseDnsServersScreenState extends State<PrivateReverseDnsServer
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingConfig);
final result = await setDnsConfig(server: serversProvider.selectedServer!, data: editReverseResolvers == true
? {
"local_ptr_upstreams": List<String>.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<String>.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<String>.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<PrivateReverseDnsServer
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,

View file

@ -10,12 +10,10 @@ import 'package:adguard_home_manager/widgets/section_label.dart';
import 'package:adguard_home_manager/screens/settings/dns/comment_modal.dart';
import 'package:adguard_home_manager/widgets/custom_radio_list_tile.dart';
import 'package:adguard_home_manager/models/dns_info.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/providers/app_config_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
class UpstreamDnsScreen extends StatefulWidget {
@ -145,28 +143,21 @@ class _UpstreamDnsScreenState extends State<UpstreamDnsScreen> {
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<String>.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<UpstreamDnsScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsConfigNotSaved,

View file

@ -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<DnsRewritesScreen> {
Future fetchData() async {
final rewriteRulesProvider = Provider.of<RewriteRulesProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(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<RewriteRulesProvider>(context, listen: false).fetchRules();
super.initState();
}
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final rewriteRulesProvider = Provider.of<RewriteRulesProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -63,18 +41,11 @@ class _DnsRewritesScreenState extends State<DnsRewritesScreen> {
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<RewriteRules> 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<DnsRewritesScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsRewriteRuleNotDeleted,
@ -95,18 +65,11 @@ class _DnsRewritesScreenState extends State<DnsRewritesScreen> {
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<RewriteRules> 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<DnsRewritesScreen> {
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.dnsRewriteRuleNotAdded,
@ -149,7 +111,14 @@ class _DnsRewritesScreenState extends State<DnsRewritesScreen> {
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),

View file

@ -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<EncryptionSettingsWidget> {
void fetchData({bool? showRefreshIndicator}) async {
setState(() => loadStatus = 0);
final result = await getEncryptionSettings(server: widget.serversProvider.selectedServer!);
final result = await Provider.of<ServersProvider>(context, listen: false).apiClient!.getEncryptionSettings();
if (mounted) {
if (result['result'] == 'success') {
@ -141,19 +140,21 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
Future checkValidDataApi({Map<String, dynamic>? 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<ServersProvider>(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<EncryptionSettingsWidget> {
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();

View file

@ -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<ServersProvider>(context);
final statusProviuder = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return SafeSearchSettingsScreenWidget(
serversProvider: serversProvider,
statusProvider: statusProviuder,
appConfigProvider: appConfigProvider,
);
}
State<SafeSearchSettingsScreen> 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<SafeSearchSettingsScreenWidget> createState() => _SafeSearchSettingsScreenWidgetState();
}
class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScreenWidget> {
class _SafeSearchSettingsScreenState extends State<SafeSearchSettingsScreen> {
bool generalEnabled = false;
bool bingEnabled = false;
bool duckduckgoEnabled = false;
@ -56,54 +27,46 @@ class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScree
bool pixabayEnabled = false;
bool yandexEnabled = false;
bool youtubeEnabled = false;
Future requestSafeSearchSettings() async {
if (mounted) {
final result = await getServerStatus(widget.serversProvider.selectedServer!);
if (mounted) {
if (result['result'] == 'success') {
widget.statusProvider.setServerStatusData(
data: result['data']
);
widget.statusProvider.setServerStatusLoad(LoadStatus.loaded);
setState(() {
generalEnabled = result['data'].safeSearchEnabled;
bingEnabled = result['data'].safeSeachBing;
duckduckgoEnabled = result['data'].safeSearchDuckduckgo;
googleEnabled = result['data'].safeSearchGoogle;
pixabayEnabled = result['data'].safeSearchPixabay;
yandexEnabled = result['data'].safeSearchYandex;
youtubeEnabled = result['data'].safeSearchYoutube;
});
}
else {
widget.appConfigProvider.addLog(result['log']);
widget.statusProvider.setServerStatusLoad(LoadStatus.error);
}
final result = await Provider.of<StatusProvider>(context, listen: false).getServerStatus();
if (mounted && result == true) {
final statusProvider = Provider.of<StatusProvider>(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<StatusProvider>(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<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -111,35 +74,19 @@ class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScree
ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.savingSettings);
final result = await updateSafeSearchSettings(
server: serversProvider.selectedServer!,
body: {
"enabled": generalEnabled,
"bing": bingEnabled,
"duckduckgo": duckduckgoEnabled,
"google": googleEnabled,
"pixabay": pixabayEnabled,
"yandex": yandexEnabled,
"youtube": youtubeEnabled
}
);
final result = await statusProvider.updateSafeSearchConfig({
"enabled": generalEnabled,
"bing": bingEnabled,
"duckduckgo": duckduckgoEnabled,
"google": googleEnabled,
"pixabay": pixabayEnabled,
"yandex": yandexEnabled,
"youtube": youtubeEnabled
});
processModal.close();
if (result['result'] == 'success') {
ServerStatus data = statusProvider.serverStatus!;
data.safeSearchEnabled = generalEnabled;
data.safeSeachBing = bingEnabled;
data.safeSearchDuckduckgo = duckduckgoEnabled;
data.safeSearchGoogle = googleEnabled;
data.safeSearchPixabay = pixabayEnabled;
data.safeSearchYandex = yandexEnabled;
data.safeSearchYoutube = youtubeEnabled;
statusProvider.setServerStatusData(
data: data
);
if (result == true) {
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.settingsUpdatedSuccessfully,
@ -148,7 +95,6 @@ class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScree
);
}
else {
appConfigProvider.addLog(result['log']);
showSnacbkar(
appConfigProvider: appConfigProvider,
label: AppLocalizations.of(context)!.settingsNotSaved,

View file

@ -1,3 +1,4 @@
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:animations/animations.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -7,7 +8,6 @@ import 'package:adguard_home_manager/screens/settings/server_info/dns_addresses_
import 'package:adguard_home_manager/widgets/custom_list_tile.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/server_info.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
@ -41,20 +41,19 @@ class ServerInformationWidget extends StatefulWidget {
}
class _ServerInformationWidgetState extends State<ServerInformationWidget> {
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<ServersProvider>(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<ServerInformationWidget> {
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<ServerInformationWidget> {
),
);
case 1:
case LoadStatus.loaded:
return ListView(
children: [
CustomListTile(
@ -145,7 +144,7 @@ class _ServerInformationWidgetState extends State<ServerInformationWidget> {
]
);
case 2:
case LoadStatus.error:
return SizedBox(
width: double.maxFinite,
child: Column(

View file

@ -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,

View file

@ -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)
],

View file

@ -132,14 +132,8 @@ class _TopItemsScreenState extends State<TopItemsScreen> {
),
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,

File diff suppressed because it is too large Load diff

View file

@ -261,13 +261,16 @@ class _AddServerModalState extends State<AddServerModal> {
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<AddServerModal> {
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

View file

@ -17,11 +17,10 @@ class BottomNavBar extends StatelessWidget {
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final logsProvider = Provider.of<LogsProvider>(context);
List<AppScreen> screens = serversProvider.selectedServer != null
List<AppScreen> 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: [

View file

@ -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<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(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<String> 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
);
}
}

View file

@ -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,

View file

@ -135,10 +135,12 @@ class _ServersListItemState extends State<ServersListItem> 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']

View file

@ -102,10 +102,12 @@ class _ServersTileItemState extends State<ServersTileItem> 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']