// ignore_for_file: use_build_context_synchronously import 'dart:io'; import 'package:flutter/material.dart'; import 'package:percent_indicator/percent_indicator.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/domain_options.dart'; import 'package:adguard_home_manager/widgets/custom_list_tile.dart'; import 'package:adguard_home_manager/models/applied_filters.dart'; import 'package:adguard_home_manager/providers/logs_provider.dart'; import 'package:adguard_home_manager/functions/number_format.dart'; import 'package:adguard_home_manager/providers/status_provider.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; class TopItemsModal extends StatefulWidget { final String type; final String title; final bool? isClient; final List> data; const TopItemsModal({ Key? key, required this.type, required this.title, this.isClient, required this.data, }) : super(key: key); @override State createState() => _TopItemsModalState(); } class _TopItemsModalState extends State { bool searchActive = false; final TextEditingController searchController = TextEditingController(); List> data = []; List> screenData = []; void search(String value) { List> newValues = widget.data.where((item) => item.keys.toList()[0].contains(value)).toList(); setState(() => screenData = newValues); } @override void initState() { data = widget.data; screenData = widget.data; super.initState(); } @override Widget build(BuildContext context) { final statusProvider = Provider.of(context); final appConfigProvider = Provider.of(context); final logsProvider = Provider.of(context); int total = 0; for (var element in data) { total = total + int.parse(element.values.toList()[0].toString()); } return Dialog( child: ConstrainedBox( constraints: const BoxConstraints( maxWidth: 500 ), child: Column( children: [ Padding( padding: const EdgeInsets.all(16), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Expanded( flex: 1, child: Row( mainAxisAlignment: MainAxisAlignment.start, children: [ IconButton( onPressed: () => Navigator.pop(context), icon: const Icon(Icons.clear_rounded), tooltip: AppLocalizations.of(context)!.close, ), ], ), ), Expanded( flex: 1, child: TextField( controller: searchController, onChanged: search, decoration: InputDecoration( filled: true, fillColor: Theme.of(context).colorScheme.primary.withOpacity(0.1), hintText: AppLocalizations.of(context)!.search, prefixIcon: const Icon(Icons.search_rounded), contentPadding: const EdgeInsets.only(left: 14, bottom: 9, top: 11), focusedBorder: OutlineInputBorder( borderSide: const BorderSide(color: Colors.transparent), borderRadius: BorderRadius.circular(25.7), ), enabledBorder: UnderlineInputBorder( borderSide: const BorderSide(color: Colors.transparent), borderRadius: BorderRadius.circular(25.7), ), ), ), ) ], ), ), if (screenData.isNotEmpty) Flexible( child: ListView.builder( padding: const EdgeInsets.only(top: 0), itemCount: screenData.length, itemBuilder: (context, index) { String? name; if (widget.isClient != null && widget.isClient == true) { try { name = statusProvider.serverStatus!.clients.firstWhere((c) => c.ids.contains(screenData[index].keys.toList()[0])).name; } catch (e) { // ---- // } } return DomainOptions( isBlocked: widget.type == 'topBlockedDomains', isClient: widget.type == 'topClients', item: screenData[index].keys.toList()[0], onTap: () { if (widget.type == 'topQueriedDomains' || widget.type == 'topBlockedDomains') { logsProvider.setSearchText(screenData[index].keys.toList()[0]); logsProvider.setSelectedClients(null); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', searchText: screenData[index].keys.toList()[0], clients: null ) ); appConfigProvider.setSelectedScreen(2); Navigator.pop(context); } else if (widget.type == 'topClients') { logsProvider.setSearchText(null); logsProvider.setSelectedClients([screenData[index].keys.toList()[0]]); logsProvider.setAppliedFilters( AppliedFiters( selectedResultStatus: 'all', searchText: null, clients: [screenData[index].keys.toList()[0]] ) ); appConfigProvider.setSelectedScreen(2); Navigator.pop(context); } }, child: CustomListTile( title: screenData[index].keys.toList()[0], trailing: Text( screenData[index].values.toList()[0].toString(), style: TextStyle( color: Theme.of(context).colorScheme.onSurfaceVariant ), ), subtitleWidget: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ if (name != null) ...[ Text( name, style: TextStyle( fontSize: 14, color: Theme.of(context).colorScheme.onSurface ), ), const SizedBox(height: 5), ], Row( children: [ SizedBox( width: 50, child: Text( "${doubleFormat((screenData[index].values.toList()[0]/total*100), Platform.localeName)}%", style: TextStyle( color: Theme.of(context).listTileTheme.textColor ), ), ), const SizedBox(width: 10), Flexible( child: LinearPercentIndicator( animation: true, lineHeight: 4, animationDuration: 500, curve: Curves.easeOut, percent: screenData[index].values.toList()[0]/total, barRadius: const Radius.circular(5), progressColor: Theme.of(context).colorScheme.primary, backgroundColor: Theme.of(context).colorScheme.surfaceVariant, ), ), const SizedBox(width: 10), ], ), ], ) ), ); } ), ), if (screenData.isEmpty) Center( child: Padding( padding: const EdgeInsets.symmetric(horizontal: 20), child: Text( AppLocalizations.of(context)!.noItemsSearch, textAlign: TextAlign.center, style: TextStyle( fontSize: 22, color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), ), ) ], ), ), ); } }