From 9187521a70bc4337320af2302a7938234d02372c Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Sat, 15 Oct 2022 20:20:35 +0200 Subject: [PATCH] Added delete dns rewrite rule --- lib/l10n/app_en.arb | 6 +- lib/l10n/app_es.arb | 6 +- .../dns_rewrites/delete_dns_rewrite.dart | 44 +++++ .../settings/dns_rewrites/dns_rewrites.dart | 158 ++++++++++++------ lib/services/http_requests.dart | 34 ++++ 5 files changed, 194 insertions(+), 54 deletions(-) create mode 100644 lib/screens/settings/dns_rewrites/delete_dns_rewrite.dart diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 755149f..d4e1cfb 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -384,5 +384,9 @@ "loadingRewriteRules": "Loading rewrite rules...", "rewriteRulesNotLoaded": "DNS rewrite rules could not be loaded.", "noRewriteRules": "No DNS rewrite rules", - "answer": "Answer" + "answer": "Answer", + "deleteDnsRewrite": "Delete DNS rewrite", + "deleteDnsRewriteMessage": "Are you sure you want to delete this DNS rewrite? This action cannot be undone.", + "dnsRewriteRuleDeleted": "DNS rewrite rule deleted successfully", + "dnsRewriteRuleNotDeleted": "The DNS rewrite rule could not be deleted" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 3067e32..b2a0705 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -384,5 +384,9 @@ "loadingRewriteRules": "Cargando reescrituras DNS...", "rewriteRulesNotLoaded": "No se han podido cargar las reescrituras DNS.", "noRewriteRules": "No hay reescrituras DNS.", - "answer": "Respuesta" + "answer": "Respuesta", + "deleteDnsRewrite": "Eliminar reescritura DNS", + "deleteDnsRewriteMessage": "¿Estás seguro que deseas eliminar esta reescritura DNS? Esta acción no se puede deshacer.", + "dnsRewriteRuleDeleted": "Reescritura DNS eliminada correctamente", + "dnsRewriteRuleNotDeleted": "La reescritura DNS no pudo ser eliminada" } \ No newline at end of file diff --git a/lib/screens/settings/dns_rewrites/delete_dns_rewrite.dart b/lib/screens/settings/dns_rewrites/delete_dns_rewrite.dart new file mode 100644 index 0000000..3f7ed3b --- /dev/null +++ b/lib/screens/settings/dns_rewrites/delete_dns_rewrite.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class DeleteDnsRewrite extends StatelessWidget { + final void Function() onConfirm; + + const DeleteDnsRewrite({ + Key? key, + required this.onConfirm + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Column( + children: [ + const Icon( + Icons.delete_rounded, + size: 26, + ), + const SizedBox(height: 20), + Text( + AppLocalizations.of(context)!.deleteDnsRewrite, + textAlign: TextAlign.center, + ) + ], + ), + content: Text(AppLocalizations.of(context)!.deleteDnsRewriteMessage), + actions: [ + TextButton( + onPressed: () => Navigator.pop(context), + child: Text(AppLocalizations.of(context)!.cancel) + ), + TextButton( + onPressed: () { + onConfirm(); + Navigator.pop(context); + }, + child: Text(AppLocalizations.of(context)!.confirm) + ), + ], + ); + } +} \ No newline at end of file diff --git a/lib/screens/settings/dns_rewrites/dns_rewrites.dart b/lib/screens/settings/dns_rewrites/dns_rewrites.dart index 203c604..90d4080 100644 --- a/lib/screens/settings/dns_rewrites/dns_rewrites.dart +++ b/lib/screens/settings/dns_rewrites/dns_rewrites.dart @@ -1,10 +1,17 @@ +// 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'; +import 'package:adguard_home_manager/screens/settings/dns_rewrites/delete_dns_rewrite.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/functions/snackbar.dart'; +import 'package:adguard_home_manager/models/rewrite_rules.dart'; import 'package:adguard_home_manager/providers/servers_provider.dart'; +import 'package:adguard_home_manager/classes/process_modal.dart'; class DnsRewrites extends StatelessWidget { const DnsRewrites({Key? key}) : super(key: key); @@ -36,7 +43,7 @@ class DnsRewritesWidget extends StatefulWidget { } class _DnsRewritesWidgetState extends State { - void fetchData() async { + Future fetchData() async { widget.serversProvider.setRewriteRulesLoadStatus(0, false); final result = await getDnsRewriteRules(server: widget.serversProvider.selectedServer!); @@ -60,6 +67,41 @@ class _DnsRewritesWidgetState extends State { @override Widget build(BuildContext context) { final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); + + void deleteDnsRewrite(RewriteRulesData rule) async { + ProcessModal processModal = ProcessModal(context: context); + processModal.open(AppLocalizations.of(context)!.deleting); + + final result = await deleteDnsRewriteRule(server: serversProvider.selectedServer!, data: { + "domain": rule.domain, + "answer": rule.answer + }); + + processModal.close(); + + if (result['result'] == 'success') { + List data = serversProvider.rewriteRules.data!; + data = data.where((item) => item.domain != rule.domain).toList(); + serversProvider.setRewriteRulesData(data); + + showSnacbkar( + context: context, + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.dnsRewriteRuleDeleted, + color: Colors.green + ); + } + else { + appConfigProvider.addLog(result['log']); + showSnacbkar( + context: context, + appConfigProvider: appConfigProvider, + label: AppLocalizations.of(context)!.dnsRewriteRuleNotDeleted, + color: Colors.red + ); + } + } Widget generateBody() { switch (serversProvider.rewriteRules.loadStatus) { @@ -85,60 +127,72 @@ class _DnsRewritesWidgetState extends State { case 1: if (serversProvider.rewriteRules.data!.isNotEmpty) { - return ListView.builder( - padding: const EdgeInsets.only(top: 0), - itemCount: serversProvider.rewriteRules.data!.length, - itemBuilder: (context, index) => Container( - padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), - decoration: BoxDecoration( - border: Border( - bottom: BorderSide( - color: Colors.grey.shade200 + return RefreshIndicator( + onRefresh: () async { + await fetchData(); + }, + child: ListView.builder( + padding: const EdgeInsets.only(top: 0), + itemCount: serversProvider.rewriteRules.data!.length, + itemBuilder: (context, index) => Container( + padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10), + decoration: BoxDecoration( + border: Border( + bottom: BorderSide( + color: Colors.grey.shade200 + ) ) - ) - ), - child: Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row( - children: [ - Text( - "${AppLocalizations.of(context)!.domain}: ", - style: const TextStyle( - fontWeight: FontWeight.w500 + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + Text( + "${AppLocalizations.of(context)!.domain}: ", + style: const TextStyle( + fontWeight: FontWeight.w500 + ), ), - ), - Text( - serversProvider.rewriteRules.data![index].domain, - ), - ], - ), - const SizedBox(height: 3), - Row( - children: [ - Text( - "${AppLocalizations.of(context)!.answer}: ", - style: const TextStyle( - fontWeight: FontWeight.w500 + Text( + serversProvider.rewriteRules.data![index].domain, ), - ), - Text( - serversProvider.rewriteRules.data![index].answer, - ), - ], - ), - ], - ), - IconButton( - onPressed: () => {}, - icon: const Icon(Icons.delete) - ) - ], - ), - ) + ], + ), + const SizedBox(height: 3), + Row( + children: [ + Text( + "${AppLocalizations.of(context)!.answer}: ", + style: const TextStyle( + fontWeight: FontWeight.w500 + ), + ), + Text( + serversProvider.rewriteRules.data![index].answer, + ), + ], + ), + ], + ), + IconButton( + onPressed: () => { + showDialog( + context: context, + builder: (context) => DeleteDnsRewrite( + onConfirm: () => deleteDnsRewrite(serversProvider.rewriteRules.data![index]) + ) + ) + }, + icon: const Icon(Icons.delete) + ) + ], + ), + ) + ), ); } else { diff --git a/lib/services/http_requests.dart b/lib/services/http_requests.dart index 7148975..7d2f9a9 100644 --- a/lib/services/http_requests.dart +++ b/lib/services/http_requests.dart @@ -1394,4 +1394,38 @@ Future getDnsRewriteRules({ else { return result; } +} + +Future deleteDnsRewriteRule({ + required Server server, + required Map data, +}) async { + final result = await apiRequest( + urlPath: '/rewrite/delete', + method: 'post', + server: server, + body: data, + type: 'delete_dns_rewrite_rule' + ); + + if (result['hasResponse'] == true) { + if (result['statusCode'] == 200) { + return { 'result': 'success' }; + } + else { + return { + 'result': 'error', + 'log': AppLog( + type: 'delete_dns_rewrite_rule', + dateTime: DateTime.now(), + message: 'error_code_not_expected', + statusCode: result['statusCode'].toString(), + resBody: result['body'], + ) + }; + } + } + else { + return result; + } } \ No newline at end of file