diff --git a/lib/functions/conversions.dart b/lib/functions/conversions.dart index dd1e471..37fcf4b 100644 --- a/lib/functions/conversions.dart +++ b/lib/functions/conversions.dart @@ -24,15 +24,6 @@ int? convertFromBoolToInt(bool value) { } } -double formatPercentage(double value) { - return (value * 100).truncateToDouble() / 100; -} - -String intFormat(int value, String locale) { - final f = NumberFormat("#,###", locale); - return f.format(value); -} - List> convertFromMapToList(Map values) { List> items = []; values.forEach((key, value) { diff --git a/lib/functions/number_format.dart b/lib/functions/number_format.dart new file mode 100644 index 0000000..a204dfd --- /dev/null +++ b/lib/functions/number_format.dart @@ -0,0 +1,11 @@ +import 'package:intl/intl.dart'; + +String intFormat(int value, String locale) { + final f = NumberFormat("#,###", locale); + return f.format(value); +} + +String doubleFormat(double value, String locale) { + final f = NumberFormat("#.##", locale); + return f.format(value); +} \ No newline at end of file diff --git a/lib/screens/home/home.dart b/lib/screens/home/home.dart index 48d3084..a865dd1 100644 --- a/lib/screens/home/home.dart +++ b/lib/screens/home/home.dart @@ -54,7 +54,8 @@ class Home extends StatelessWidget { TopItems( label: AppLocalizations.of(context)!.topQueriedDomains, - data: serversProvider.serverStatus.data!.stats.topQueriedDomains + data: serversProvider.serverStatus.data!.stats.topQueriedDomains, + type: 'topQueriedDomains', ), const Padding( padding: EdgeInsets.symmetric(horizontal: 20), @@ -66,7 +67,8 @@ class Home extends StatelessWidget { TopItems( label: AppLocalizations.of(context)!.topBlockedDomains, - data: serversProvider.serverStatus.data!.stats.topBlockedDomains + data: serversProvider.serverStatus.data!.stats.topBlockedDomains, + type: 'topBlockedDomains', ), const Padding( padding: EdgeInsets.symmetric(horizontal: 20), @@ -78,7 +80,8 @@ class Home extends StatelessWidget { TopItems( label: AppLocalizations.of(context)!.topClients, - data: serversProvider.serverStatus.data!.stats.topClients + data: serversProvider.serverStatus.data!.stats.topClients, + type: 'topClients', ), const SizedBox(height: 70) // To avoid content under fab diff --git a/lib/screens/home/top_items.dart b/lib/screens/home/top_items.dart index e518b3c..9e1f983 100644 --- a/lib/screens/home/top_items.dart +++ b/lib/screens/home/top_items.dart @@ -1,12 +1,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:adguard_home_manager/screens/top_items/top_items.dart'; + class TopItems extends StatelessWidget { + final String type; final String label; final List> data; const TopItems({ Key? key, + required this.type, required this.label, required this.data, }) : super(key: key); @@ -64,7 +68,14 @@ class TopItems extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( - onPressed: () => {}, + onPressed: () => Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => TopItemsScreen( + type: type, + title: label, + ) + ) + ), child: Row( mainAxisSize: MainAxisSize.min, children: [ diff --git a/lib/screens/top_items/top_items.dart b/lib/screens/top_items/top_items.dart new file mode 100644 index 0000000..893e0c3 --- /dev/null +++ b/lib/screens/top_items/top_items.dart @@ -0,0 +1,80 @@ +// ignore_for_file: use_build_context_synchronously + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:adguard_home_manager/functions/number_format.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/services/http_requests.dart'; + +class TopItemsScreen extends StatelessWidget { + final String type; + final String title; + + const TopItemsScreen({ + Key? key, + required this.type, + required this.title, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final serversProvider = Provider.of(context); + + List> data = []; + switch (type) { + case 'topQueriedDomains': + data = serversProvider.serverStatus.data!.stats.topQueriedDomains; + break; + + case 'topBlockedDomains': + data = serversProvider.serverStatus.data!.stats.topBlockedDomains; + break; + + case 'topClients': + data = serversProvider.serverStatus.data!.stats.topClients; + break; + + default: + break; + } + + int total = 0; + for (var element in data) { + total = total + int.parse(element.values.toList()[0].toString()); + } + + return Scaffold( + appBar: AppBar( + title: Text(title), + ), + body: RefreshIndicator( + onRefresh: () async { + final result = await getServerStatus(serversProvider.selectedServer!); + if (result['result'] == 'success') { + serversProvider.setServerStatusData(result['data']); + } + else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text(AppLocalizations.of(context)!.serverStatusNotRefreshed), + backgroundColor: Colors.red, + ) + ); + } + }, + child: ListView.builder( + itemCount: data.length, + itemBuilder: (context, index) => ListTile( + title: Text(data[index].keys.toList()[0]), + trailing: Text(data[index].values.toList()[0].toString()), + subtitle: Text("${doubleFormat((data[index].values.toList()[0]/total*100), Platform.localeName)}%") + ) + ), + ), + ); + } +} \ No newline at end of file