diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 649f87a..5361391 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -80,5 +80,6 @@ "createdBy": "Created by", "clients": "Clients", "allowed": "Allowed", - "blocked": "Blocked" + "blocked": "Blocked", + "noClientsList": "There are no clients on this list" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 6c000d5..2897262 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -80,5 +80,6 @@ "createdBy": "Creado por", "clients": "Clientes", "allowed": "Permitidos", - "blocked": "Bloqueados" + "blocked": "Bloqueados", + "noClientsList": "No hay clientes en esta lista" } \ No newline at end of file diff --git a/lib/models/clients.dart b/lib/models/clients.dart index a53063e..1e9f9d1 100644 --- a/lib/models/clients.dart +++ b/lib/models/clients.dart @@ -1,5 +1,7 @@ import 'dart:convert'; +import 'package:adguard_home_manager/models/clients_allowed_blocked.dart'; + class Clients { int loadStatus; ClientsData? data; @@ -18,11 +20,13 @@ class ClientsData { final List clients; final List autoClientsData; final List supportedTags; + ClientsAllowedBlocked? clientsAllowedBlocked; ClientsData({ required this.clients, required this.autoClientsData, required this.supportedTags, + this.clientsAllowedBlocked }); factory ClientsData.fromJson(Map json) => ClientsData( diff --git a/lib/models/clients_allowed_blocked.dart b/lib/models/clients_allowed_blocked.dart new file mode 100644 index 0000000..2efcee4 --- /dev/null +++ b/lib/models/clients_allowed_blocked.dart @@ -0,0 +1,29 @@ +import 'dart:convert'; + +ClientsAllowedBlocked allowedBlockedFromJson(String str) => ClientsAllowedBlocked.fromJson(json.decode(str)); + +String allowedBlockedToJson(ClientsAllowedBlocked data) => json.encode(data.toJson()); + +class ClientsAllowedBlocked { + ClientsAllowedBlocked({ + required this.allowedClients, + required this.disallowedClients, + required this.blockedHosts, + }); + + final List allowedClients; + final List disallowedClients; + final List blockedHosts; + + factory ClientsAllowedBlocked.fromJson(Map json) => ClientsAllowedBlocked( + allowedClients: List.from(json["allowed_clients"].map((x) => x)), + disallowedClients: List.from(json["disallowed_clients"].map((x) => x)), + blockedHosts: List.from(json["blocked_hosts"].map((x) => x)), + ); + + Map toJson() => { + "allowed_clients": List.from(allowedClients.map((x) => x)), + "disallowed_clients": List.from(disallowedClients.map((x) => x)), + "blocked_hosts": List.from(blockedHosts.map((x) => x)), + }; +} diff --git a/lib/screens/clients/clients.dart b/lib/screens/clients/clients.dart index 021f28a..54a81b0 100644 --- a/lib/screens/clients/clients.dart +++ b/lib/screens/clients/clients.dart @@ -59,6 +59,10 @@ class _ClientsWidgetState extends State { super.initState(); } + List generateClientsList(List clients, List ips) { + return clients.where((client) => ips.contains(client.ip)).toList(); + } + @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); @@ -121,8 +125,18 @@ class _ClientsWidgetState extends State { ClientsList( data: serversProvider.clients.data!.autoClientsData, ), - Container(), - Container() + ClientsList( + data: generateClientsList( + serversProvider.clients.data!.autoClientsData, + serversProvider.clients.data!.clientsAllowedBlocked!.allowedClients, + ) + ), + ClientsList( + data: generateClientsList( + serversProvider.clients.data!.autoClientsData, + serversProvider.clients.data!.clientsAllowedBlocked!.disallowedClients, + ) + ), ], ) ) diff --git a/lib/screens/clients/clients_list.dart b/lib/screens/clients/clients_list.dart index 98ee84a..0943d93 100644 --- a/lib/screens/clients/clients_list.dart +++ b/lib/screens/clients/clients_list.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/models/clients.dart'; @@ -12,22 +13,39 @@ class ClientsList extends StatelessWidget { @override Widget build(BuildContext context) { - return ListView.builder( - padding: const EdgeInsets.only(top: 0), - itemCount: data.length, - itemBuilder: (context, index) => ListTile( - title: Text( - data[index].name != '' - ? data[index].name! - : data[index].ip + if (data.isNotEmpty) { + return ListView.builder( + padding: const EdgeInsets.only(top: 0), + itemCount: data.length, + itemBuilder: (context, index) => ListTile( + title: Text( + data[index].name != '' + ? data[index].name! + : data[index].ip + ), + subtitle: data[index].name != '' + ? Text( + data[index].ip + ) + : null, + trailing: Text(data[index].source), + ) + ); + } + else { + return SizedBox( + width: double.maxFinite, + child: Center( + child: Text( + AppLocalizations.of(context)!.noClientsList, + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 24, + color: Colors.grey + ), + ), ), - subtitle: data[index].name != '' - ? Text( - data[index].ip - ) - : null, - trailing: Text(data[index].source), - ) - ); + ); + } } } \ No newline at end of file diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index f80a5a0..1389e7f 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -8,6 +8,7 @@ import 'package:http/http.dart' as http; import 'package:adguard_home_manager/models/server_status.dart'; import 'package:adguard_home_manager/models/clients.dart'; +import 'package:adguard_home_manager/models/clients_allowed_blocked.dart'; import 'package:adguard_home_manager/models/server.dart'; Future getRequest({ @@ -246,15 +247,17 @@ Future updateGeneralProtection(Server server, bool enable) async { Future getClients(Server server) async { try { - final result = await getRequest( - urlPath: '/clients', - server: server, - ); + final result = await Future.wait([ + getRequest(urlPath: '/clients', server: server), + getRequest(urlPath: '/access/list', server: server), + ]); - if (result.statusCode == 200) { + if (result[0].statusCode == 200 && result[1].statusCode == 200) { + final clients = ClientsData.fromJson(jsonDecode(result[0].body)); + clients.clientsAllowedBlocked = ClientsAllowedBlocked.fromJson(jsonDecode(result[1].body)); return { 'result': 'success', - 'data': ClientsData.fromJson(jsonDecode(result.body)) + 'data': clients }; } else {