Extracted clients to a separate provider

This commit is contained in:
Juan Gilsanz Polo 2023-05-24 14:16:53 +02:00
parent 4a2d78e8cf
commit 8a3d42b66c
12 changed files with 192 additions and 250 deletions

View file

@ -1,45 +1,28 @@
import 'dart:convert';
import 'package:adguard_home_manager/constants/enums.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/models/safe_search.dart'; import 'package:adguard_home_manager/models/safe_search.dart';
class Clients { class Clients {
LoadStatus loadStatus;
ClientsData? data;
Clients({
required this.loadStatus,
this.data
});
}
ClientsData clientsFromJson(String str) => ClientsData.fromJson(json.decode(str));
String clientsToJson(ClientsData data) => json.encode(data.toJson());
class ClientsData {
List<Client> clients; List<Client> clients;
final List<AutoClient> autoClientsData; final List<AutoClient> autoClients;
final List<String> supportedTags; final List<String> supportedTags;
ClientsAllowedBlocked? clientsAllowedBlocked; ClientsAllowedBlocked? clientsAllowedBlocked;
ClientsData({ Clients({
required this.clients, required this.clients,
required this.autoClientsData, required this.autoClients,
required this.supportedTags, required this.supportedTags,
this.clientsAllowedBlocked this.clientsAllowedBlocked
}); });
factory ClientsData.fromJson(Map<String, dynamic> json) => ClientsData( factory Clients.fromJson(Map<String, dynamic> json) => Clients(
clients: json["clients"] != null ? List<Client>.from(json["clients"].map((x) => Client.fromJson(x))) : [], clients: json["clients"] != null ? List<Client>.from(json["clients"].map((x) => Client.fromJson(x))) : [],
autoClientsData: json["auto_clients"] != null ? List<AutoClient>.from(json["auto_clients"].map((x) => AutoClient.fromJson(x))) : [], autoClients: json["auto_clients"] != null ? List<AutoClient>.from(json["auto_clients"].map((x) => AutoClient.fromJson(x))) : [],
supportedTags: json["supported_tags"] != null ? List<String>.from(json["supported_tags"].map((x) => x)) : [], supportedTags: json["supported_tags"] != null ? List<String>.from(json["supported_tags"].map((x) => x)) : [],
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
"clients": List<dynamic>.from(clients.map((x) => x.toJson())), "clients": List<dynamic>.from(clients.map((x) => x.toJson())),
"auto_clients": List<dynamic>.from(autoClientsData.map((x) => x.toJson())), "auto_clients": List<dynamic>.from(autoClients.map((x) => x.toJson())),
"supported_tags": List<dynamic>.from(supportedTags.map((x) => x)), "supported_tags": List<dynamic>.from(supportedTags.map((x) => x)),
}; };
} }

View file

@ -1,6 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:adguard_home_manager/models/clients.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/providers/servers_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart';
class ClientsProvider with ChangeNotifier { class ClientsProvider with ChangeNotifier {
ServersProvider? _serversProvider; ServersProvider? _serversProvider;
@ -10,4 +13,84 @@ class ClientsProvider with ChangeNotifier {
_serversProvider = serversProvider; _serversProvider = serversProvider;
} }
} }
LoadStatus _loadStatus = LoadStatus.loading;
Clients? _clients;
String? _searchTermClients;
List<AutoClient> _filteredActiveClients = [];
List<Client> _filteredAddedClients = [];
LoadStatus get loadStatus {
return _loadStatus;
}
Clients? get clients {
return _clients;
}
String? get searchTermClients {
return _searchTermClients;
}
List<AutoClient> get filteredActiveClients {
return _filteredActiveClients;
}
List<Client> get filteredAddedClients {
return _filteredAddedClients;
}
void setClientsLoadStatus(LoadStatus status, bool notify) {
_loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
void setClientsData(Clients data) {
_clients = data;
if (_searchTermClients != null && _searchTermClients != '') {
_filteredActiveClients = _clients!.autoClients.where(
(client) => client.ip.contains(_searchTermClients!.toLowerCase()) || (client.name != null ? client.name!.contains(_searchTermClients!.toLowerCase()) : false)
).toList();
_filteredAddedClients = _clients!.clients.where(
(client) {
isContained(String value) => value.contains(value.toLowerCase());
return client.ids.any(isContained);
}
).toList();
}
else {
_filteredActiveClients = data.autoClients;
_filteredAddedClients = data.clients;
}
notifyListeners();
}
void setSearchTermClients(String? value) {
_searchTermClients = value;
if (value != null && value != '') {
if (_clients != null) {
_filteredActiveClients = _clients!.autoClients.where(
(client) => client.ip.contains(value.toLowerCase()) || (client.name != null ? client.name!.contains(value.toLowerCase()) : false)
).toList();
_filteredAddedClients = _clients!.clients.where(
(client) {
isContained(String value) => value.contains(value.toLowerCase());
return client.ids.any(isContained);
}
).toList();
}
}
else {
if (_clients != null) _filteredActiveClients = _clients!.autoClients;
if (_clients != null) _filteredAddedClients = _clients!.clients;
}
notifyListeners();
}
void setAllowedDisallowedClientsBlockedDomains(ClientsAllowedBlocked data) {
_clients?.clientsAllowedBlocked = data;
notifyListeners();
}
} }

