Moved filtering to separate provider

This commit is contained in:
Juan Gilsanz Polo 2023-05-24 15:11:24 +02:00
parent 04b7868588
commit 19ac14e49e
18 changed files with 240 additions and 356 deletions

View file

@ -49,7 +49,7 @@ void main() async {
ServersProvider serversProvider = ServersProvider(); ServersProvider serversProvider = ServersProvider();
StatusProvider statusProvider = StatusProvider(); StatusProvider statusProvider = StatusProvider();
ClientsProvider clientsProvider = ClientsProvider(); ClientsProvider clientsProvider = ClientsProvider();
FiltersProvider filtersProvider = FiltersProvider(); FilteringProvider filtersProvider = FilteringProvider();
LogsProvider logsProvider = LogsProvider(); LogsProvider logsProvider = LogsProvider();
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
@ -112,25 +112,9 @@ void main() async {
ChangeNotifierProvider( ChangeNotifierProvider(
create: ((context) => appConfigProvider) create: ((context) => appConfigProvider)
), ),
ChangeNotifierProxyProvider<StatusProvider, ServersProvider>( ChangeNotifierProxyProvider<StatusProvider, FilteringProvider>(
create: (context) => serversProvider,
update: (context, status, servers) => servers!..update(status),
),
ChangeNotifierProxyProvider<ServersProvider, StatusProvider>(
create: (context) => statusProvider,
update: (context, servers, status) => status!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, ClientsProvider>(
create: (context) => clientsProvider,
update: (context, servers, clients) => clients!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, LogsProvider>(
create: (context) => logsProvider,
update: (context, servers, logs) => logs!..update(servers),
),
ChangeNotifierProxyProvider<ServersProvider, FiltersProvider>(
create: (context) => filtersProvider, create: (context) => filtersProvider,
update: (context, servers, filters) => filters!..update(servers), update: (context, status, filtering) => filtering!..updateStatus(status),
), ),
], ],
child: const Main(), child: const Main(),

View file

@ -11,12 +11,10 @@ class BlockedServicesFromApi {
} }
class BlockedServices { class BlockedServices {
int loadStatus = 0; List<BlockedService> services;
List<BlockedService>? services;
BlockedServices({ BlockedServices({
this.loadStatus = 0, required this.services
this.services
}); });
} }

View file

@ -1,22 +1,4 @@
import 'dart:convert';
import 'package:adguard_home_manager/constants/enums.dart';
FilteringData filteringFromJson(String str) => FilteringData.fromJson(json.decode(str));
String filteringToJson(FilteringData data) => json.encode(data.toJson());
class Filtering { class Filtering {
LoadStatus loadStatus = LoadStatus.loading;
FilteringData? data;
Filtering({
required this.loadStatus,
this.data
});
}
class FilteringData {
final List<Filter> filters; final List<Filter> filters;
final List<Filter> whitelistFilters; final List<Filter> whitelistFilters;
List<String> userRules; List<String> userRules;
@ -24,7 +6,7 @@ class FilteringData {
int interval; int interval;
bool enabled; bool enabled;
FilteringData({ Filtering({
required this.filters, required this.filters,
required this.whitelistFilters, required this.whitelistFilters,
required this.userRules, required this.userRules,
@ -33,7 +15,7 @@ class FilteringData {
required this.enabled, required this.enabled,
}); });
factory FilteringData.fromJson(Map<String, dynamic> json) => FilteringData( factory Filtering.fromJson(Map<String, dynamic> json) => Filtering(
filters: json["filters"] != null ? List<Filter>.from(json["filters"].map((x) => Filter.fromJson(x))) : [], filters: json["filters"] != null ? List<Filter>.from(json["filters"].map((x) => Filter.fromJson(x))) : [],
whitelistFilters: json["whitelist_filters"] != null ? List<Filter>.from(json["whitelist_filters"].map((x) => Filter.fromJson(x))) : [], whitelistFilters: json["whitelist_filters"] != null ? List<Filter>.from(json["whitelist_filters"].map((x) => Filter.fromJson(x))) : [],
userRules: json["user_rules"] != null ? List<String>.from(json["user_rules"].map((x) => x)).where((i) => i != '').toList() : [], userRules: json["user_rules"] != null ? List<String>.from(json["user_rules"].map((x) => x)).where((i) => i != '').toList() : [],

View file

@ -2,18 +2,9 @@ import 'package:flutter/material.dart';
import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/models/clients_allowed_blocked.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/constants/enums.dart';
class ClientsProvider with ChangeNotifier { class ClientsProvider with ChangeNotifier {
ServersProvider? _serversProvider;
update(ServersProvider? serversProvider) {
if (serversProvider != null) {
_serversProvider = serversProvider;
}
}
LoadStatus _loadStatus = LoadStatus.loading; LoadStatus _loadStatus = LoadStatus.loading;
Clients? _clients; Clients? _clients;
String? _searchTermClients; String? _searchTermClients;

View file

@ -1,13 +1,81 @@
import 'package:flutter/material.dart'; 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/blocked_services.dart';
import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/providers/status_provider.dart';
class FiltersProvider with ChangeNotifier { class FilteringProvider with ChangeNotifier {
ServersProvider? _serversProvider; StatusProvider? _statusProvider;
update(ServersProvider? serversProvider) { updateStatus(StatusProvider? statusProvider) {
if (serversProvider != null) { if (statusProvider != null) {
_serversProvider = serversProvider; _statusProvider = statusProvider;
}
}
LoadStatus _loadStatus = LoadStatus.loading;
Filtering? _filtering;
LoadStatus _blockedServicesLoadStatus = LoadStatus.loading;
BlockedServices? _blockedServicesList;
LoadStatus get loadStatus {
return _loadStatus;
}
Filtering? get filtering {
return _filtering;
}
LoadStatus get blockedServicesLoadStatus {
return _blockedServicesLoadStatus;
}
BlockedServices? get blockedServices {
return _blockedServicesList;
}
void setFilteringData(Filtering data) {
_filtering = data;
notifyListeners();
}
void setFilteringLoadStatus(LoadStatus loadStatus, bool notify) {
_loadStatus = loadStatus;
if (notify == true) {
notifyListeners();
}
}
void setFilteringProtectionStatus(bool status) {
_statusProvider!.setFilteringEnabledStatus(status);
_filtering!.enabled = status;
notifyListeners();
}
void setFiltersUpdateFrequency(int frequency) {
if (_filtering != null) {
_filtering!.interval = frequency;
notifyListeners();
}
}
void setBlockedServices(List<String> blockedServices) {
if (_filtering != null) {
_filtering!.blockedServices = blockedServices;
notifyListeners();
}
}
void setBlockedServiceListData(List<BlockedService> data) {
_blockedServicesList = BlockedServices(services: data);
notifyListeners();
}
void setBlockedServicesListLoadStatus(LoadStatus status, bool notify) {
_blockedServicesLoadStatus = status;
if (notify == true) {
notifyListeners();
} }
} }
} }

View file

@ -3,17 +3,8 @@ import 'package:flutter/material.dart';
import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/models/applied_filters.dart';
import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/models/logs.dart'; import 'package:adguard_home_manager/models/logs.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
class LogsProvider with ChangeNotifier { class LogsProvider with ChangeNotifier {
ServersProvider? _serversProvider;
update(ServersProvider? serversProvider) {
if (serversProvider != null) {
_serversProvider = serversProvider;
}
}
int _loadStatus = 0; int _loadStatus = 0;
LogsData? _logsData; LogsData? _logsData;
List<AutoClient>? _clients; List<AutoClient>? _clients;

View file

@ -1,11 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart'; import 'package:sqflite/sqflite.dart';
import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/models/dhcp.dart'; import 'package:adguard_home_manager/models/dhcp.dart';
import 'package:adguard_home_manager/models/dns_info.dart'; import 'package:adguard_home_manager/models/dns_info.dart';
import 'package:adguard_home_manager/models/rewrite_rules.dart'; import 'package:adguard_home_manager/models/rewrite_rules.dart';
import 'package:adguard_home_manager/models/blocked_services.dart';
import 'package:adguard_home_manager/models/server.dart'; import 'package:adguard_home_manager/models/server.dart';
import 'package:adguard_home_manager/models/update_available.dart'; import 'package:adguard_home_manager/models/update_available.dart';
import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/services/http_requests.dart';
@ -13,27 +11,13 @@ import 'package:adguard_home_manager/functions/conversions.dart';
import 'package:adguard_home_manager/services/db/queries.dart'; import 'package:adguard_home_manager/services/db/queries.dart';
import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/status_provider.dart';
class ServersProvider with ChangeNotifier { class ServersProvider with ChangeNotifier {
StatusProvider? _statusProvider;
update(StatusProvider? statusProvider) {
if (statusProvider != null) {
_statusProvider = statusProvider;
}
}
Database? _dbInstance; Database? _dbInstance;
List<Server> _serversList = []; List<Server> _serversList = [];
Server? _selectedServer; Server? _selectedServer;
final Filtering _filtering = Filtering(
loadStatus: LoadStatus.loading,
data: null
);
final DhcpModel _dhcp = DhcpModel( final DhcpModel _dhcp = DhcpModel(
loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error loadStatus: 0, // 0 = loading, 1 = loaded, 2 = error
data: null data: null
@ -49,11 +33,6 @@ class ServersProvider with ChangeNotifier {
data: null data: null
); );
final BlockedServices _blockedServicesList = BlockedServices(
loadStatus: 0,
services: null
);
final UpdateAvailable _updateAvailable = UpdateAvailable( final UpdateAvailable _updateAvailable = UpdateAvailable(
loadStatus: LoadStatus.loading, loadStatus: LoadStatus.loading,
data: null, data: null,
@ -67,10 +46,6 @@ class ServersProvider with ChangeNotifier {
return _selectedServer; return _selectedServer;
} }
Filtering get filtering {
return _filtering;
}
DhcpModel get dhcp { DhcpModel get dhcp {
return _dhcp; return _dhcp;
} }
@ -83,10 +58,6 @@ class ServersProvider with ChangeNotifier {
return _dnsInfo; return _dnsInfo;
} }
BlockedServices get blockedServicesList {
return _blockedServicesList;
}
UpdateAvailable get updateAvailable { UpdateAvailable get updateAvailable {
return _updateAvailable; return _updateAvailable;
} }
@ -105,34 +76,6 @@ class ServersProvider with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void setFilteringData(FilteringData data) {
_filtering.data = data;
notifyListeners();
}
void setFilteringLoadStatus(LoadStatus loadStatus, bool notify) {
_filtering.loadStatus = loadStatus;
if (notify == true) {
notifyListeners();
}
}
void setFilteringProtectionStatus(bool status) {
_statusProvider!.setFilteringEnabledStatus(status);
_filtering.data!.enabled = status;
notifyListeners();
}
void setFiltersUpdateFrequency(int frequency) {
_filtering.data!.interval = frequency;
notifyListeners();
}
void setBlockedServices(List<String> blockedServices) {
_filtering.data!.blockedServices = blockedServices;
notifyListeners();
}
void setDhcpData(DhcpData data) { void setDhcpData(DhcpData data) {
_dhcp.data = data; _dhcp.data = data;
notifyListeners(); notifyListeners();
@ -169,18 +112,6 @@ class ServersProvider with ChangeNotifier {
} }
} }
void setBlockedServiceListData(List<BlockedService> data) {
_blockedServicesList.services = data;
notifyListeners();
}
void setBlockedServicesListLoadStatus(int status, bool notify) {
_blockedServicesList.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
void setUpdateAvailableLoadStatus(LoadStatus status, bool notify) { void setUpdateAvailableLoadStatus(LoadStatus status, bool notify) {
_updateAvailable.loadStatus = status; _updateAvailable.loadStatus = status;
if (notify == true) { if (notify == true) {

View file

@ -1,8 +1,7 @@
import 'package:adguard_home_manager/models/filtering_status.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:adguard_home_manager/models/server_status.dart'; import 'package:adguard_home_manager/models/server_status.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/models/filtering_status.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/functions/compare_versions.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/functions/time_server_disabled.dart';
@ -10,20 +9,9 @@ import 'package:adguard_home_manager/models/server.dart';
import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/services/http_requests.dart';
class StatusProvider with ChangeNotifier { class StatusProvider with ChangeNotifier {
ServersProvider? _serversProvider;
update(ServersProvider? serversProvider) {
if (serversProvider != null) {
_serversProvider = serversProvider;
}
}
LoadStatus _loadStatus = LoadStatus.loading; LoadStatus _loadStatus = LoadStatus.loading;
ServerStatus? _serverStatus; // serverStatus != null means server is connected ServerStatus? _serverStatus; // serverStatus != null means server is connected
List<String> _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled List<String> _protectionsManagementProcess = []; // protections that are currenty being enabled or disabled
FilteringStatus? _filteringStatus; FilteringStatus? _filteringStatus;
LoadStatus get loadStatus { LoadStatus get loadStatus {

View file

@ -3,10 +3,12 @@ import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.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/providers/app_config_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/providers/servers_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/services/http_requests.dart';
class ServicesModal extends StatelessWidget { class ServicesModal extends StatefulWidget {
final List<String> blockedServices; final List<String> blockedServices;
final void Function(List<String>) onConfirm; final void Function(List<String>) onConfirm;
@ -17,55 +19,33 @@ class ServicesModal extends StatelessWidget {
}) : super(key: key); }) : super(key: key);
@override @override
Widget build(BuildContext context) { State<ServicesModal> createState() => _ServicesModalStateWidget();
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return ServicesModalWidget(
blockedServices: blockedServices,
onConfirm: onConfirm,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
);
}
} }
class ServicesModalWidget extends StatefulWidget { class _ServicesModalStateWidget extends State<ServicesModal> {
final ServersProvider serversProvider;
final AppConfigProvider appConfigProvider;
final List<String> blockedServices;
final void Function(List<String>) onConfirm;
const ServicesModalWidget({
Key? key,
required this.blockedServices,
required this.onConfirm,
required this.serversProvider,
required this.appConfigProvider
}) : super(key: key);
@override
State<ServicesModalWidget> createState() => _ServicesModalStateWidget();
}
class _ServicesModalStateWidget extends State<ServicesModalWidget> {
List<String> blockedServices = []; List<String> blockedServices = [];
Future loadBlockedServices() async { Future loadBlockedServices() async {
final result = await getBlockedServices(server: widget.serversProvider.selectedServer!); 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') { if (result['result'] == 'success') {
widget.serversProvider.setBlockedServicesListLoadStatus(1, true); filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.loaded, true);
widget.serversProvider.setBlockedServiceListData(result['data']); filteringProvider.setBlockedServiceListData(result['data']);
} }
else { else {
widget.serversProvider.setBlockedServicesListLoadStatus(2, true); filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.error, true);
widget.appConfigProvider.addLog(result['log']); appConfigProvider.addLog(result['log']);
} }
} }
@override @override
void initState() { void initState() {
if (widget.serversProvider.blockedServicesList.loadStatus != 1) { final filteringProvider = Provider.of<FilteringProvider>(context, listen: false);
if (filteringProvider.blockedServicesLoadStatus != LoadStatus.loaded) {
loadBlockedServices(); loadBlockedServices();
} }
@ -89,10 +69,11 @@ class _ServicesModalStateWidget extends State<ServicesModalWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
Widget content() { Widget content() {
switch (serversProvider.blockedServicesList.loadStatus) { switch (filteringProvider.blockedServicesLoadStatus) {
case 0: case LoadStatus.loading:
return Padding( return Padding(
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
child: SizedBox( child: SizedBox(
@ -116,34 +97,34 @@ class _ServicesModalStateWidget extends State<ServicesModalWidget> {
), ),
); );
case 1: case LoadStatus.loaded:
return SizedBox( return SizedBox(
width: double.minPositive, width: double.minPositive,
height: MediaQuery.of(context).size.height*0.5, height: MediaQuery.of(context).size.height*0.5,
child: ListView.builder( child: ListView.builder(
shrinkWrap: true, shrinkWrap: true,
itemCount: serversProvider.blockedServicesList.services!.length, itemCount: filteringProvider.blockedServices!.services.length,
itemBuilder: (context, index) => CheckboxListTile( itemBuilder: (context, index) => CheckboxListTile(
title: Padding( title: Padding(
padding: const EdgeInsets.only(left: 10), padding: const EdgeInsets.only(left: 10),
child: Text( child: Text(
serversProvider.blockedServicesList.services![index].name, filteringProvider.blockedServices!.services[index].name,
style: TextStyle( style: TextStyle(
fontWeight: FontWeight.normal, fontWeight: FontWeight.normal,
color: Theme.of(context).colorScheme.onSurface color: Theme.of(context).colorScheme.onSurface
), ),
), ),
), ),
value: blockedServices.contains(serversProvider.blockedServicesList.services![index].id), value: blockedServices.contains(filteringProvider.blockedServices!.services[index].id),
checkboxShape: RoundedRectangleBorder( checkboxShape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5) borderRadius: BorderRadius.circular(5)
), ),
onChanged: (value) => checkUncheckService(value!, serversProvider.blockedServicesList.services![index].id) onChanged: (value) => checkUncheckService(value!, filteringProvider.blockedServices!.services[index].id)
) )
), ),
); );
case 2: case LoadStatus.error:
return Padding( return Padding(
padding: const EdgeInsets.all(24), padding: const EdgeInsets.all(24),
child: SizedBox( child: SizedBox(

View file

@ -9,12 +9,13 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/filters/add_custom_rule.dart'; import 'package:adguard_home_manager/screens/filters/add_custom_rule.dart';
import 'package:adguard_home_manager/screens/filters/add_list_modal.dart'; import 'package:adguard_home_manager/screens/filters/add_list_modal.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
class AddFiltersButton extends StatelessWidget { class AddFiltersButton extends StatelessWidget {
@ -30,6 +31,7 @@ class AddFiltersButton extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width; final width = MediaQuery.of(context).size.width;
@ -38,7 +40,7 @@ class AddFiltersButton extends StatelessWidget {
ProcessModal processModal = ProcessModal(context: context); ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.addingRule); processModal.open(AppLocalizations.of(context)!.addingRule);
final List<String> newRules = serversProvider.filtering.data!.userRules; final List<String> newRules = filteringProvider.filtering!.userRules;
newRules.add(rule); newRules.add(rule);
final result = await setCustomRules(server: serversProvider.selectedServer!, rules: newRules); final result = await setCustomRules(server: serversProvider.selectedServer!, rules: newRules);
@ -46,9 +48,9 @@ class AddFiltersButton extends StatelessWidget {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
FilteringData filteringData = serversProvider.filtering.data!; Filtering filteringData = filteringProvider.filtering!;
filteringData.userRules = newRules; filteringData.userRules = newRules;
serversProvider.setFilteringData(filteringData); filteringProvider.setFilteringData(filteringData);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -107,12 +109,12 @@ class AddFiltersButton extends StatelessWidget {
final items = result1['data'].toString().split(' ')[1]; final items = result1['data'].toString().split(' ')[1];
if (result2['result'] == 'success') { if (result2['result'] == 'success') {
serversProvider.setFilteringData(result2['data']); filteringProvider.setFilteringData(result2['data']);
serversProvider.setFilteringLoadStatus(LoadStatus.loaded, true); filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true);
} }
else { else {
appConfigProvider.addLog(result2['log']); appConfigProvider.addLog(result2['log']);
serversProvider.setFilteringLoadStatus(LoadStatus.error, true); filteringProvider.setFilteringLoadStatus(LoadStatus.error, true);
} }
processModal.close(); processModal.close();

View file

@ -7,11 +7,13 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/models/blocked_services.dart'; import 'package:adguard_home_manager/models/blocked_services.dart';
import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/services/http_requests.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/app_config_provider.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
class BlockedServicesScreen extends StatelessWidget { class BlockedServicesScreen extends StatefulWidget {
final bool dialog; final bool dialog;
const BlockedServicesScreen({ const BlockedServicesScreen({
@ -20,56 +22,37 @@ class BlockedServicesScreen extends StatelessWidget {
}) : super(key: key); }) : super(key: key);
@override @override
Widget build(BuildContext context) { State<BlockedServicesScreen> createState() => _BlockedServicesScreenStateWidget();
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return BlockedServicesScreenWidget(
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
dialog: dialog,
);
}
} }
class BlockedServicesScreenWidget extends StatefulWidget { class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreen> {
final ServersProvider serversProvider;
final AppConfigProvider appConfigProvider;
final bool dialog;
const BlockedServicesScreenWidget({
Key? key,
required this.serversProvider,
required this.appConfigProvider,
required this.dialog
}) : super(key: key);
@override
State<BlockedServicesScreenWidget> createState() => _BlockedServicesScreenStateWidget();
}
class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidget> {
List<String> values = []; List<String> values = [];
Future loadBlockedServices() async { Future loadBlockedServices() async {
final result = await getBlockedServices(server: widget.serversProvider.selectedServer!); 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') { if (result['result'] == 'success') {
widget.serversProvider.setBlockedServicesListLoadStatus(1, true); filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.loaded, true);
widget.serversProvider.setBlockedServiceListData(result['data']); filteringProvider.setBlockedServiceListData(result['data']);
} }
else { else {
widget.serversProvider.setBlockedServicesListLoadStatus(2, true); filteringProvider.setBlockedServicesListLoadStatus(LoadStatus.loaded, true);
widget.appConfigProvider.addLog(result['log']); appConfigProvider.addLog(result['log']);
} }
} }
@override @override
void initState() { void initState() {
if (widget.serversProvider.blockedServicesList.loadStatus != 1) { final filteringProvider = Provider.of<FilteringProvider>(context, listen: false);
if (filteringProvider.blockedServicesLoadStatus != LoadStatus.loaded) {
loadBlockedServices(); loadBlockedServices();
} }
values = widget.serversProvider.filtering.data!.blockedServices; values = filteringProvider.filtering!.blockedServices;
super.initState(); super.initState();
} }
@ -77,6 +60,7 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidge
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
void updateValues(bool value, BlockedService item) { void updateValues(bool value, BlockedService item) {
@ -101,7 +85,7 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidge
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
serversProvider.setBlockedServices(values); filteringProvider.setBlockedServices(values);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -119,8 +103,8 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidge
} }
Widget body() { Widget body() {
switch (serversProvider.blockedServicesList.loadStatus) { switch (filteringProvider.blockedServicesLoadStatus) {
case 0: case LoadStatus.loading:
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
width: double.maxFinite, width: double.maxFinite,
@ -142,15 +126,15 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidge
), ),
); );
case 1: case LoadStatus.loaded:
return ListView.builder( return ListView.builder(
itemCount: serversProvider.blockedServicesList.services!.length, itemCount: filteringProvider.blockedServices!.services!.length,
itemBuilder: (context, index) => Material( itemBuilder: (context, index) => Material(
color: Colors.transparent, color: Colors.transparent,
child: InkWell( child: InkWell(
onTap: () => updateValues( onTap: () => updateValues(
values.contains(serversProvider.blockedServicesList.services![index].id), values.contains(filteringProvider.blockedServices!.services![index].id),
serversProvider.blockedServicesList.services![index] filteringProvider.blockedServices!.services![index]
), ),
child: Padding( child: Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(
@ -163,17 +147,17 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidge
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
Text( Text(
serversProvider.blockedServicesList.services![index].name, filteringProvider.blockedServices!.services![index].name,
style: TextStyle( style: TextStyle(
fontSize: 16, fontSize: 16,
color: Theme.of(context).colorScheme.onSurface color: Theme.of(context).colorScheme.onSurface
), ),
), ),
Checkbox( Checkbox(
value: values.contains(serversProvider.blockedServicesList.services![index].id), value: values.contains(filteringProvider.blockedServices!.services![index].id),
onChanged: (value) => updateValues( onChanged: (value) => updateValues(
value!, value!,
serversProvider.blockedServicesList.services![index] filteringProvider.blockedServices!.services![index]
), ),
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(5) borderRadius: BorderRadius.circular(5)
@ -186,7 +170,7 @@ class _BlockedServicesScreenStateWidget extends State<BlockedServicesScreenWidge
) )
); );
case 2: case LoadStatus.error:
return Container( return Container(
padding: const EdgeInsets.symmetric(horizontal: 16), padding: const EdgeInsets.symmetric(horizontal: 16),
width: double.maxFinite, width: double.maxFinite,

View file

@ -17,6 +17,7 @@ import 'package:adguard_home_manager/screens/filters/update_interval_lists_modal
import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/status_provider.dart';
import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/providers/app_config_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/models/filtering.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
@ -24,49 +25,31 @@ import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
class Filters extends StatelessWidget { class Filters extends StatefulWidget {
const Filters({Key? key}) : super(key: key); const Filters({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { State<Filters> createState() => _FiltersState();
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return FiltersWidget(
serversProvider: serversProvider,
appConfigProvider: appConfigProvider
);
}
} }
class FiltersWidget extends StatefulWidget { class _FiltersState extends State<Filters> {
final ServersProvider serversProvider;
final AppConfigProvider appConfigProvider;
const FiltersWidget({
Key? key,
required this.serversProvider,
required this.appConfigProvider
}) : super(key: key);
@override
State<FiltersWidget> createState() => _FiltersWidgetState();
}
class _FiltersWidgetState extends State<FiltersWidget> {
Future fetchFilters() async { Future fetchFilters() async {
widget.serversProvider.setFilteringLoadStatus(LoadStatus.loading, false); 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 getFiltering(server: widget.serversProvider.selectedServer!); filteringProvider.setFilteringLoadStatus(LoadStatus.loading, false);
final result = await getFiltering(server: serversProvider.selectedServer!);
if (mounted) { if (mounted) {
if (result['result'] == 'success') { if (result['result'] == 'success') {
widget.serversProvider.setFilteringData(result['data']); filteringProvider.setFilteringData(result['data']);
widget.serversProvider.setFilteringLoadStatus(LoadStatus.loaded, false); filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, false);
} }
else { else {
widget.appConfigProvider.addLog(result['log']); appConfigProvider.addLog(result['log']);
widget.serversProvider.setFilteringLoadStatus(LoadStatus.error, false); filteringProvider.setFilteringLoadStatus(LoadStatus.error, false);
} }
} }
} }
@ -84,6 +67,7 @@ class _FiltersWidgetState extends State<FiltersWidget> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context); final statusProvider = Provider.of<StatusProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
@ -96,13 +80,13 @@ class _FiltersWidgetState extends State<FiltersWidget> {
final result = await updateLists(server: serversProvider.selectedServer!); final result = await updateLists(server: serversProvider.selectedServer!);
if (result['result'] == 'success') { if (result['result'] == 'success') {
final result2 = await getFiltering(server: widget.serversProvider.selectedServer!); final result2 = await getFiltering(server: serversProvider.selectedServer!);
processModal.close(); processModal.close();
if (mounted) { if (mounted) {
if (result2['result'] == 'success') { if (result2['result'] == 'success') {
widget.serversProvider.setFilteringData(result2['data']); filteringProvider.setFilteringData(result2['data']);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -111,7 +95,7 @@ class _FiltersWidgetState extends State<FiltersWidget> {
); );
} }
else { else {
widget.appConfigProvider.addLog(result2['log']); appConfigProvider.addLog(result2['log']);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -173,7 +157,7 @@ class _FiltersWidgetState extends State<FiltersWidget> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
serversProvider.setFilteringProtectionStatus(!statusProvider.serverStatus!.filteringEnabled); filteringProvider.setFilteringProtectionStatus(!statusProvider.serverStatus!.filteringEnabled);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -195,14 +179,14 @@ class _FiltersWidgetState extends State<FiltersWidget> {
processModal.open(AppLocalizations.of(context)!.changingUpdateFrequency); processModal.open(AppLocalizations.of(context)!.changingUpdateFrequency);
final result = await requestChangeUpdateFrequency(server: serversProvider.selectedServer!, data: { final result = await requestChangeUpdateFrequency(server: serversProvider.selectedServer!, data: {
"enabled": serversProvider.filtering.data!.enabled, "enabled": filteringProvider.filtering!.enabled,
"interval": value "interval": value
}); });
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
serversProvider.setFiltersUpdateFrequency(value); filteringProvider.setFiltersUpdateFrequency(value);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -246,16 +230,16 @@ class _FiltersWidgetState extends State<FiltersWidget> {
ProcessModal processModal = ProcessModal(context: context); ProcessModal processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.deletingRule); processModal.open(AppLocalizations.of(context)!.deletingRule);
final List<String> newRules = serversProvider.filtering.data!.userRules.where((r) => r != rule).toList(); final List<String> newRules = filteringProvider.filtering!.userRules.where((r) => r != rule).toList();
final result = await setCustomRules(server: serversProvider.selectedServer!, rules: newRules); final result = await setCustomRules(server: serversProvider.selectedServer!, rules: newRules);
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
FilteringData filteringData = serversProvider.filtering.data!; Filtering filteringData = filteringProvider.filtering!;
filteringData.userRules = newRules; filteringData.userRules = newRules;
serversProvider.setFilteringData(filteringData); filteringProvider.setFilteringData(filteringData);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -309,11 +293,11 @@ class _FiltersWidgetState extends State<FiltersWidget> {
} }
List<Widget> actions() { List<Widget> actions() {
if (serversProvider.filtering.loadStatus == LoadStatus.loaded) { if (filteringProvider.loadStatus == LoadStatus.loaded) {
return [ return [
IconButton( IconButton(
onPressed: enableDisableFiltering, onPressed: enableDisableFiltering,
tooltip: serversProvider.filtering.data!.enabled == true tooltip: filteringProvider.filtering!.enabled == true
? AppLocalizations.of(context)!.disableFiltering ? AppLocalizations.of(context)!.disableFiltering
: AppLocalizations.of(context)!.enableFiltering, : AppLocalizations.of(context)!.enableFiltering,
icon: Stack( icon: Stack(
@ -330,11 +314,11 @@ class _FiltersWidgetState extends State<FiltersWidget> {
color: Colors.white color: Colors.white
), ),
child: Icon( child: Icon(
serversProvider.filtering.data!.enabled == true filteringProvider.filtering!.enabled == true
? Icons.check_circle_rounded ? Icons.check_circle_rounded
: Icons.cancel, : Icons.cancel,
size: 12, size: 12,
color: serversProvider.filtering.data!.enabled == true color: filteringProvider.filtering!.enabled == true
? appConfigProvider.useThemeColorForStatus == true ? appConfigProvider.useThemeColorForStatus == true
? Theme.of(context).colorScheme.primary ? Theme.of(context).colorScheme.primary
: Colors.green : Colors.green
@ -355,7 +339,7 @@ class _FiltersWidgetState extends State<FiltersWidget> {
showDialog( showDialog(
context: context, context: context,
builder: (context) => UpdateIntervalListsModal( builder: (context) => UpdateIntervalListsModal(
interval: serversProvider.filtering.data!.interval, interval: filteringProvider.filtering!.interval,
onChange: setUpdateFrequency, onChange: setUpdateFrequency,
dialog: true, dialog: true,
), ),
@ -365,7 +349,7 @@ class _FiltersWidgetState extends State<FiltersWidget> {
showModalBottomSheet( showModalBottomSheet(
context: context, context: context,
builder: (context) => UpdateIntervalListsModal( builder: (context) => UpdateIntervalListsModal(
interval: serversProvider.filtering.data!.interval, interval: filteringProvider.filtering!.interval,
onChange: setUpdateFrequency, onChange: setUpdateFrequency,
dialog: false, dialog: false,
), ),

View file

@ -5,6 +5,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/filters/custom_rules_list.dart'; import 'package:adguard_home_manager/screens/filters/custom_rules_list.dart';
import 'package:adguard_home_manager/screens/filters/filters_list.dart'; import 'package:adguard_home_manager/screens/filters/filters_list.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/models/filtering.dart'; import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart';
@ -49,6 +50,7 @@ class _FiltersTabsViewState extends State<FiltersTabsView> with TickerProviderSt
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
return DefaultTabController( return DefaultTabController(
length: 3, length: 3,
@ -110,28 +112,28 @@ class _FiltersTabsViewState extends State<FiltersTabsView> with TickerProviderSt
controller: tabController, controller: tabController,
children: [ children: [
FiltersList( FiltersList(
loadStatus: serversProvider.filtering.loadStatus, loadStatus: filteringProvider.loadStatus,
scrollController: scrollController, scrollController: scrollController,
type: 'whitelist', type: 'whitelist',
data: serversProvider.filtering.loadStatus == LoadStatus.loaded data: filteringProvider.loadStatus == LoadStatus.loaded
? serversProvider.filtering.data!.whitelistFilters : [], ? filteringProvider.filtering!.whitelistFilters : [],
fetchData: widget.fetchFilters, fetchData: widget.fetchFilters,
onOpenDetailsScreen: widget.onOpenDetailsModal, onOpenDetailsScreen: widget.onOpenDetailsModal,
), ),
FiltersList( FiltersList(
loadStatus: serversProvider.filtering.loadStatus, loadStatus: filteringProvider.loadStatus,
scrollController: scrollController, scrollController: scrollController,
type: 'blacklist', type: 'blacklist',
data: serversProvider.filtering.loadStatus == LoadStatus.loaded data: filteringProvider.loadStatus == LoadStatus.loaded
? serversProvider.filtering.data!.filters : [], ? filteringProvider.filtering!.filters : [],
fetchData: widget.fetchFilters, fetchData: widget.fetchFilters,
onOpenDetailsScreen: widget.onOpenDetailsModal, onOpenDetailsScreen: widget.onOpenDetailsModal,
), ),
CustomRulesList( CustomRulesList(
loadStatus: serversProvider.filtering.loadStatus, loadStatus: filteringProvider.loadStatus,
scrollController: scrollController, scrollController: scrollController,
data: serversProvider.filtering.loadStatus == LoadStatus.loaded data: filteringProvider.loadStatus == LoadStatus.loaded
? serversProvider.filtering.data!.userRules : [], ? filteringProvider.filtering!.userRules : [],
fetchData: widget.fetchFilters, fetchData: widget.fetchFilters,
onRemoveCustomRule: widget.onRemoveCustomRule, onRemoveCustomRule: widget.onRemoveCustomRule,
), ),

View file

@ -15,6 +15,7 @@ import 'package:adguard_home_manager/widgets/options_modal.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/models/menu_option.dart'; import 'package:adguard_home_manager/models/menu_option.dart';
import 'package:adguard_home_manager/functions/copy_clipboard.dart'; import 'package:adguard_home_manager/functions/copy_clipboard.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/models/filtering.dart'; import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/functions/number_format.dart'; import 'package:adguard_home_manager/functions/number_format.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart';
@ -37,6 +38,7 @@ class FiltersTripleColumn extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
bool checkIfComment(String value) { bool checkIfComment(String value) {
@ -84,7 +86,7 @@ class FiltersTripleColumn extends StatelessWidget {
} }
Widget content() { Widget content() {
switch (serversProvider.filtering.loadStatus) { switch (filteringProvider.loadStatus) {
case LoadStatus.loading: case LoadStatus.loading:
return Row( return Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
@ -140,18 +142,18 @@ class FiltersTripleColumn extends StatelessWidget {
), ),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: serversProvider.filtering.data!.whitelistFilters.length, itemCount: filteringProvider.filtering!.whitelistFilters.length,
itemBuilder: (context, index) => ListOptionsMenu( itemBuilder: (context, index) => ListOptionsMenu(
list: serversProvider.filtering.data!.whitelistFilters[index], list: filteringProvider.filtering!.whitelistFilters[index],
listType: 'whitelist', listType: 'whitelist',
child: CustomListTile( child: CustomListTile(
title: serversProvider.filtering.data!.whitelistFilters[index].name, title: filteringProvider.filtering!.whitelistFilters[index].name,
subtitle: "${intFormat(serversProvider.filtering.data!.whitelistFilters[index].rulesCount, Platform.localeName)} ${AppLocalizations.of(context)!.enabledRules}", subtitle: "${intFormat(filteringProvider.filtering!.whitelistFilters[index].rulesCount, Platform.localeName)} ${AppLocalizations.of(context)!.enabledRules}",
trailing: Icon( trailing: Icon(
serversProvider.filtering.data!.whitelistFilters[index].enabled == true filteringProvider.filtering!.whitelistFilters[index].enabled == true
? Icons.check_circle_rounded ? Icons.check_circle_rounded
: Icons.cancel, : Icons.cancel,
color: serversProvider.filtering.data!.whitelistFilters[index].enabled == true color: filteringProvider.filtering!.whitelistFilters[index].enabled == true
? appConfigProvider.useThemeColorForStatus == true ? appConfigProvider.useThemeColorForStatus == true
? Theme.of(context).colorScheme.primary ? Theme.of(context).colorScheme.primary
: Colors.green : Colors.green
@ -159,7 +161,7 @@ class FiltersTripleColumn extends StatelessWidget {
? Colors.grey ? Colors.grey
: Colors.red : Colors.red
), ),
onTap: () => onOpenDetailsModal(serversProvider.filtering.data!.whitelistFilters[index], 'whitelist'), onTap: () => onOpenDetailsModal(filteringProvider.filtering!.whitelistFilters[index], 'whitelist'),
), ),
), ),
), ),
@ -196,18 +198,18 @@ class FiltersTripleColumn extends StatelessWidget {
), ),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: serversProvider.filtering.data!.filters.length, itemCount: filteringProvider.filtering!.filters.length,
itemBuilder: (context, index) => ListOptionsMenu( itemBuilder: (context, index) => ListOptionsMenu(
list: serversProvider.filtering.data!.filters[index], list: filteringProvider.filtering!.filters[index],
listType: 'blacklist', listType: 'blacklist',
child: CustomListTile( child: CustomListTile(
title: serversProvider.filtering.data!.filters[index].name, title: filteringProvider.filtering!.filters[index].name,
subtitle: "${intFormat(serversProvider.filtering.data!.filters[index].rulesCount, Platform.localeName)} ${AppLocalizations.of(context)!.enabledRules}", subtitle: "${intFormat(filteringProvider.filtering!.filters[index].rulesCount, Platform.localeName)} ${AppLocalizations.of(context)!.enabledRules}",
trailing: Icon( trailing: Icon(
serversProvider.filtering.data!.filters[index].enabled == true filteringProvider.filtering!.filters[index].enabled == true
? Icons.check_circle_rounded ? Icons.check_circle_rounded
: Icons.cancel, : Icons.cancel,
color: serversProvider.filtering.data!.filters[index].enabled == true color: filteringProvider.filtering!.filters[index].enabled == true
? appConfigProvider.useThemeColorForStatus == true ? appConfigProvider.useThemeColorForStatus == true
? Theme.of(context).colorScheme.primary ? Theme.of(context).colorScheme.primary
: Colors.green : Colors.green
@ -215,7 +217,7 @@ class FiltersTripleColumn extends StatelessWidget {
? Colors.grey ? Colors.grey
: Colors.red : Colors.red
), ),
onTap: () => onOpenDetailsModal(serversProvider.filtering.data!.filters[index], 'blacklist'), onTap: () => onOpenDetailsModal(filteringProvider.filtering!.filters[index], 'blacklist'),
), ),
), ),
), ),
@ -252,7 +254,7 @@ class FiltersTripleColumn extends StatelessWidget {
), ),
Expanded( Expanded(
child: ListView.builder( child: ListView.builder(
itemCount: serversProvider.filtering.data!.userRules.length, itemCount: filteringProvider.filtering!.userRules.length,
itemBuilder: (context, index) => ContextMenuArea( itemBuilder: (context, index) => ContextMenuArea(
builder: (context) => [ builder: (context) => [
CustomListTile( CustomListTile(
@ -261,7 +263,7 @@ class FiltersTripleColumn extends StatelessWidget {
onTap: () { onTap: () {
copyToClipboard( copyToClipboard(
context: context, context: context,
value: serversProvider.filtering.data!.userRules[index], value: filteringProvider.filtering!.userRules[index],
successMessage: AppLocalizations.of(context)!.copiedClipboard, successMessage: AppLocalizations.of(context)!.copiedClipboard,
); );
Navigator.pop(context); Navigator.pop(context);
@ -278,17 +280,17 @@ class FiltersTripleColumn extends StatelessWidget {
icon: Icons.copy_rounded, icon: Icons.copy_rounded,
action: () => copyToClipboard( action: () => copyToClipboard(
context: context, context: context,
value: serversProvider.filtering.data!.userRules[index], value: filteringProvider.filtering!.userRules[index],
successMessage: AppLocalizations.of(context)!.copiedClipboard, successMessage: AppLocalizations.of(context)!.copiedClipboard,
) )
) )
] ]
) )
), ),
title: serversProvider.filtering.data!.userRules[index], title: filteringProvider.filtering!.userRules[index],
subtitleWidget: generateSubtitle(serversProvider.filtering.data!.userRules[index]), subtitleWidget: generateSubtitle(filteringProvider.filtering!.userRules[index]),
trailing: IconButton( trailing: IconButton(
onPressed: () => onRemoveCustomRule(serversProvider.filtering.data!.userRules[index]), onPressed: () => onRemoveCustomRule(filteringProvider.filtering!.userRules[index]),
icon: const Icon(Icons.delete) icon: const Icon(Icons.delete)
), ),
), ),

View file

@ -13,6 +13,7 @@ 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/custom_list_tile.dart';
import 'package:adguard_home_manager/functions/format_time.dart'; import 'package:adguard_home_manager/functions/format_time.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/providers/app_config_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/providers/servers_provider.dart';
@ -61,16 +62,17 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final filteringProvider = Provider.of<FilteringProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width; final width = MediaQuery.of(context).size.width;
Filter? list; Filter? list;
try { try {
list = serversProvider.filtering.data != null list = filteringProvider.filtering != null
? widget.type == 'whitelist' ? widget.type == 'whitelist'
? serversProvider.filtering.data!.whitelistFilters.firstWhere((l) => l.id == widget.listId) ? filteringProvider.filtering!.whitelistFilters.firstWhere((l) => l.id == widget.listId)
: serversProvider.filtering.data!.filters.firstWhere((l) => l.id == widget.listId) : filteringProvider.filtering!.filters.firstWhere((l) => l.id == widget.listId)
: null; : null;
} catch (e) { } catch (e) {
// ------- // // ------- //
@ -177,8 +179,6 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
onEdit: ({required Filter list, required String type}) async { onEdit: ({required Filter list, required String type}) async {
final result = await editList( final result = await editList(
context: context, context: context,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
list: list, list: list,
type: widget.type type: widget.type
); );
@ -210,8 +210,6 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
onEdit: ({required Filter list, required String type}) async { onEdit: ({required Filter list, required String type}) async {
final result = await editList( final result = await editList(
context: context, context: context,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
list: list, list: list,
type: widget.type type: widget.type
); );
@ -248,8 +246,6 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
onConfirm: () async { onConfirm: () async {
final result = await deleteList( final result = await deleteList(
context: context, context: context,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
list: list!, list: list!,
type: widget.type, type: widget.type,
); );
@ -315,8 +311,6 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
onPressed: () async { onPressed: () async {
final result = await enableDisableList( final result = await enableDisableList(
context: context, context: context,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
list: list!, list: list!,
listType: widget.type, listType: widget.type,
); );
@ -402,8 +396,6 @@ class _ListDetailsScreenState extends State<ListDetailsScreen> {
onPressed: () async { onPressed: () async {
final result = await enableDisableList( final result = await enableDisableList(
context: context, context: context,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
list: list!, list: list!,
listType: widget.type, listType: widget.type,
); );

View file

@ -1,9 +1,11 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/providers/filters_provider.dart';
import 'package:adguard_home_manager/models/filtering.dart'; import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/constants/enums.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/app_config_provider.dart';
@ -12,11 +14,13 @@ import 'package:adguard_home_manager/services/http_requests.dart';
Future<bool> enableDisableList({ Future<bool> enableDisableList({
required BuildContext context, required BuildContext context,
required ServersProvider serversProvider,
required AppConfigProvider appConfigProvider,
required Filter list, required Filter list,
required String listType, required String listType,
}) async { }) 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 processModal = ProcessModal(context: context);
processModal.open( processModal.open(
list.enabled == true list.enabled == true
@ -40,12 +44,12 @@ Future<bool> enableDisableList({
final result2 = await getFiltering(server: serversProvider.selectedServer!); final result2 = await getFiltering(server: serversProvider.selectedServer!);
if (result2['result'] == 'success') { if (result2['result'] == 'success') {
serversProvider.setFilteringData(result2['data']); filteringProvider.setFilteringData(result2['data']);
serversProvider.setFilteringLoadStatus(LoadStatus.loaded, true); filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true);
} }
else { else {
appConfigProvider.addLog(result2['log']); appConfigProvider.addLog(result2['log']);
serversProvider.setFilteringLoadStatus(LoadStatus.error, true); filteringProvider.setFilteringLoadStatus(LoadStatus.error, true);
} }
return true; return true;
@ -59,11 +63,13 @@ Future<bool> enableDisableList({
Future<bool> editList({ Future<bool> editList({
required BuildContext context, required BuildContext context,
required ServersProvider serversProvider,
required AppConfigProvider appConfigProvider,
required Filter list, required Filter list,
required String type required String type
}) async { }) 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 processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.updatingListData); processModal.open(AppLocalizations.of(context)!.updatingListData);
@ -81,12 +87,12 @@ Future<bool> editList({
final result2 = await getFiltering(server: serversProvider.selectedServer!); final result2 = await getFiltering(server: serversProvider.selectedServer!);
if (result2['result'] == 'success') { if (result2['result'] == 'success') {
serversProvider.setFilteringData(result2['data']); filteringProvider.setFilteringData(result2['data']);
serversProvider.setFilteringLoadStatus(LoadStatus.loaded, true); filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true);
} }
else { else {
appConfigProvider.addLog(result2['log']); appConfigProvider.addLog(result2['log']);
serversProvider.setFilteringLoadStatus(LoadStatus.error, true); filteringProvider.setFilteringLoadStatus(LoadStatus.error, true);
} }
processModal.close(); processModal.close();
@ -103,11 +109,13 @@ Future<bool> editList({
Future<bool> deleteList({ Future<bool> deleteList({
required BuildContext context, required BuildContext context,
required ServersProvider serversProvider,
required AppConfigProvider appConfigProvider,
required Filter list, required Filter list,
required String type required String type
}) async { }) 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 processModal = ProcessModal(context: context);
processModal.open(AppLocalizations.of(context)!.deletingList); processModal.open(AppLocalizations.of(context)!.deletingList);
@ -120,12 +128,12 @@ Future<bool> deleteList({
final result2 = await getFiltering(server: serversProvider.selectedServer!); final result2 = await getFiltering(server: serversProvider.selectedServer!);
if (result2['result'] == 'success') { if (result2['result'] == 'success') {
serversProvider.setFilteringData(result2['data']); filteringProvider.setFilteringData(result2['data']);
serversProvider.setFilteringLoadStatus(LoadStatus.loaded, true); filteringProvider.setFilteringLoadStatus(LoadStatus.loaded, true);
} }
else { else {
appConfigProvider.addLog(result2['log']); appConfigProvider.addLog(result2['log']);
serversProvider.setFilteringLoadStatus(LoadStatus.loading, true); filteringProvider.setFilteringLoadStatus(LoadStatus.loading, true);
} }
processModal.close(); processModal.close();

View file

@ -14,7 +14,6 @@ import 'package:adguard_home_manager/models/filtering.dart';
import 'package:adguard_home_manager/functions/copy_clipboard.dart'; import 'package:adguard_home_manager/functions/copy_clipboard.dart';
import 'package:adguard_home_manager/models/menu_option.dart'; import 'package:adguard_home_manager/models/menu_option.dart';
import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
class ListOptionsMenu extends StatelessWidget { class ListOptionsMenu extends StatelessWidget {
final Filter list; final Filter list;
@ -30,14 +29,11 @@ class ListOptionsMenu extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
void enableDisable() async { void enableDisable() async {
final result = await enableDisableList( final result = await enableDisableList(
context: context, context: context,
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
list: list, list: list,
listType: listType, listType: listType,
); );

View file

@ -895,7 +895,7 @@ Future getFiltering({
if (result[0]['statusCode'] == 200 && result[0]['statusCode'] == 200) { if (result[0]['statusCode'] == 200 && result[0]['statusCode'] == 200) {
return { return {
'result': 'success', 'result': 'success',
'data': FilteringData.fromJson({ 'data': Filtering.fromJson({
...jsonDecode(result[0]['body']), ...jsonDecode(result[0]['body']),
"blocked_services": result[1]['body'] != null "blocked_services": result[1]['body'] != null
? jsonDecode(result[1]['body']) ? jsonDecode(result[1]['body'])