diff --git a/lib/models/clients.dart b/lib/models/clients.dart index 2c9f222..4d8e7db 100644 --- a/lib/models/clients.dart +++ b/lib/models/clients.dart @@ -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 clients; - final List autoClientsData; + final List autoClients; final List supportedTags; ClientsAllowedBlocked? clientsAllowedBlocked; - ClientsData({ + Clients({ required this.clients, - required this.autoClientsData, + required this.autoClients, required this.supportedTags, this.clientsAllowedBlocked }); - factory ClientsData.fromJson(Map json) => ClientsData( + factory Clients.fromJson(Map json) => Clients( clients: json["clients"] != null ? List.from(json["clients"].map((x) => Client.fromJson(x))) : [], - autoClientsData: json["auto_clients"] != null ? List.from(json["auto_clients"].map((x) => AutoClient.fromJson(x))) : [], + autoClients: json["auto_clients"] != null ? List.from(json["auto_clients"].map((x) => AutoClient.fromJson(x))) : [], supportedTags: json["supported_tags"] != null ? List.from(json["supported_tags"].map((x) => x)) : [], ); Map toJson() => { "clients": List.from(clients.map((x) => x.toJson())), - "auto_clients": List.from(autoClientsData.map((x) => x.toJson())), + "auto_clients": List.from(autoClients.map((x) => x.toJson())), "supported_tags": List.from(supportedTags.map((x) => x)), }; } diff --git a/lib/providers/clients_provider.dart b/lib/providers/clients_provider.dart index 3d7e0ae..df5d584 100644 --- a/lib/providers/clients_provider.dart +++ b/lib/providers/clients_provider.dart @@ -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 _filteredActiveClients = []; + List _filteredAddedClients = []; + + LoadStatus get loadStatus { + return _loadStatus; + } + + Clients? get clients { + return _clients; + } + + String? get searchTermClients { + return _searchTermClients; + } + + List get filteredActiveClients { + return _filteredActiveClients; + } + + List 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(); + } } \ No newline at end of file diff --git a/lib/providers/servers_provider.dart b/lib/providers/servers_provider.dart index decbb0a..771bbaf 100644 --- a/lib/providers/servers_provider.dart +++ b/lib/providers/servers_provider.dart @@ -31,15 +31,6 @@ class ServersProvider with ChangeNotifier { List _serversList = []; Server? _selectedServer; - String? _serverVersion; - - final Clients _clients = Clients( - loadStatus: LoadStatus.loading, - data: null - ); - String? _searchTermClients; - List _filteredActiveClients = []; - List _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 get filteredActiveClients { - return _filteredActiveClients; - } - - List 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(); diff --git a/lib/screens/clients/added_list.dart b/lib/screens/clients/added_list.dart index cc535db..5c876f0 100644 --- a/lib/screens/clients/added_list.dart +++ b/lib/screens/clients/added_list.dart @@ -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 { Widget build(BuildContext context) { final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -101,7 +103,7 @@ class _AddedListState extends State { 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 { return e; } }).toList(); - serversProvider.setClientsData(clientsData); + clientsProvider.setClientsData(clientsData); showSnacbkar( appConfigProvider: appConfigProvider, @@ -138,9 +140,9 @@ class _AddedListState extends State { 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); diff --git a/lib/screens/clients/client_screen.dart b/lib/screens/clients/client_screen.dart index 52bf1c1..c1c08ef 100644 --- a/lib/screens/clients/client_screen.dart +++ b/lib/screens/clients/client_screen.dart @@ -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 { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final statusProvider = Provider.of(context); void createClient() { @@ -202,7 +204,7 @@ class _ClientScreenState extends State { context: context, builder: (context) => TagsModal( selectedTags: selectedTags, - tags: serversProvider.clients.data!.supportedTags, + tags: clientsProvider.clients!.supportedTags, onConfirm: (selected) => setState(() => selectedTags = selected), ) ); diff --git a/lib/screens/clients/clients.dart b/lib/screens/clients/clients.dart index 9e13c77..98a9391 100644 --- a/lib/screens/clients/clients.dart +++ b/lib/screens/clients/clients.dart @@ -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(context); - final appConfigProvider = Provider.of(context); - - return ClientsWidget( - server: serversProvider.selectedServer!, - setLoadingStatus: serversProvider.setClientsLoadStatus, - setClientsData: serversProvider.setClientsData, - setSelectedClientsTab: appConfigProvider.setSelectedClientsTab, - addLog: appConfigProvider.addLog, - ); - } + State 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 createState() => _ClientsWidgetState(); -} - -class _ClientsWidgetState extends State with TickerProviderStateMixin { +class _ClientsState extends State with TickerProviderStateMixin { late TabController tabController; final ScrollController scrollController = ScrollController(); @@ -65,16 +33,20 @@ class _ClientsWidgetState extends State with TickerProviderStateM final TextEditingController searchController = TextEditingController(); Future fetchClients() async { - widget.setLoadingStatus(LoadStatus.loading, false); - final result = await getClients(widget.server); + final clientsProvider = Provider.of(context, listen: false); + final serversProvider = Provider.of(context, listen: false); + final appConfigProvider = Provider.of(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 with TickerProviderStateM length: 2, vsync: this, ); - tabController.addListener(() => widget.setSelectedClientsTab(tabController.index)); + tabController.addListener( + () => Provider.of(context, listen: false).setSelectedClientsTab(tabController.index) + ); } List generateClientsList(List clients, List ips) { @@ -98,6 +72,7 @@ class _ClientsWidgetState extends State with TickerProviderStateM @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -137,9 +112,9 @@ class _ClientsWidgetState extends State 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 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 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 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 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 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), diff --git a/lib/screens/clients/clients_desktop_view.dart b/lib/screens/clients/clients_desktop_view.dart index 0a4b783..04bfc35 100644 --- a/lib/screens/clients/clients_desktop_view.dart +++ b/lib/screens/clients/clients_desktop_view.dart @@ -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 with TickerPro @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); PreferredSizeWidget tabBar() { @@ -92,9 +94,9 @@ class _ClientsDesktopViewState extends State 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 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 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 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 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 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), diff --git a/lib/screens/clients/fab.dart b/lib/screens/clients/fab.dart index a92a1d0..61b2aec 100644 --- a/lib/screens/clients/fab.dart +++ b/lib/screens/clients/fab.dart @@ -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(context); final appConfigProvider = Provider.of(context); final statusProvider = Provider.of(context); + final clientsProvider = Provider.of(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, diff --git a/lib/screens/clients/search_clients.dart b/lib/screens/clients/search_clients.dart index 7f2c3df..569d50c 100644 --- a/lib/screens/clients/search_clients.dart +++ b/lib/screens/clients/search_clients.dart @@ -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(context); - - return SearchClientsWidget( - serversProvider: serversProvider, - ); - } + State createState() => _SearchClientsState(); } -class SearchClientsWidget extends StatefulWidget { - final ServersProvider serversProvider; - - const SearchClientsWidget({ - Key? key, - required this.serversProvider, - }) : super(key: key); - - @override - State createState() => _SearchClientsWidgetState(); -} - -class _SearchClientsWidgetState extends State { +class _SearchClientsState extends State { late ScrollController scrollController; final TextEditingController searchController = TextEditingController(); @@ -87,11 +70,13 @@ class _SearchClientsWidgetState extends State { @override void initState() { + final clientsProvider = Provider.of(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 { Widget build(BuildContext context) { final serversProvider = Provider.of(context); final statusProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; @@ -114,9 +100,9 @@ class _SearchClientsWidgetState extends State { 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 { 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 { return e; } }).toList(); - serversProvider.setClientsData(clientsData); + clientsProvider.setClientsData(clientsData); setState(() { clients = clientsData.clients; diff --git a/lib/screens/settings/access_settings/access_settings.dart b/lib/screens/settings/access_settings/access_settings.dart index 9f03328..b209bf6 100644 --- a/lib/screens/settings/access_settings/access_settings.dart +++ b/lib/screens/settings/access_settings/access_settings.dart @@ -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(context); - final appConfigProvider = Provider.of(context); - - return AccessSettingsWidget( - serversProvider: serversProvider, - appConfigProvider: appConfigProvider, - ); - } + State 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 createState() => _AccessSettingsWidgetState(); -} - -class _AccessSettingsWidgetState extends State with TickerProviderStateMixin { +class _AccessSettingsState extends State 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(context, listen: false); + final serversProvider = Provider.of(context, listen: false); + final appConfigProvider = Provider.of(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 with Ticker @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final clientsProvider = Provider.of(context); Widget body() { return TabBarView( @@ -82,25 +66,25 @@ class _AccessSettingsWidgetState extends State 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 ), ] diff --git a/lib/screens/settings/access_settings/clients_list.dart b/lib/screens/settings/access_settings/clients_list.dart index bc3646f..8e9fb30 100644 --- a/lib/screens/settings/access_settings/clients_list.dart +++ b/lib/screens/settings/access_settings/clients_list.dart @@ -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 { Widget build(BuildContext context) { final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); + final clientsProvider = Provider.of(context); final width = MediaQuery.of(context).size.width; void confirmRemoveItem(String client, String type) async { Map> 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 { 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 { void confirmAddItem(String item, String type) async { Map> 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 { processModal.close(); if (result['result'] == 'success') { - serversProvider.setAllowedDisallowedClientsBlockedDomains( + clientsProvider.setAllowedDisallowedClientsBlockedDomains( ClientsAllowedBlocked( allowedClients: body['allowed_clients'] ?? [], disallowedClients: body['disallowed_clients'] ?? [], diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index 25a15ea..cbc95b5 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -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',