From 5803998d7350f418200eb4dfbfe8a5b0205abecd Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Sun, 9 Oct 2022 22:25:05 +0200 Subject: [PATCH] Added update lists --- lib/l10n/app_en.arb | 8 ++- lib/l10n/app_es.arb | 8 ++- lib/screens/filters/filters.dart | 84 ++++++++++++++++++++++++++++++-- lib/services/http_requests.dart | 45 +++++++++++++++++ 4 files changed, 140 insertions(+), 5 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 60f8354..b32392f 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -281,5 +281,11 @@ "disallowClient": "Disallow client", "noDisallowedDomains": "No disallowed domains", "domainNotAdded": "The domain couldn't be added", - "statusSelected": "status selected" + "statusSelected": "status selected", + "updateLists": "Update lists", + "checkHostFiltered": "Check host", + "updatingLists": "Updating lists...", + "listsUpdated": "lists updated", + "listsNotUpdated": "Couldn't update lists", + "listsNotLoaded": "Lists couldn't be loaded" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 2011073..2786119 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -281,5 +281,11 @@ "disallowClient": "No permitir cliente", "noDisallowedDomains": "No hay dominios no permitidos", "domainNotAdded": "El dominio no pudo ser aƱadido", - "statusSelected": "estado/s seleccionados" + "statusSelected": "estado/s seleccionados", + "updateLists": "Actualizar listas", + "checkHostFiltered": "Comprobar host", + "updatingLists": "Actualizando listas...", + "listsUpdated": "listas actualizadas", + "listsNotUpdated": "No se pudieron actualizar las listas", + "listsNotLoaded": "No se pudieron cargar las listas" } \ No newline at end of file diff --git a/lib/screens/filters/filters.dart b/lib/screens/filters/filters.dart index 3b64f8a..f11302f 100644 --- a/lib/screens/filters/filters.dart +++ b/lib/screens/filters/filters.dart @@ -1,3 +1,5 @@ +// ignore_for_file: use_build_context_synchronously + import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -5,6 +7,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/screens/filters/filters_list.dart'; import 'package:adguard_home_manager/screens/filters/custom_rules_list.dart'; +import 'package:adguard_home_manager/functions/snackbar.dart'; +import 'package:adguard_home_manager/classes/process_modal.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/services/http_requests.dart'; import 'package:adguard_home_manager/models/clients.dart'; @@ -51,11 +55,11 @@ class _FiltersWidgetState extends State with TickerProviderStateM if (mounted) { if (result['result'] == 'success') { widget.serversProvider.setFilteringData(result['data']); - widget.serversProvider.setFilteringLoadStatus(1, true); + widget.serversProvider.setFilteringLoadStatus(1, false); } else { widget.appConfigProvider.addLog(result['log']); - widget.serversProvider.setFilteringLoadStatus(2, true); + widget.serversProvider.setFilteringLoadStatus(2, false); } } } @@ -79,6 +83,55 @@ class _FiltersWidgetState extends State with TickerProviderStateM @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); + + void fetchUpdateLists() async { + ProcessModal processModal = ProcessModal(context: context); + processModal.open(AppLocalizations.of(context)!.updatingLists); + + final result = await updateLists(server: serversProvider.selectedServer!); + + if (result['result'] == 'success') { + final result2 = await getFiltering(server: widget.serversProvider.selectedServer!); + + processModal.close(); + + if (mounted) { + if (result2['result'] == 'success') { + widget.serversProvider.setFilteringData(result2['data']); + + showSnacbkar( + context: context, + appConfigProvider: appConfigProvider, + label: "${result['data']['updated']} ${AppLocalizations.of(context)!.listsUpdated}", + color: Colors.green + ); + } + else { + widget.appConfigProvider.addLog(result2['log']); + + showSnacbkar( + context: context, + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.listsNotLoaded, + color: Colors.red + ); + } + } + + } + else { + processModal.close(); + appConfigProvider.addLog(result['log']); + + showSnacbkar( + context: context, + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.listsNotUpdated, + color: Colors.red + ); + } + } return DefaultTabController( length: 3, @@ -92,10 +145,35 @@ class _FiltersWidgetState extends State with TickerProviderStateM top: false, sliver: SliverAppBar( title: Text(AppLocalizations.of(context)!.filters), - centerTitle: true, pinned: true, floating: true, forceElevated: innerBoxIsScrolled, + actions: [ + PopupMenuButton( + itemBuilder: (context) => [ + PopupMenuItem( + onTap: fetchUpdateLists, + child: Row( + children: [ + const Icon(Icons.update), + const SizedBox(width: 10), + Text(AppLocalizations.of(context)!.updateLists) + ], + ) + ), + PopupMenuItem( + child: Row( + children: [ + const Icon(Icons.shield_rounded), + const SizedBox(width: 10), + Text(AppLocalizations.of(context)!.checkHostFiltered) + ], + ) + ), + ] + ), + const SizedBox(width: 5), + ], bottom: TabBar( controller: tabController, tabs: [ diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index b57221b..d7c1fb8 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -915,4 +915,49 @@ Future getServerInfo({ else { return result; } +} + +Future updateLists({ + required Server server, +}) async { + final result = await Future.wait([ + apiRequest( + urlPath: '/filtering/refresh', + method: 'post', + server: server, + body: {'whitelist': true}, + type: 'update_lists' + ), + apiRequest( + urlPath: '/filtering/refresh', + method: 'post', + server: server, + body: {'whitelist': false}, + type: 'update_lists' + ), + ]); + + if (result[0]['hasResponse'] == true && result[1]['hasResponse'] == true) { + if (result[0]['statusCode'] == 200 && result[1]['statusCode'] == 200) { + return { + 'result': 'success', + 'data': {'updated': jsonDecode(result[0]['body'])['updated']+jsonDecode(result[1]['body'])['updated']} + }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'update_lists', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result.map((res) => res['statusCode'] ?? 'null').toString(), + resBody: result.map((res) => res['body'] ?? 'null').toString(), + ) + }; + } + } + else { + return result; + } } \ No newline at end of file