add option to close tab after data cleared
This commit is contained in:
+26
-3
@@ -24,7 +24,9 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|||||||
import 'package:nullability/nullability.dart';
|
import 'package:nullability/nullability.dart';
|
||||||
import 'package:weblibre/core/logger.dart';
|
import 'package:weblibre/core/logger.dart';
|
||||||
import 'package:weblibre/features/geckoview/domain/controllers/bottom_sheet.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/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/features/geckoview/features/browser/presentation/dialogs/clear_site_data_dialog.dart';
|
||||||
import 'package:weblibre/utils/ui_helper.dart';
|
import 'package:weblibre/utils/ui_helper.dart';
|
||||||
|
|
||||||
@@ -43,6 +45,7 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
final isExpanded = useState(false);
|
final isExpanded = useState(false);
|
||||||
final isClearing = useState(false);
|
final isClearing = useState(false);
|
||||||
|
final closeTabAfterClear = useState(false);
|
||||||
final selectedTypes = useState<Set<ClearDataType>>({
|
final selectedTypes = useState<Set<ClearDataType>>({
|
||||||
ClearDataType.allSiteData,
|
ClearDataType.allSiteData,
|
||||||
ClearDataType.authSessions,
|
ClearDataType.authSessions,
|
||||||
@@ -131,6 +134,15 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
: (selected) => toggleType(ClearDataType.onlyCaches),
|
: (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(
|
||||||
padding: const EdgeInsets.symmetric(
|
padding: const EdgeInsets.symmetric(
|
||||||
horizontal: 16.0,
|
horizontal: 16.0,
|
||||||
@@ -146,6 +158,7 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
ref,
|
ref,
|
||||||
isClearing,
|
isClearing,
|
||||||
selectedTypes.value,
|
selectedTypes.value,
|
||||||
|
closeTabAfterClear.value,
|
||||||
),
|
),
|
||||||
icon: isClearing.value
|
icon: isClearing.value
|
||||||
? const SizedBox(
|
? const SizedBox(
|
||||||
@@ -168,6 +181,7 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
WidgetRef ref,
|
WidgetRef ref,
|
||||||
ValueNotifier<bool> isClearing,
|
ValueNotifier<bool> isClearing,
|
||||||
Set<ClearDataType> selectedTypes,
|
Set<ClearDataType> selectedTypes,
|
||||||
|
bool closeTabAfterClear,
|
||||||
) async {
|
) async {
|
||||||
if (selectedTypes.isEmpty) {
|
if (selectedTypes.isEmpty) {
|
||||||
showErrorMessage(context, 'Select at least one data type');
|
showErrorMessage(context, 'Select at least one data type');
|
||||||
@@ -183,7 +197,7 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
if (confirmed == true && context.mounted) {
|
if (confirmed == true && context.mounted) {
|
||||||
isClearing.value = true;
|
isClearing.value = true;
|
||||||
try {
|
try {
|
||||||
await _clearData(ref, selectedTypes);
|
await _clearData(ref, selectedTypes, closeTabAfterClear);
|
||||||
if (context.mounted) {
|
if (context.mounted) {
|
||||||
showInfoMessage(context, 'Site data cleared');
|
showInfoMessage(context, 'Site data cleared');
|
||||||
ref.read(bottomSheetControllerProvider.notifier).requestDismiss();
|
ref.read(bottomSheetControllerProvider.notifier).requestDismiss();
|
||||||
@@ -221,6 +235,7 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
Future<void> _clearData(
|
Future<void> _clearData(
|
||||||
WidgetRef ref,
|
WidgetRef ref,
|
||||||
Set<ClearDataType> selectedTypes,
|
Set<ClearDataType> selectedTypes,
|
||||||
|
bool closeTabAfterClear,
|
||||||
) async {
|
) async {
|
||||||
final host = url.host;
|
final host = url.host;
|
||||||
|
|
||||||
@@ -232,8 +247,16 @@ class ClearSiteDataSection extends HookConsumerWidget {
|
|||||||
final clearApi = GeckoDeleteBrowsingDataController();
|
final clearApi = GeckoDeleteBrowsingDataController();
|
||||||
await clearApi.clearDataForHost(baseDomain, selectedTypes.toList());
|
await clearApi.clearDataForHost(baseDomain, selectedTypes.toList());
|
||||||
|
|
||||||
// Reload tab
|
if (closeTabAfterClear) {
|
||||||
await ref.read(selectedTabSessionProvider).reload();
|
// 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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user