From 5634f51caa5ed5729ed0b2751699e5b7f9c712ad Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sun, 5 Jul 2026 09:07:40 +0200 Subject: [PATCH] add option to close tab after data cleared --- .../sheets/clear_site_data_section.dart | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/sheets/clear_site_data_section.dart b/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/sheets/clear_site_data_section.dart index 3e8c1f44..329aa695 100644 --- a/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/sheets/clear_site_data_section.dart +++ b/apps/weblibre/lib/features/geckoview/features/browser/presentation/widgets/sheets/clear_site_data_section.dart @@ -24,7 +24,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:nullability/nullability.dart'; import 'package:weblibre/core/logger.dart'; import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.dart'; +import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_session.dart'; +import 'package:weblibre/features/geckoview/domain/repositories/tab.dart'; import 'package:weblibre/features/geckoview/features/browser/presentation/dialogs/clear_site_data_dialog.dart'; import 'package:weblibre/utils/ui_helper.dart'; @@ -43,6 +45,7 @@ class ClearSiteDataSection extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final isExpanded = useState(false); final isClearing = useState(false); + final closeTabAfterClear = useState(false); final selectedTypes = useState>({ ClearDataType.allSiteData, ClearDataType.authSessions, @@ -131,6 +134,15 @@ class ClearSiteDataSection extends HookConsumerWidget { : (selected) => toggleType(ClearDataType.onlyCaches), ), ), + CheckboxListTile( + title: const Text('Close tab after clearing'), + subtitle: const Text('Close this tab once data is cleared'), + value: closeTabAfterClear.value, + onChanged: isClearing.value + ? null + : (value) => closeTabAfterClear.value = value ?? false, + controlAffinity: ListTileControlAffinity.trailing, + ), Padding( padding: const EdgeInsets.symmetric( horizontal: 16.0, @@ -146,6 +158,7 @@ class ClearSiteDataSection extends HookConsumerWidget { ref, isClearing, selectedTypes.value, + closeTabAfterClear.value, ), icon: isClearing.value ? const SizedBox( @@ -168,6 +181,7 @@ class ClearSiteDataSection extends HookConsumerWidget { WidgetRef ref, ValueNotifier isClearing, Set selectedTypes, + bool closeTabAfterClear, ) async { if (selectedTypes.isEmpty) { showErrorMessage(context, 'Select at least one data type'); @@ -183,7 +197,7 @@ class ClearSiteDataSection extends HookConsumerWidget { if (confirmed == true && context.mounted) { isClearing.value = true; try { - await _clearData(ref, selectedTypes); + await _clearData(ref, selectedTypes, closeTabAfterClear); if (context.mounted) { showInfoMessage(context, 'Site data cleared'); ref.read(bottomSheetControllerProvider.notifier).requestDismiss(); @@ -221,6 +235,7 @@ class ClearSiteDataSection extends HookConsumerWidget { Future _clearData( WidgetRef ref, Set selectedTypes, + bool closeTabAfterClear, ) async { final host = url.host; @@ -232,8 +247,16 @@ class ClearSiteDataSection extends HookConsumerWidget { final clearApi = GeckoDeleteBrowsingDataController(); await clearApi.clearDataForHost(baseDomain, selectedTypes.toList()); - // Reload tab - await ref.read(selectedTabSessionProvider).reload(); + if (closeTabAfterClear) { + // Close the tab instead of reloading it into the just-cleared state + final tabId = ref.read(selectedTabProvider); + if (tabId != null) { + await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); + } + } else { + // Reload tab + await ref.read(selectedTabSessionProvider).reload(); + } } }