mirror of
https://github.com/JGeek00/adguard-home-manager.git
synced 2025-04-24 15:56:05 +00:00
Extracted clients to a separate provider
This commit is contained in:
parent
4a2d78e8cf
commit
8a3d42b66c
12 changed files with 192 additions and 250 deletions
|
@ -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)),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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),
|
||||
)
|
||||
);
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
),
|
||||
]
|
||||
|
|
|
@ -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'] ?? [],
|
||||
|
|
|
@ -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',
|
||||
|
|
Loading…
Add table
Reference in a new issue