diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d7f2113..7fda167 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -357,14 +357,15 @@ "leaseTime": "Lease time", "seconds": "seconds", "leaseTimeNotValid": "Lease time not valid", - "restoreConfiguration": "Restore configuration", + "restoreConfiguration": "Reset configuration", + "restoreConfigurationMessage": "Are you sure you want to continue? This will reset all the configuration. This action cannot be undone.", "changeInterface": "Change interface", "savingSettings": "Saving settings...", "settingsSaved": "Settings saved successfully", "settingsNotSaved": "Settings couldn't be saved", "restoringConfig": "Restoring configuration...", - "configRestored": "Configuration restored successfully", - "configNotRestored": "The configuration couldn't be restored", + "configRestored": "Configuration reseted successfully", + "configNotRestored": "The configuration couldn't be reseted", "dhcpStatic": "DHCP static leases", "noDhcpStaticLeases": "No DHCP static leases found", "deleting": "Deleting...", @@ -382,10 +383,11 @@ "staticLeaseNotCreated": "The DHCP static lease couldn't be created", "staticLeaseExists": "The DHCP static lease already exists", "serverNotConfigured": "Server not configured", - "restoreLeases": "Restore leases", - "restoringLeases": "Restoring leases...", - "leasesRestored": "Leases restored successfully", - "leasesNotRestored": "The leases couldn't be restored", + "restoreLeases": "Reset leases", + "restoreLeasesMessage": "Are you sure you want to continue? This will reset all the existing leases. This action cannot be undone.", + "restoringLeases": "Resetting leases...", + "leasesRestored": "Leases reseted successfully", + "leasesNotRestored": "The leases couldn't be reseted", "dhcpLeases": "DHCP leases", "noLeases": "No DHCP leases available", "dnsRewrites": "DNS rewrites", diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index 2ff5da9..e0eee35 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -358,6 +358,7 @@ "seconds": "segundos", "leaseTimeNotValid": "Tiempo de asignación no válido", "restoreConfiguration": "Restaurar configuración", + "restoreConfigurationMessage": "Estás seguro de que deseas continuar? Se reseteará toda la configuración. Esta acción no se puede deshacer.", "changeInterface": "Cambiar interfaz", "savingSettings": "Guardando configuración...", "settingsSaved": "Configuración guardada correctamente", @@ -383,6 +384,7 @@ "staticLeaseExists": "La asignación DHCP estática ya existe", "serverNotConfigured": "El servidor no está configurado", "restoreLeases": "Restaurar asignaciones", + "restoreLeasesMessage": "Estás seguro de que deseas continuar? Se resetearán todas las asignaciones estáticas configuradas. Esta acción no se puede deshacer", "restoringLeases": "Restaurando asignaciones...", "leasesRestored": "Asignaciones restauradas correctamente", "leasesNotRestored": "Las asignaciones no pudieron ser restauradas", diff --git a/lib/screens/settings/dhcp/dhcp.dart b/lib/screens/settings/dhcp/dhcp.dart index b70cc02..66ed7e0 100644 --- a/lib/screens/settings/dhcp/dhcp.dart +++ b/lib/screens/settings/dhcp/dhcp.dart @@ -6,6 +6,7 @@ import 'package:bottom_sheet/bottom_sheet.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:adguard_home_manager/widgets/section_label.dart'; +import 'package:adguard_home_manager/widgets/confirm_action_modal.dart'; import 'package:adguard_home_manager/screens/settings/dhcp/dhcp_leases.dart'; import 'package:adguard_home_manager/screens/settings/dhcp/select_interface_modal.dart'; @@ -322,6 +323,34 @@ class _DhcpWidgetState extends State { }); } + void askRestoreLeases() { + Future.delayed(const Duration(seconds: 0), () => { + showDialog( + context: context, + builder: (context) => ConfirmActionModal( + icon: Icons.settings_backup_restore_rounded, + title: AppLocalizations.of(context)!.restoreLeases, + message: AppLocalizations.of(context)!.restoreLeasesMessage, + onConfirm: () => restoreLeases() + ) + ) + }); + } + + void askRestoreConfig() { + Future.delayed(const Duration(seconds: 0), () => { + showDialog( + context: context, + builder: (context) => ConfirmActionModal( + icon: Icons.restore, + title: AppLocalizations.of(context)!.restoreConfiguration, + message: AppLocalizations.of(context)!.restoreConfigurationMessage, + onConfirm: () => restoreConfig() + ) + ) + }); + } + void selectInterface() { ScaffoldMessenger.of(context).clearSnackBars(); Future.delayed(const Duration(seconds: 0), () { @@ -757,7 +786,7 @@ class _DhcpWidgetState extends State { ) ), PopupMenuItem( - onTap: restoreLeases, + onTap: askRestoreLeases, child: Row( children: [ const Icon(Icons.settings_backup_restore_rounded), @@ -767,7 +796,7 @@ class _DhcpWidgetState extends State { ) ), PopupMenuItem( - onTap: restoreConfig, + onTap: askRestoreConfig, child: Row( children: [ const Icon(Icons.restore), diff --git a/lib/widgets/confirm_action_modal.dart b/lib/widgets/confirm_action_modal.dart new file mode 100644 index 0000000..d0bb314 --- /dev/null +++ b/lib/widgets/confirm_action_modal.dart @@ -0,0 +1,59 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +class ConfirmActionModal extends StatelessWidget { + final IconData icon; + final String title; + final String message; + final void Function() onConfirm; + + const ConfirmActionModal({ + Key? key, + required this.icon, + required this.title, + required this.message, + required this.onConfirm + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return AlertDialog( + title: Column( + children: [ + Icon( + icon, + size: 24, + color: Theme.of(context).listTileTheme.iconColor + ), + const SizedBox(height: 16), + Text( + title, + style: TextStyle( + fontSize: 24, + color: Theme.of(context).colorScheme.onSurface + ), + ) + ], + ), + content: Text( + message, + style: TextStyle( + color: Theme.of(context).colorScheme.onSurface + ), + ), + 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