View file

@ -31,15 +31,6 @@ class ServersProvider with ChangeNotifier {
List<Server> _serversList = []; List<Server> _serversList = [];
Server? _selectedServer; Server? _selectedServer;
String? _serverVersion;
final Clients _clients = Clients(
loadStatus: LoadStatus.loading,
data: null
);
String? _searchTermClients;
List<AutoClient> _filteredActiveClients = [];
List<Client> _filteredAddedClients = [];
final Filtering _filtering = Filtering( final Filtering _filtering = Filtering(
loadStatus: LoadStatus.loading, loadStatus: LoadStatus.loading,
@ -81,22 +72,6 @@ class ServersProvider with ChangeNotifier {
return _selectedServer; return _selectedServer;
} }
Clients get clients {
return _clients;
}
String? get searchTermClients {
return _searchTermClients;
}
List<AutoClient> get filteredActiveClients {
return _filteredActiveClients;
}
List<Client> get filteredAddedClients {
return _filteredAddedClients;
}
FilteringStatus? get filteringStatus { FilteringStatus? get filteringStatus {
return _filteringStatus; return _filteringStatus;
} }
@ -139,60 +114,6 @@ class ServersProvider with ChangeNotifier {
notifyListeners(); notifyListeners();
} }
void setClientsLoadStatus(LoadStatus status, bool notify) {
_clients.loadStatus = status;
if (notify == true) {
notifyListeners();
}
}
void setClientsData(ClientsData data) {
_clients.data = data;
if (_searchTermClients != null && _searchTermClients != '') {
_filteredActiveClients = _clients.data!.autoClientsData.where(
(client) => client.ip.contains(_searchTermClients!.toLowerCase()) || (client.name != null ? client.name!.contains(_searchTermClients!.toLowerCase()) : false)
).toList();
_filteredAddedClients = _clients.data!.clients.where(
(client) {
isContained(String value) => value.contains(value.toLowerCase());
return client.ids.any(isContained);
}
).toList();
}
else {
_filteredActiveClients = data.autoClientsData;
_filteredAddedClients = data.clients;
}
notifyListeners();
}
void setSearchTermClients(String? value) {
_searchTermClients = value;
if (value != null && value != '') {
if (_clients.data != null) {
_filteredActiveClients = _clients.data!.autoClientsData.where(
(client) => client.ip.contains(value.toLowerCase()) || (client.name != null ? client.name!.contains(value.toLowerCase()) : false)
).toList();
_filteredAddedClients = _clients.data!.clients.where(
(client) {
isContained(String value) => value.contains(value.toLowerCase());
return client.ids.any(isContained);
}
).toList();
}
}
else {
if (_clients.data != null) _filteredActiveClients = _clients.data!.autoClientsData;
if (_clients.data != null) _filteredAddedClients = _clients.data!.clients;
}
notifyListeners();
}
void setAllowedDisallowedClientsBlockedDomains(ClientsAllowedBlocked data) {
_clients.data?.clientsAllowedBlocked = data;
notifyListeners();
}
void setFilteringStatus(FilteringStatus status) { void setFilteringStatus(FilteringStatus status) {
_filteringStatus = status; _filteringStatus = status;
notifyListeners(); notifyListeners();

View file

@ -19,6 +19,7 @@ import 'package:adguard_home_manager/widgets/tab_content_list.dart';
import 'package:adguard_home_manager/functions/snackbar.dart'; import 'package:adguard_home_manager/functions/snackbar.dart';
import 'package:adguard_home_manager/functions/maps_fns.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/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/constants/enums.dart';
import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/services/http_requests.dart';
@ -79,6 +80,7 @@ class _AddedListState extends State<AddedList> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context); final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(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;
@ -101,7 +103,7 @@ class _AddedListState extends State<AddedList> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!; Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.map((e) { clientsData.clients = clientsData.clients.map((e) {
if (e.name == client.name) { if (e.name == client.name) {
return client; return client;
@ -110,7 +112,7 @@ class _AddedListState extends State<AddedList> {
return e; return e;
} }
}).toList(); }).toList();
serversProvider.setClientsData(clientsData); clientsProvider.setClientsData(clientsData);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,
@ -138,9 +140,9 @@ class _AddedListState extends State<AddedList> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!; Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList(); clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList();
serversProvider.setClientsData(clientsData); clientsProvider.setClientsData(clientsData);
if (widget.splitView == true) { if (widget.splitView == true) {
SplitView.of(context).popUntil(0); SplitView.of(context).popUntil(0);

View file

@ -11,6 +11,7 @@ import 'package:adguard_home_manager/widgets/custom_list_tile.dart';
import 'package:adguard_home_manager/functions/compare_versions.dart'; import 'package:adguard_home_manager/functions/compare_versions.dart';
import 'package:adguard_home_manager/models/safe_search.dart'; import 'package:adguard_home_manager/models/safe_search.dart';
import 'package:adguard_home_manager/providers/clients_provider.dart';
import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/status_provider.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/clients.dart';
@ -132,6 +133,7 @@ class _ClientScreenState extends State<ClientScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context); final statusProvider = Provider.of<StatusProvider>(context);
void createClient() { void createClient() {
@ -202,7 +204,7 @@ class _ClientScreenState extends State<ClientScreen> {
context: context, context: context,
builder: (context) => TagsModal( builder: (context) => TagsModal(
selectedTags: selectedTags, selectedTags: selectedTags,
tags: serversProvider.clients.data!.supportedTags, tags: clientsProvider.clients!.supportedTags,
onConfirm: (selected) => setState(() => selectedTags = selected), onConfirm: (selected) => setState(() => selectedTags = selected),
) )
); );

View file

@ -11,53 +11,21 @@ import 'package:adguard_home_manager/screens/clients/logs_list_client.dart';
import 'package:adguard_home_manager/screens/clients/clients_desktop_view.dart'; import 'package:adguard_home_manager/screens/clients/clients_desktop_view.dart';
import 'package:adguard_home_manager/screens/clients/added_list.dart'; import 'package:adguard_home_manager/screens/clients/added_list.dart';
import 'package:adguard_home_manager/models/app_log.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/providers/app_config_provider.dart';
import 'package:adguard_home_manager/models/server.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.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/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 Clients extends StatelessWidget { class Clients extends StatefulWidget {
const Clients({Key? key}) : super(key: key); const Clients({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { State<Clients> createState() => _ClientsState();
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return ClientsWidget(
server: serversProvider.selectedServer!,
setLoadingStatus: serversProvider.setClientsLoadStatus,
setClientsData: serversProvider.setClientsData,
setSelectedClientsTab: appConfigProvider.setSelectedClientsTab,
addLog: appConfigProvider.addLog,
);
}
} }
class ClientsWidget extends StatefulWidget { class _ClientsState extends State<Clients> with TickerProviderStateMixin {
final Server server;
final void Function(LoadStatus, bool) setLoadingStatus;
final void Function(ClientsData) setClientsData;
final void Function(int) setSelectedClientsTab;
final void Function(AppLog) addLog;
const ClientsWidget({
Key? key,
required this.server,
required this.setLoadingStatus,
required this.setClientsData,
required this.setSelectedClientsTab,
required this.addLog,
}) : super(key: key);
@override
State<ClientsWidget> createState() => _ClientsWidgetState();
}
class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateMixin {
late TabController tabController; late TabController tabController;
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
@ -65,16 +33,20 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
final TextEditingController searchController = TextEditingController(); final TextEditingController searchController = TextEditingController();
Future fetchClients() async { Future fetchClients() async {
widget.setLoadingStatus(LoadStatus.loading, false); final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final result = await getClients(widget.server); 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 (mounted) {
if (result['result'] == 'success') { if (result['result'] == 'success') {
widget.setClientsData(result['data']); clientsProvider.setClientsData(result['data']);
widget.setLoadingStatus(LoadStatus.loaded, true); clientsProvider.setClientsLoadStatus(LoadStatus.loaded, true);
} }
else { else {
widget.addLog(result['log']); appConfigProvider.addLog(result['log']);
widget.setLoadingStatus(LoadStatus.error, true); clientsProvider.setClientsLoadStatus(LoadStatus.error, true);
} }
} }
} }
@ -88,7 +60,9 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
length: 2, length: 2,
vsync: this, vsync: this,
); );
tabController.addListener(() => widget.setSelectedClientsTab(tabController.index)); tabController.addListener(
() => Provider.of<AppConfigProvider>(context, listen: false).setSelectedClientsTab(tabController.index)
);
} }
List<AutoClient> generateClientsList(List<AutoClient> clients, List<String> ips) { List<AutoClient> generateClientsList(List<AutoClient> clients, List<String> ips) {
@ -98,6 +72,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(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;
@ -137,9 +112,9 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
children: [ children: [
ClientsList( ClientsList(
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.filteredActiveClients : [], ? clientsProvider.filteredActiveClients : [],
fetchClients: fetchClients, fetchClients: fetchClients,
onClientSelected: (client) => Navigator.push(context, MaterialPageRoute( onClientSelected: (client) => Navigator.push(context, MaterialPageRoute(
builder: (context) => LogsListClient( builder: (context) => LogsListClient(
@ -153,9 +128,9 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
), ),
AddedList( AddedList(
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.filteredAddedClients : [], ? clientsProvider.filteredAddedClients : [],
fetchClients: fetchClients, fetchClients: fetchClients,
onClientSelected: (client) => Navigator.push(context, MaterialPageRoute( onClientSelected: (client) => Navigator.push(context, MaterialPageRoute(
builder: (context) => LogsListClient( builder: (context) => LogsListClient(
@ -203,7 +178,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
title: Text(AppLocalizations.of(context)!.clients), title: Text(AppLocalizations.of(context)!.clients),
centerTitle: false, centerTitle: false,
actions: [ actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded) ...[ if (clientsProvider.loadStatus == LoadStatus.loaded) ...[
IconButton( IconButton(
onPressed: () => { onPressed: () => {
Navigator.push(context, MaterialPageRoute( Navigator.push(context, MaterialPageRoute(
@ -240,7 +215,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
setState(() { setState(() {
searchMode = false; searchMode = false;
searchController.text = ""; searchController.text = "";
serversProvider.setSearchTermClients(null); clientsProvider.setSearchTermClients(null);
}); });
}, },
icon: const Icon(Icons.arrow_back_rounded) icon: const Icon(Icons.arrow_back_rounded)
@ -249,13 +224,13 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
Expanded( Expanded(
child: TextField( child: TextField(
controller: searchController, controller: searchController,
onChanged: (value) => serversProvider.setSearchTermClients(value), onChanged: (value) => clientsProvider.setSearchTermClients(value),
decoration: InputDecoration( decoration: InputDecoration(
suffixIcon: IconButton( suffixIcon: IconButton(
onPressed: () { onPressed: () {
setState(() { setState(() {
searchController.text = ""; searchController.text = "";
serversProvider.setSearchTermClients(null); clientsProvider.setSearchTermClients(null);
}); });
}, },
icon: const Icon(Icons.clear_rounded) icon: const Icon(Icons.clear_rounded)
@ -281,7 +256,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
centerTitle: false, centerTitle: false,
forceElevated: innerBoxIsScrolled, forceElevated: innerBoxIsScrolled,
actions: [ actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded && searchMode == false) ...[ if (clientsProvider.loadStatus == LoadStatus.loaded && searchMode == false) ...[
IconButton( IconButton(
onPressed: () => setState(() => searchMode = true), onPressed: () => setState(() => searchMode = true),
icon: const Icon(Icons.search), icon: const Icon(Icons.search),

View file

@ -10,6 +10,7 @@ import 'package:adguard_home_manager/screens/clients/added_list.dart';
import 'package:adguard_home_manager/screens/clients/clients_list.dart'; import 'package:adguard_home_manager/screens/clients/clients_list.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/clients_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart'; import 'package:adguard_home_manager/constants/enums.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';
@ -55,6 +56,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
PreferredSizeWidget tabBar() { PreferredSizeWidget tabBar() {
@ -92,9 +94,9 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
children: [ children: [
ClientsList( ClientsList(
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.filteredActiveClients : [], ? clientsProvider.filteredActiveClients : [],
fetchClients: widget.fetchClients, fetchClients: widget.fetchClients,
onClientSelected: (client) => setState(() { onClientSelected: (client) => setState(() {
selectedAddedClient = null; selectedAddedClient = null;
@ -114,9 +116,9 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
), ),
AddedList( AddedList(
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.filteredAddedClients : [], ? clientsProvider.filteredAddedClients : [],
fetchClients: widget.fetchClients, fetchClients: widget.fetchClients,
onClientSelected: (client) => setState(() { onClientSelected: (client) => setState(() {
selectedActiveClient = null; selectedActiveClient = null;
@ -146,7 +148,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
setState(() { setState(() {
searchMode = false; searchMode = false;
searchController.text = ""; searchController.text = "";
serversProvider.setSearchTermClients(null); clientsProvider.setSearchTermClients(null);
}); });
}, },
icon: const Icon(Icons.arrow_back_rounded) icon: const Icon(Icons.arrow_back_rounded)
@ -155,13 +157,13 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
Expanded( Expanded(
child: TextField( child: TextField(
controller: searchController, controller: searchController,
onChanged: (value) => serversProvider.setSearchTermClients(value), onChanged: (value) => clientsProvider.setSearchTermClients(value),
decoration: InputDecoration( decoration: InputDecoration(
suffixIcon: IconButton( suffixIcon: IconButton(
onPressed: () { onPressed: () {
setState(() { setState(() {
searchController.text = ""; searchController.text = "";
serversProvider.setSearchTermClients(null); clientsProvider.setSearchTermClients(null);
}); });
}, },
icon: const Icon(Icons.clear_rounded) icon: const Icon(Icons.clear_rounded)
@ -195,7 +197,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
title: title(), title: title(),
centerTitle: false, centerTitle: false,
actions: [ actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded && searchMode == false) ...[ if (clientsProvider.loadStatus == LoadStatus.loaded && searchMode == false) ...[
IconButton( IconButton(
onPressed: () => setState(() => searchMode = true), onPressed: () => setState(() => searchMode = true),
icon: const Icon(Icons.search), icon: const Icon(Icons.search),
@ -226,7 +228,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
centerTitle: false, centerTitle: false,
forceElevated: innerBoxIsScrolled, forceElevated: innerBoxIsScrolled,
actions: [ actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded && searchMode == false) ...[ if (clientsProvider.loadStatus == LoadStatus.loaded && searchMode == false) ...[
IconButton( IconButton(
onPressed: () => setState(() => searchMode = true), onPressed: () => setState(() => searchMode = true),
icon: const Icon(Icons.search), icon: const Icon(Icons.search),

View file

@ -9,6 +9,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/clients/client_screen.dart'; import 'package:adguard_home_manager/screens/clients/client_screen.dart';
import 'package:adguard_home_manager/functions/snackbar.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/functions/compare_versions.dart';
import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/functions/maps_fns.dart'; import 'package:adguard_home_manager/functions/maps_fns.dart';
@ -26,6 +27,7 @@ class ClientsFab extends StatelessWidget {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context); final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final width = MediaQuery.of(context).size.width; final width = MediaQuery.of(context).size.width;
@ -47,9 +49,9 @@ class ClientsFab extends StatelessWidget {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!; Clients clientsData = clientsProvider.clients!;
clientsData.clients.add(client); clientsData.clients.add(client);
serversProvider.setClientsData(clientsData); clientsProvider.setClientsData(clientsData);
showSnacbkar( showSnacbkar(
appConfigProvider: appConfigProvider, appConfigProvider: appConfigProvider,

View file

@ -19,36 +19,19 @@ import 'package:adguard_home_manager/classes/process_modal.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/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/clients_provider.dart';
import 'package:adguard_home_manager/models/clients.dart'; import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/status_provider.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart';
class SearchClients extends StatelessWidget { class SearchClients extends StatefulWidget {
const SearchClients({Key? key}) : super(key: key); const SearchClients({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { State<SearchClients> createState() => _SearchClientsState();
final serversProvider = Provider.of<ServersProvider>(context);
return SearchClientsWidget(
serversProvider: serversProvider,
);
}
} }
class SearchClientsWidget extends StatefulWidget { class _SearchClientsState extends State<SearchClients> {
final ServersProvider serversProvider;
const SearchClientsWidget({
Key? key,
required this.serversProvider,
}) : super(key: key);
@override
State<SearchClientsWidget> createState() => _SearchClientsWidgetState();
}
class _SearchClientsWidgetState extends State<SearchClientsWidget> {
late ScrollController scrollController; late ScrollController scrollController;
final TextEditingController searchController = TextEditingController(); final TextEditingController searchController = TextEditingController();
@ -87,11 +70,13 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
@override @override
void initState() { void initState() {
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
scrollController = ScrollController()..addListener(scrollListener); scrollController = ScrollController()..addListener(scrollListener);
setState(() { setState(() {
clients = widget.serversProvider.clients.data!.clients; clients = clientsProvider.clients!.clients;
autoClients = widget.serversProvider.clients.data!.autoClientsData; autoClients = clientsProvider.clients!.autoClients;
}); });
super.initState(); super.initState();
@ -101,6 +86,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context); final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(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;
@ -114,9 +100,9 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!; Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList(); clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList();
serversProvider.setClientsData(clientsData); clientsProvider.setClientsData(clientsData);
setState(() { setState(() {
clients = clientsData.clients; clients = clientsData.clients;
}); });
@ -151,7 +137,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!; Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.map((e) { clientsData.clients = clientsData.clients.map((e) {
if (e.name == client.name) { if (e.name == client.name) {
return client; return client;
@ -160,7 +146,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
return e; return e;
} }
}).toList(); }).toList();
serversProvider.setClientsData(clientsData); clientsProvider.setClientsData(clientsData);
setState(() { setState(() {
clients = clientsData.clients; clients = clientsData.clients;

View file

@ -7,54 +7,37 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:adguard_home_manager/screens/settings/access_settings/clients_list.dart'; import 'package:adguard_home_manager/screens/settings/access_settings/clients_list.dart';
import 'package:adguard_home_manager/constants/enums.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/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 AccessSettings extends StatelessWidget { class AccessSettings extends StatefulWidget {
const AccessSettings({Key? key}) : super(key: key); const AccessSettings({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { State<AccessSettings> createState() => _AccessSettingsState();
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return AccessSettingsWidget(
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
);
}
} }
class AccessSettingsWidget extends StatefulWidget { class _AccessSettingsState extends State<AccessSettings> with TickerProviderStateMixin {
final ServersProvider serversProvider;
final AppConfigProvider appConfigProvider;
const AccessSettingsWidget({
Key? key,
required this.serversProvider,
required this.appConfigProvider,
}) : super(key: key);
@override
State<AccessSettingsWidget> createState() => _AccessSettingsWidgetState();
}
class _AccessSettingsWidgetState extends State<AccessSettingsWidget> with TickerProviderStateMixin {
final ScrollController scrollController = ScrollController(); final ScrollController scrollController = ScrollController();
late TabController tabController; late TabController tabController;
Future fetchClients() async { Future fetchClients() async {
widget.serversProvider.setClientsLoadStatus(LoadStatus.loading, false); final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final result = await getClients(widget.serversProvider.selectedServer!); 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 (mounted) {
if (result['result'] == 'success') { if (result['result'] == 'success') {
widget.serversProvider.setClientsData(result['data']); clientsProvider.setClientsData(result['data']);
widget.serversProvider.setClientsLoadStatus(LoadStatus.loaded, true); clientsProvider.setClientsLoadStatus(LoadStatus.loaded, true);
} }
else { else {
widget.appConfigProvider.addLog(result['log']); appConfigProvider.addLog(result['log']);
widget.serversProvider.setClientsLoadStatus(LoadStatus.error, true); clientsProvider.setClientsLoadStatus(LoadStatus.error, true);
} }
} }
} }
@ -74,6 +57,7 @@ class _AccessSettingsWidgetState extends State<AccessSettingsWidget> with Ticker
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
Widget body() { Widget body() {
return TabBarView( return TabBarView(
@ -82,25 +66,25 @@ class _AccessSettingsWidgetState extends State<AccessSettingsWidget> with Ticker
ClientsList( ClientsList(
type: 'allowed', type: 'allowed',
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.clients.data!.clientsAllowedBlocked!.allowedClients : [], ? clientsProvider.clients!.clientsAllowedBlocked!.allowedClients : [],
fetchClients: fetchClients fetchClients: fetchClients
), ),
ClientsList( ClientsList(
type: 'disallowed', type: 'disallowed',
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.clients.data!.clientsAllowedBlocked!.disallowedClients : [], ? clientsProvider.clients!.clientsAllowedBlocked!.disallowedClients : [],
fetchClients: fetchClients fetchClients: fetchClients
), ),
ClientsList( ClientsList(
type: 'domains', type: 'domains',
scrollController: scrollController, scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus, loadStatus: clientsProvider.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded data: clientsProvider.loadStatus == LoadStatus.loaded
? serversProvider.clients.data!.clientsAllowedBlocked!.blockedHosts : [], ? clientsProvider.clients!.clientsAllowedBlocked!.blockedHosts : [],
fetchClients: fetchClients fetchClients: fetchClients
), ),
] ]

View file

@ -16,6 +16,7 @@ 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/models/clients_allowed_blocked.dart';
import 'package:adguard_home_manager/providers/servers_provider.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';
import 'package:adguard_home_manager/providers/clients_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/classes/process_modal.dart'; import 'package:adguard_home_manager/classes/process_modal.dart';
@ -69,14 +70,15 @@ class _ClientsListState extends State<ClientsList> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context); final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context); final appConfigProvider = Provider.of<AppConfigProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final width = MediaQuery.of(context).size.width; final width = MediaQuery.of(context).size.width;
void confirmRemoveItem(String client, String type) async { void confirmRemoveItem(String client, String type) async {
Map<String, List<String>> body = { Map<String, List<String>> body = {
"allowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.allowedClients ?? [], "allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [],
"disallowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.disallowedClients ?? [], "disallowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.disallowedClients ?? [],
"blocked_hosts": serversProvider.clients.data!.clientsAllowedBlocked?.blockedHosts ?? [], "blocked_hosts": clientsProvider.clients!.clientsAllowedBlocked?.blockedHosts ?? [],
}; };
if (type == 'allowed') { if (type == 'allowed') {
@ -97,7 +99,7 @@ class _ClientsListState extends State<ClientsList> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
serversProvider.setAllowedDisallowedClientsBlockedDomains( clientsProvider.setAllowedDisallowedClientsBlockedDomains(
ClientsAllowedBlocked( ClientsAllowedBlocked(
allowedClients: body['allowed_clients'] ?? [], allowedClients: body['allowed_clients'] ?? [],
disallowedClients: body['disallowed_clients'] ?? [], disallowedClients: body['disallowed_clients'] ?? [],
@ -125,9 +127,9 @@ class _ClientsListState extends State<ClientsList> {
void confirmAddItem(String item, String type) async { void confirmAddItem(String item, String type) async {
Map<String, List<String>> body = { Map<String, List<String>> body = {
"allowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.allowedClients ?? [], "allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [],
"disallowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.disallowedClients ?? [], "disallowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.disallowedClients ?? [],
"blocked_hosts": serversProvider.clients.data!.clientsAllowedBlocked?.blockedHosts ?? [], "blocked_hosts": clientsProvider.clients!.clientsAllowedBlocked?.blockedHosts ?? [],
}; };
if (type == 'allowed') { if (type == 'allowed') {
@ -148,7 +150,7 @@ class _ClientsListState extends State<ClientsList> {
processModal.close(); processModal.close();
if (result['result'] == 'success') { if (result['result'] == 'success') {
serversProvider.setAllowedDisallowedClientsBlockedDomains( clientsProvider.setAllowedDisallowedClientsBlockedDomains(
ClientsAllowedBlocked( ClientsAllowedBlocked(
allowedClients: body['allowed_clients'] ?? [], allowedClients: body['allowed_clients'] ?? [],
disallowedClients: body['disallowed_clients'] ?? [], disallowedClients: body['disallowed_clients'] ?? [],

View file

@ -591,7 +591,7 @@ Future getClients(Server server) async {
if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) {
if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) {
final clients = ClientsData.fromJson(jsonDecode(result[0]['body'])); final clients = Clients.fromJson(jsonDecode(result[0]['body']));
clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(result[1]['body'])); clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(result[1]['body']));
return { return {
'result': 'success', 'result': 'success',