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/safe_search.dart';
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;
final List<AutoClient> autoClientsData;
final List<AutoClient> autoClients;
final List<String> supportedTags;
ClientsAllowedBlocked? clientsAllowedBlocked;
ClientsData({
Clients({
required this.clients,
required this.autoClientsData,
required this.autoClients,
required this.supportedTags,
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))) : [],
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)) : [],
);
Map<String, dynamic> 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)),
};
}

View file

@ -1,6 +1,9 @@
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/constants/enums.dart';
class ClientsProvider with ChangeNotifier {
ServersProvider? _serversProvider;
@ -10,4 +13,84 @@ class ClientsProvider with ChangeNotifier {
_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 = [];
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(
loadStatus: LoadStatus.loading,
@ -81,22 +72,6 @@ class ServersProvider with ChangeNotifier {
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 {
return _filteringStatus;
}
@ -139,60 +114,6 @@ class ServersProvider with ChangeNotifier {
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) {
_filteringStatus = status;
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/maps_fns.dart';
import 'package:adguard_home_manager/providers/status_provider.dart';
import 'package:adguard_home_manager/providers/clients_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
@ -79,6 +80,7 @@ class _AddedListState extends State<AddedList> {
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -101,7 +103,7 @@ class _AddedListState extends State<AddedList> {
processModal.close();
if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!;
Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.map((e) {
if (e.name == client.name) {
return client;
@ -110,7 +112,7 @@ class _AddedListState extends State<AddedList> {
return e;
}
}).toList();
serversProvider.setClientsData(clientsData);
clientsProvider.setClientsData(clientsData);
showSnacbkar(
appConfigProvider: appConfigProvider,
@ -138,9 +140,9 @@ class _AddedListState extends State<AddedList> {
processModal.close();
if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!;
Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList();
serversProvider.setClientsData(clientsData);
clientsProvider.setClientsData(clientsData);
if (widget.splitView == true) {
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/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/servers_provider.dart';
import 'package:adguard_home_manager/models/clients.dart';
@ -132,6 +133,7 @@ class _ClientScreenState extends State<ClientScreen> {
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
void createClient() {
@ -202,7 +204,7 @@ class _ClientScreenState extends State<ClientScreen> {
context: context,
builder: (context) => TagsModal(
selectedTags: selectedTags,
tags: serversProvider.clients.data!.supportedTags,
tags: clientsProvider.clients!.supportedTags,
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/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/models/server.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
class Clients extends StatelessWidget {
class Clients extends StatefulWidget {
const Clients({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
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,
);
}
State<Clients> createState() => _ClientsState();
}
class ClientsWidget extends StatefulWidget {
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 {
class _ClientsState extends State<Clients> with TickerProviderStateMixin {
late TabController tabController;
final ScrollController scrollController = ScrollController();
@ -65,16 +33,20 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
final TextEditingController searchController = TextEditingController();
Future fetchClients() async {
widget.setLoadingStatus(LoadStatus.loading, false);
final result = await getClients(widget.server);
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
clientsProvider.setClientsLoadStatus(LoadStatus.loading, false);
final result = await getClients(serversProvider.selectedServer!);
if (mounted) {
if (result['result'] == 'success') {
widget.setClientsData(result['data']);
widget.setLoadingStatus(LoadStatus.loaded, true);
clientsProvider.setClientsData(result['data']);
clientsProvider.setClientsLoadStatus(LoadStatus.loaded, true);
}
else {
widget.addLog(result['log']);
widget.setLoadingStatus(LoadStatus.error, true);
appConfigProvider.addLog(result['log']);
clientsProvider.setClientsLoadStatus(LoadStatus.error, true);
}
}
}
@ -88,7 +60,9 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
length: 2,
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) {
@ -98,6 +72,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -137,9 +112,9 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
children: [
ClientsList(
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.filteredActiveClients : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.filteredActiveClients : [],
fetchClients: fetchClients,
onClientSelected: (client) => Navigator.push(context, MaterialPageRoute(
builder: (context) => LogsListClient(
@ -153,9 +128,9 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
),
AddedList(
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.filteredAddedClients : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.filteredAddedClients : [],
fetchClients: fetchClients,
onClientSelected: (client) => Navigator.push(context, MaterialPageRoute(
builder: (context) => LogsListClient(
@ -203,7 +178,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
title: Text(AppLocalizations.of(context)!.clients),
centerTitle: false,
actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded) ...[
if (clientsProvider.loadStatus == LoadStatus.loaded) ...[
IconButton(
onPressed: () => {
Navigator.push(context, MaterialPageRoute(
@ -240,7 +215,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
setState(() {
searchMode = false;
searchController.text = "";
serversProvider.setSearchTermClients(null);
clientsProvider.setSearchTermClients(null);
});
},
icon: const Icon(Icons.arrow_back_rounded)
@ -249,13 +224,13 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
Expanded(
child: TextField(
controller: searchController,
onChanged: (value) => serversProvider.setSearchTermClients(value),
onChanged: (value) => clientsProvider.setSearchTermClients(value),
decoration: InputDecoration(
suffixIcon: IconButton(
onPressed: () {
setState(() {
searchController.text = "";
serversProvider.setSearchTermClients(null);
clientsProvider.setSearchTermClients(null);
});
},
icon: const Icon(Icons.clear_rounded)
@ -281,7 +256,7 @@ class _ClientsWidgetState extends State<ClientsWidget> with TickerProviderStateM
centerTitle: false,
forceElevated: innerBoxIsScrolled,
actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded && searchMode == false) ...[
if (clientsProvider.loadStatus == LoadStatus.loaded && searchMode == false) ...[
IconButton(
onPressed: () => setState(() => searchMode = true),
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/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/models/clients.dart';
import 'package:adguard_home_manager/providers/servers_provider.dart';
@ -55,6 +56,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
PreferredSizeWidget tabBar() {
@ -92,9 +94,9 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
children: [
ClientsList(
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.filteredActiveClients : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.filteredActiveClients : [],
fetchClients: widget.fetchClients,
onClientSelected: (client) => setState(() {
selectedAddedClient = null;
@ -114,9 +116,9 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
),
AddedList(
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.filteredAddedClients : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.filteredAddedClients : [],
fetchClients: widget.fetchClients,
onClientSelected: (client) => setState(() {
selectedActiveClient = null;
@ -146,7 +148,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
setState(() {
searchMode = false;
searchController.text = "";
serversProvider.setSearchTermClients(null);
clientsProvider.setSearchTermClients(null);
});
},
icon: const Icon(Icons.arrow_back_rounded)
@ -155,13 +157,13 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
Expanded(
child: TextField(
controller: searchController,
onChanged: (value) => serversProvider.setSearchTermClients(value),
onChanged: (value) => clientsProvider.setSearchTermClients(value),
decoration: InputDecoration(
suffixIcon: IconButton(
onPressed: () {
setState(() {
searchController.text = "";
serversProvider.setSearchTermClients(null);
clientsProvider.setSearchTermClients(null);
});
},
icon: const Icon(Icons.clear_rounded)
@ -195,7 +197,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
title: title(),
centerTitle: false,
actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded && searchMode == false) ...[
if (clientsProvider.loadStatus == LoadStatus.loaded && searchMode == false) ...[
IconButton(
onPressed: () => setState(() => searchMode = true),
icon: const Icon(Icons.search),
@ -226,7 +228,7 @@ class _ClientsDesktopViewState extends State<ClientsDesktopView> with TickerPro
centerTitle: false,
forceElevated: innerBoxIsScrolled,
actions: [
if (serversProvider.clients.loadStatus == LoadStatus.loaded && searchMode == false) ...[
if (clientsProvider.loadStatus == LoadStatus.loaded && searchMode == false) ...[
IconButton(
onPressed: () => setState(() => searchMode = true),
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/functions/snackbar.dart';
import 'package:adguard_home_manager/providers/clients_provider.dart';
import 'package:adguard_home_manager/functions/compare_versions.dart';
import 'package:adguard_home_manager/models/clients.dart';
import 'package:adguard_home_manager/functions/maps_fns.dart';
@ -26,6 +27,7 @@ class ClientsFab extends StatelessWidget {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -47,9 +49,9 @@ class ClientsFab extends StatelessWidget {
processModal.close();
if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!;
Clients clientsData = clientsProvider.clients!;
clientsData.clients.add(client);
serversProvider.setClientsData(clientsData);
clientsProvider.setClientsData(clientsData);
showSnacbkar(
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/snackbar.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/providers/status_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);
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
return SearchClientsWidget(
serversProvider: serversProvider,
);
}
State<SearchClients> createState() => _SearchClientsState();
}
class SearchClientsWidget extends StatefulWidget {
final ServersProvider serversProvider;
const SearchClientsWidget({
Key? key,
required this.serversProvider,
}) : super(key: key);
@override
State<SearchClientsWidget> createState() => _SearchClientsWidgetState();
}
class _SearchClientsWidgetState extends State<SearchClientsWidget> {
class _SearchClientsState extends State<SearchClients> {
late ScrollController scrollController;
final TextEditingController searchController = TextEditingController();
@ -87,11 +70,13 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
@override
void initState() {
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
scrollController = ScrollController()..addListener(scrollListener);
setState(() {
clients = widget.serversProvider.clients.data!.clients;
autoClients = widget.serversProvider.clients.data!.autoClientsData;
clients = clientsProvider.clients!.clients;
autoClients = clientsProvider.clients!.autoClients;
});
super.initState();
@ -101,6 +86,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final statusProvider = Provider.of<StatusProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final width = MediaQuery.of(context).size.width;
@ -114,9 +100,9 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
processModal.close();
if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!;
Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.where((c) => c.name != client.name).toList();
serversProvider.setClientsData(clientsData);
clientsProvider.setClientsData(clientsData);
setState(() {
clients = clientsData.clients;
});
@ -151,7 +137,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
processModal.close();
if (result['result'] == 'success') {
ClientsData clientsData = serversProvider.clients.data!;
Clients clientsData = clientsProvider.clients!;
clientsData.clients = clientsData.clients.map((e) {
if (e.name == client.name) {
return client;
@ -160,7 +146,7 @@ class _SearchClientsWidgetState extends State<SearchClientsWidget> {
return e;
}
}).toList();
serversProvider.setClientsData(clientsData);
clientsProvider.setClientsData(clientsData);
setState(() {
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/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/providers/app_config_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);
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
return AccessSettingsWidget(
serversProvider: serversProvider,
appConfigProvider: appConfigProvider,
);
}
State<AccessSettings> createState() => _AccessSettingsState();
}
class AccessSettingsWidget extends StatefulWidget {
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 {
class _AccessSettingsState extends State<AccessSettings> with TickerProviderStateMixin {
final ScrollController scrollController = ScrollController();
late TabController tabController;
Future fetchClients() async {
widget.serversProvider.setClientsLoadStatus(LoadStatus.loading, false);
final result = await getClients(widget.serversProvider.selectedServer!);
final clientsProvider = Provider.of<ClientsProvider>(context, listen: false);
final serversProvider = Provider.of<ServersProvider>(context, listen: false);
final appConfigProvider = Provider.of<AppConfigProvider>(context, listen: false);
clientsProvider.setClientsLoadStatus(LoadStatus.loading, false);
final result = await getClients(serversProvider.selectedServer!);
if (mounted) {
if (result['result'] == 'success') {
widget.serversProvider.setClientsData(result['data']);
widget.serversProvider.setClientsLoadStatus(LoadStatus.loaded, true);
clientsProvider.setClientsData(result['data']);
clientsProvider.setClientsLoadStatus(LoadStatus.loaded, true);
}
else {
widget.appConfigProvider.addLog(result['log']);
widget.serversProvider.setClientsLoadStatus(LoadStatus.error, true);
appConfigProvider.addLog(result['log']);
clientsProvider.setClientsLoadStatus(LoadStatus.error, true);
}
}
}
@ -74,6 +57,7 @@ class _AccessSettingsWidgetState extends State<AccessSettingsWidget> with Ticker
@override
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
Widget body() {
return TabBarView(
@ -82,25 +66,25 @@ class _AccessSettingsWidgetState extends State<AccessSettingsWidget> with Ticker
ClientsList(
type: 'allowed',
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.clients.data!.clientsAllowedBlocked!.allowedClients : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.clients!.clientsAllowedBlocked!.allowedClients : [],
fetchClients: fetchClients
),
ClientsList(
type: 'disallowed',
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.clients.data!.clientsAllowedBlocked!.disallowedClients : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.clients!.clientsAllowedBlocked!.disallowedClients : [],
fetchClients: fetchClients
),
ClientsList(
type: 'domains',
scrollController: scrollController,
loadStatus: serversProvider.clients.loadStatus,
data: serversProvider.clients.loadStatus == LoadStatus.loaded
? serversProvider.clients.data!.clientsAllowedBlocked!.blockedHosts : [],
loadStatus: clientsProvider.loadStatus,
data: clientsProvider.loadStatus == LoadStatus.loaded
? clientsProvider.clients!.clientsAllowedBlocked!.blockedHosts : [],
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/providers/servers_provider.dart';
import 'package:adguard_home_manager/constants/enums.dart';
import 'package:adguard_home_manager/providers/clients_provider.dart';
import 'package:adguard_home_manager/services/http_requests.dart';
import 'package:adguard_home_manager/classes/process_modal.dart';
@ -69,14 +70,15 @@ class _ClientsListState extends State<ClientsList> {
Widget build(BuildContext context) {
final serversProvider = Provider.of<ServersProvider>(context);
final appConfigProvider = Provider.of<AppConfigProvider>(context);
final clientsProvider = Provider.of<ClientsProvider>(context);
final width = MediaQuery.of(context).size.width;
void confirmRemoveItem(String client, String type) async {
Map<String, List<String>> body = {
"allowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.allowedClients ?? [],
"disallowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.disallowedClients ?? [],
"blocked_hosts": serversProvider.clients.data!.clientsAllowedBlocked?.blockedHosts ?? [],
"allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [],
"disallowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.disallowedClients ?? [],
"blocked_hosts": clientsProvider.clients!.clientsAllowedBlocked?.blockedHosts ?? [],
};
if (type == 'allowed') {
@ -97,7 +99,7 @@ class _ClientsListState extends State<ClientsList> {
processModal.close();
if (result['result'] == 'success') {
serversProvider.setAllowedDisallowedClientsBlockedDomains(
clientsProvider.setAllowedDisallowedClientsBlockedDomains(
ClientsAllowedBlocked(
allowedClients: body['allowed_clients'] ?? [],
disallowedClients: body['disallowed_clients'] ?? [],
@ -125,9 +127,9 @@ class _ClientsListState extends State<ClientsList> {
void confirmAddItem(String item, String type) async {
Map<String, List<String>> body = {
"allowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.allowedClients ?? [],
"disallowed_clients": serversProvider.clients.data!.clientsAllowedBlocked?.disallowedClients ?? [],
"blocked_hosts": serversProvider.clients.data!.clientsAllowedBlocked?.blockedHosts ?? [],
"allowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.allowedClients ?? [],
"disallowed_clients": clientsProvider.clients!.clientsAllowedBlocked?.disallowedClients ?? [],
"blocked_hosts": clientsProvider.clients!.clientsAllowedBlocked?.blockedHosts ?? [],
};
if (type == 'allowed') {
@ -148,7 +150,7 @@ class _ClientsListState extends State<ClientsList> {
processModal.close();
if (result['result'] == 'success') {
serversProvider.setAllowedDisallowedClientsBlockedDomains(
clientsProvider.setAllowedDisallowedClientsBlockedDomains(
ClientsAllowedBlocked(
allowedClients: body['allowed_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]['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']));
return {
'result': 'success',