From a536fe30dab2c8b8ca9d3ac7ec4885ace7838499 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Mon, 13 Oct 2025 12:33:16 +0200 Subject: [PATCH] cache tab deletets for faster ui rebuild --- .../domain/providers/tab_delete_cache.dart | 23 +++++++ .../domain/providers/tab_delete_cache.g.dart | 63 +++++++++++++++++++ .../geckoview/domain/providers/tab_list.dart | 7 ++- .../domain/providers/tab_list.g.dart | 2 +- .../geckoview/domain/repositories/tab.dart | 7 +++ .../geckoview/domain/repositories/tab.g.dart | 2 +- 6 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 app/lib/features/geckoview/domain/providers/tab_delete_cache.dart create mode 100644 app/lib/features/geckoview/domain/providers/tab_delete_cache.g.dart diff --git a/app/lib/features/geckoview/domain/providers/tab_delete_cache.dart b/app/lib/features/geckoview/domain/providers/tab_delete_cache.dart new file mode 100644 index 00000000..7953036b --- /dev/null +++ b/app/lib/features/geckoview/domain/providers/tab_delete_cache.dart @@ -0,0 +1,23 @@ +import 'dart:async'; + +import 'package:riverpod_annotation/riverpod_annotation.dart'; + +part 'tab_delete_cache.g.dart'; + +@Riverpod(keepAlive: true) +class TabDeleteCache extends _$TabDeleteCache { + void delete(String tabId) { + state = {...state, tabId}; + + Timer(const Duration(seconds: 3), () { + if (ref.mounted) { + state = {...state}..remove(tabId); + } + }); + } + + @override + Set build() { + return {}; + } +} diff --git a/app/lib/features/geckoview/domain/providers/tab_delete_cache.g.dart b/app/lib/features/geckoview/domain/providers/tab_delete_cache.g.dart new file mode 100644 index 00000000..4a53ea90 --- /dev/null +++ b/app/lib/features/geckoview/domain/providers/tab_delete_cache.g.dart @@ -0,0 +1,63 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'tab_delete_cache.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +// GENERATED CODE - DO NOT MODIFY BY HAND +// ignore_for_file: type=lint, type=warning + +@ProviderFor(TabDeleteCache) +const tabDeleteCacheProvider = TabDeleteCacheProvider._(); + +final class TabDeleteCacheProvider + extends $NotifierProvider> { + const TabDeleteCacheProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'tabDeleteCacheProvider', + isAutoDispose: false, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$tabDeleteCacheHash(); + + @$internal + @override + TabDeleteCache create() => TabDeleteCache(); + + /// {@macro riverpod.override_with_value} + Override overrideWithValue(Set value) { + return $ProviderOverride( + origin: this, + providerOverride: $SyncValueProvider>(value), + ); + } +} + +String _$tabDeleteCacheHash() => r'd645d41fc2bf7b132f0cbdf1914289ca66783689'; + +abstract class _$TabDeleteCache extends $Notifier> { + Set build(); + @$mustCallSuper + @override + void runBuild() { + final created = build(); + final ref = this.ref as $Ref, Set>; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier, Set>, + Set, + Object?, + Object? + >; + element.handleValue(ref, created); + } +} diff --git a/app/lib/features/geckoview/domain/providers/tab_list.dart b/app/lib/features/geckoview/domain/providers/tab_list.dart index e2de1612..9aaaf51c 100644 --- a/app/lib/features/geckoview/domain/providers/tab_list.dart +++ b/app/lib/features/geckoview/domain/providers/tab_list.dart @@ -17,11 +17,13 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ +import 'package:collection/collection.dart'; import 'package:fast_equatable/fast_equatable.dart'; import 'package:flutter_mozilla_components/flutter_mozilla_components.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:weblibre/core/logger.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart'; +import 'package:weblibre/features/geckoview/domain/providers/tab_delete_cache.dart'; part 'tab_list.g.dart'; @@ -49,7 +51,10 @@ class TabList extends _$TabList { ); final tabListSub = eventService.tabListEvents.listen((tabs) { - final equatableTabs = EquatableValue(tabs); + final deletedTabs = ref.read(tabDeleteCacheProvider); + final equatableTabs = EquatableValue( + tabs.whereNot(deletedTabs.contains).toList(), + ); if (equatableTabs != state) { state = equatableTabs; diff --git a/app/lib/features/geckoview/domain/providers/tab_list.g.dart b/app/lib/features/geckoview/domain/providers/tab_list.g.dart index 39530d30..b08b4984 100644 --- a/app/lib/features/geckoview/domain/providers/tab_list.g.dart +++ b/app/lib/features/geckoview/domain/providers/tab_list.g.dart @@ -41,7 +41,7 @@ final class TabListProvider } } -String _$tabListHash() => r'0b9ca1e089a59895df4cbf28691c2849a7004f08'; +String _$tabListHash() => r'e93d68e7c362454e803711e5c38abcc8f188b427'; abstract class _$TabList extends $Notifier>> { EquatableValue> build(); diff --git a/app/lib/features/geckoview/domain/repositories/tab.dart b/app/lib/features/geckoview/domain/repositories/tab.dart index 77daec6a..ba8e906b 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.dart @@ -28,6 +28,7 @@ import 'package:weblibre/core/logger.dart'; import 'package:weblibre/features/geckoview/domain/entities/states/tab.dart'; import 'package:weblibre/features/geckoview/domain/providers.dart'; import 'package:weblibre/features/geckoview/domain/providers/selected_tab.dart'; +import 'package:weblibre/features/geckoview/domain/providers/tab_delete_cache.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_list.dart'; import 'package:weblibre/features/geckoview/domain/providers/tab_state.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/models/container_data.dart'; @@ -345,6 +346,8 @@ class TabRepository extends _$TabRepository { await _selectNextTab(tabId); } + ref.read(tabDeleteCacheProvider.notifier).delete(tabId); + return _tabsService.removeTab(tabId: tabId); } @@ -354,6 +357,10 @@ class TabRepository extends _$TabRepository { await _selectNextTab(selectedTab!); } + for (final tabId in tabIds) { + ref.read(tabDeleteCacheProvider.notifier).delete(tabId); + } + return _tabsService.removeTabs(ids: tabIds); } diff --git a/app/lib/features/geckoview/domain/repositories/tab.g.dart b/app/lib/features/geckoview/domain/repositories/tab.g.dart index 7b704634..d7ca88e3 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.g.dart @@ -41,7 +41,7 @@ final class TabRepositoryProvider } } -String _$tabRepositoryHash() => r'6fd5f78d5e5b728984b10a8824e06e82c5c26f4c'; +String _$tabRepositoryHash() => r'c3dd50e6263df20ce803e979151997e0b10e0c01'; abstract class _$TabRepository extends $Notifier { void build();