mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-04-27 17:26:07 +00:00
Changed http requests to http client class
This commit is contained in:
parent
9e0eae7c57
commit
90fa963cfc
66 changed files with 3584 additions and 3477 deletions
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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."
|
||||
}
|
|
@ -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."
|
||||
}
|
|
@ -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(),
|
||||
|
|
|
@ -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({
|
||||
|
|
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
@ -84,11 +92,6 @@ class LogsProvider with ChangeNotifier {
|
|||
notifyListeners();
|
||||
}
|
||||
|
||||
void setClientsLoadStatus(int status) {
|
||||
_clientsLoadStatus = status;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void setLogsOlderThan(DateTime? value) {
|
||||
_logsOlderThan = value;
|
||||
notifyListeners();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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,20 +186,10 @@ 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
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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,8 +119,6 @@ class _AddedListState extends State<AddedList> {
|
|||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.clientNotDeleted,
|
||||
|
@ -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,
|
||||
);
|
||||
|
|
|
@ -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,
|
||||
)
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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),
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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}"'
|
||||
|
|
|
@ -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,8 +104,6 @@ class _SearchClientsState extends State<SearchClients> {
|
|||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.clientNotDeleted,
|
||||
|
@ -129,30 +116,11 @@ class _SearchClientsState extends State<SearchClients> {
|
|||
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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
});
|
||||
|
||||
if (result1['result'] == 'success') {
|
||||
if (result1['data'].toString().contains("OK")) {
|
||||
final result2 = await getFiltering(server: serversProvider.selectedServer!);
|
||||
final items = result1['data'].toString().split(' ')[1];
|
||||
|
||||
if (result2['result'] == 'success') {
|
||||
filteringProvider.setFilteringData(result2['data']);
|
||||
filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result2['log']);
|
||||
filteringProvider.setFilteringLoadStatus(LoadStatus.error, true);
|
||||
}
|
||||
final result = await filteringProvider.addList(name: name, url: url, type: type);
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['success'] == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: "${AppLocalizations.of(context)!.listAdded} $items.",
|
||||
label: "${AppLocalizations.of(context)!.listAdded} ${result['data']}.",
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else {
|
||||
processModal.close();
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.listNotAdded,
|
||||
color: Colors.red
|
||||
);
|
||||
}
|
||||
}
|
||||
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,
|
||||
|
|
|
@ -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()
|
||||
),
|
||||
);
|
||||
|
|
|
@ -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 {
|
||||
if (mounted) {
|
||||
setState(() => resultWidget = checking());
|
||||
|
||||
final result = await checkHostFiltered(server: serversProvider.selectedServer!, host: domainController.text);
|
||||
final result = await serversProvider.apiClient!.checkHostFiltered(host: domainController.text);
|
||||
|
||||
if (mounted) {
|
||||
if (result['result'] == 'success') {
|
||||
final status = getFilteredStatus(context, appConfigProvider, result['data']['reason'], true);
|
||||
if (mounted) {
|
||||
|
@ -98,7 +97,6 @@ class _CheckHostModalState extends State<CheckHostModal> {
|
|||
}
|
||||
}
|
||||
else {
|
||||
if (mounted) {
|
||||
setState(() => resultWidget = Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
|
@ -120,7 +118,6 @@ class _CheckHostModalState extends State<CheckHostModal> {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Widget content() {
|
||||
return Column(
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,61 +31,34 @@ 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!);
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
final result2 = await getFiltering(server: serversProvider.selectedServer!);
|
||||
final result = await filteringProvider.updateLists();
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (mounted) {
|
||||
if (result2['result'] == 'success') {
|
||||
filteringProvider.setFilteringData(result2['data']);
|
||||
|
||||
if (result['success'] == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: "${result['data']['updated']} ${AppLocalizations.of(context)!.listsUpdated}",
|
||||
|
@ -95,21 +66,6 @@ class _FiltersState extends State<Filters> {
|
|||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result2['log']);
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.listsNotLoaded,
|
||||
color: Colors.red
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
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,8 +188,6 @@ class _FiltersState extends State<Filters> {
|
|||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.ruleNotRemoved,
|
||||
|
@ -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,
|
||||
actions: actions(),
|
||||
onRemoveCustomRule: openRemoveCustomRuleModal,
|
||||
onOpenDetailsModal: openListDetails,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
]
|
||||
|
|
|
@ -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,
|
||||
),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,17 +89,13 @@ 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']
|
||||
);
|
||||
}
|
||||
} else {
|
||||
final result = await statusProvider.getServerStatus();
|
||||
if (result == false) {
|
||||
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
|
||||
|
|
|
@ -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!);
|
||||
|
||||
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});
|
||||
final rules = await statusProvider.blockUnblockDomain(
|
||||
domain: domain,
|
||||
newStatus: newStatus
|
||||
);
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated),
|
||||
backgroundColor: Colors.green,
|
||||
)
|
||||
if (rules == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.userFilteringRulesUpdated,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
statusProvider.setFilteringStatus(oldStatus);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated),
|
||||
backgroundColor: Colors.red,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
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) {
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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!);
|
||||
|
||||
if (rules['result'] == 'success') {
|
||||
FilteringStatus oldStatus = statusProvider.filteringStatus!;
|
||||
|
||||
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});
|
||||
final rules = await statusProvider.blockUnblockDomain(
|
||||
domain: domain,
|
||||
newStatus: newStatus
|
||||
);
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated),
|
||||
backgroundColor: Colors.green,
|
||||
)
|
||||
if (rules == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.userFilteringRulesUpdated,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
statusProvider.setFilteringStatus(oldStatus);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated),
|
||||
backgroundColor: Colors.red,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
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
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
@ -32,124 +33,43 @@ 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
|
||||
);
|
||||
|
|
|
@ -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') {
|
||||
|
|
|
@ -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)
|
||||
),
|
||||
],
|
||||
|
|
|
@ -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
|
||||
),
|
||||
]
|
||||
);
|
||||
|
|
|
@ -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: () {
|
||||
|
|
|
@ -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
|
||||
// )
|
||||
// ),
|
||||
],
|
||||
)
|
||||
);
|
||||
|
|
|
@ -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 result = await Provider.of<DhcpProvider>(context, listen: false).loadDhcpStatus();
|
||||
if (mounted && result == true) {
|
||||
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);
|
||||
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,7 +192,8 @@ class _DhcpScreenState extends State<DhcpScreen> {
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.savingSettings);
|
||||
|
||||
final result = await saveDhcpConfig(server: serversProvider.selectedServer!, data: {
|
||||
final result = await serversProvider.apiClient!.saveDhcpConfig(
|
||||
data: {
|
||||
"enabled": enabled,
|
||||
"interface_name": selectedInterface!.name,
|
||||
if (selectedInterface!.ipv4Addresses.isNotEmpty) "v4": {
|
||||
|
@ -220,7 +208,8 @@ class _DhcpScreenState extends State<DhcpScreen> {
|
|||
"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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,7 +93,8 @@ 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
|
||||
final result = await dnsProvider.savePrivateReverseServersConfig(
|
||||
editReverseResolvers == true
|
||||
? {
|
||||
"local_ptr_upstreams": List<String>.from(reverseResolversControllers.map((e) => e['controller'].text)),
|
||||
"use_private_ptr_resolvers": usePrivateReverseDnsResolvers,
|
||||
|
@ -105,28 +102,19 @@ class _PrivateReverseDnsServersScreenState extends State<PrivateReverseDnsServer
|
|||
} : {
|
||||
"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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,7 +140,8 @@ 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 ?? {
|
||||
final result = await Provider.of<ServersProvider>(context, listen: false).apiClient!.checkEncryptionSettings(
|
||||
data: data ?? {
|
||||
"enabled": enabled,
|
||||
"server_name": domainNameController.text,
|
||||
"force_https": redirectHttps,
|
||||
|
@ -153,7 +153,8 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
"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,7 +225,8 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.savingConfig);
|
||||
|
||||
final result = await saveEncryptionSettings(server: serversProvider.selectedServer!, data: {
|
||||
final result = await serversProvider.apiClient!.saveEncryptionSettings(
|
||||
data: {
|
||||
"enabled": enabled,
|
||||
"server_name": domainNameController.text,
|
||||
"force_https": redirectHttps,
|
||||
|
@ -236,7 +238,8 @@ class _EncryptionSettingsWidgetState extends State<EncryptionSettingsWidget> {
|
|||
"private_key_saved": usePreviouslySavedKey,
|
||||
"certificate_path": certificatePathController.text,
|
||||
"private_key_path": privateKeyPathController.text,
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
processModal.close();
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
@ -58,52 +29,44 @@ class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScree
|
|||
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);
|
||||
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 = 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;
|
||||
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;
|
||||
});
|
||||
}
|
||||
else {
|
||||
widget.appConfigProvider.addLog(result['log']);
|
||||
widget.statusProvider.setServerStatusLoad(LoadStatus.error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@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,9 +74,7 @@ class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScree
|
|||
ProcessModal processModal = ProcessModal(context: context);
|
||||
processModal.open(AppLocalizations.of(context)!.savingSettings);
|
||||
|
||||
final result = await updateSafeSearchSettings(
|
||||
server: serversProvider.selectedServer!,
|
||||
body: {
|
||||
final result = await statusProvider.updateSafeSearchConfig({
|
||||
"enabled": generalEnabled,
|
||||
"bing": bingEnabled,
|
||||
"duckduckgo": duckduckgoEnabled,
|
||||
|
@ -121,25 +82,11 @@ class _SafeSearchSettingsScreenWidgetState extends State<SafeSearchSettingsScree
|
|||
"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,
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
],
|
||||
|
|
|
@ -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
|
@ -262,12 +262,15 @@ class _AddServerModalState extends State<AddServerModal> {
|
|||
if (serverCreated == null) {
|
||||
statusProvider.setServerStatusLoad(LoadStatus.loading);
|
||||
|
||||
final serverStatus = await getServerStatus(serverObj);
|
||||
final ApiClient apiClient = ApiClient(server: 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
|
||||
|
|
|
@ -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: [
|
||||
|
|
|
@ -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!);
|
||||
|
||||
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});
|
||||
final rules = await statusProvider.blockUnblockDomain(
|
||||
domain: domain,
|
||||
newStatus: newStatus
|
||||
);
|
||||
|
||||
processModal.close();
|
||||
|
||||
if (result['result'] == 'success') {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.userFilteringRulesUpdated),
|
||||
backgroundColor: Colors.green,
|
||||
)
|
||||
if (rules == true) {
|
||||
showSnacbkar(
|
||||
appConfigProvider: appConfigProvider,
|
||||
label: AppLocalizations.of(context)!.userFilteringRulesUpdated,
|
||||
color: Colors.green
|
||||
);
|
||||
}
|
||||
else {
|
||||
appConfigProvider.addLog(result['log']);
|
||||
statusProvider.setFilteringStatus(oldStatus);
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
content: Text(AppLocalizations.of(context)!.userFilteringRulesNotUpdated),
|
||||
backgroundColor: Colors.red,
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
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
|
||||
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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']
|
||||
|
|
Loading…
Add table
Reference in a new issue