From b8b417103db005ca22ad75e9172aba2aa15850e7 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sun, 20 Jul 2025 14:11:18 +0200 Subject: [PATCH] refactor container tab repo --- .../geckoview/domain/providers/tab_state.dart | 11 ++ .../domain/providers/tab_state.g.dart | 18 +++ .../geckoview/domain/repositories/tab.dart | 4 +- .../geckoview/domain/repositories/tab.g.dart | 2 +- .../presentation/dialogs/web_page_dialog.dart | 4 +- .../widgets/sheets/view_tabs.dart | 2 +- .../presentation/widgets/tab_preview.dart | 2 +- .../features/tabs/domain/providers.dart | 9 ++ .../features/tabs/domain/providers.g.dart | 121 ++++++++++++++++++ .../domain/providers/selected_container.dart | 2 +- .../providers/selected_container.g.dart | 2 +- .../tabs/domain/repositories/tab.dart | 4 +- .../tabs/domain/repositories/tab.g.dart | 2 +- .../controllers/website_title.dart | 2 +- .../controllers/website_title.g.dart | 2 +- 15 files changed, 174 insertions(+), 13 deletions(-) diff --git a/app/lib/features/geckoview/domain/providers/tab_state.dart b/app/lib/features/geckoview/domain/providers/tab_state.dart index 82aa38d2..72827da8 100644 --- a/app/lib/features/geckoview/domain/providers/tab_state.dart +++ b/app/lib/features/geckoview/domain/providers/tab_state.dart @@ -15,6 +15,7 @@ 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/features/find_in_page/domain/repositories/find_in_page.dart'; +import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart'; import 'package:weblibre/features/geckoview/utils/image_helper.dart'; part 'tab_state.g.dart'; @@ -216,3 +217,13 @@ TabType? selectedTabType(Ref ref) { (isCurrentPrivate) => isCurrentPrivate ? TabType.private : TabType.regular, ); } + +@Riverpod(keepAlive: true) +AsyncValue selectedTabContainerId(Ref ref) { + final tabId = ref.watch(selectedTabProvider); + if (tabId != null) { + return ref.watch(watchContainerTabIdProvider(tabId)); + } + + return const AsyncData(null); +} diff --git a/app/lib/features/geckoview/domain/providers/tab_state.g.dart b/app/lib/features/geckoview/domain/providers/tab_state.g.dart index 866ac503..51e7a710 100644 --- a/app/lib/features/geckoview/domain/providers/tab_state.g.dart +++ b/app/lib/features/geckoview/domain/providers/tab_state.g.dart @@ -175,6 +175,24 @@ final selectedTabTypeProvider = AutoDisposeProvider.internal( @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef SelectedTabTypeRef = AutoDisposeProviderRef; +String _$selectedTabContainerIdHash() => + r'9f0246a02a069b1a66211a3924f32e9d75f0f344'; + +/// See also [selectedTabContainerId]. +@ProviderFor(selectedTabContainerId) +final selectedTabContainerIdProvider = Provider>.internal( + selectedTabContainerId, + name: r'selectedTabContainerIdProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$selectedTabContainerIdHash, + dependencies: null, + allTransitiveDependencies: null, +); + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +typedef SelectedTabContainerIdRef = ProviderRef>; String _$tabStatesHash() => r'e4d2f2b4ddd65beac8a1fd0d22bad1e0a26b41bd'; /// See also [TabStates]. diff --git a/app/lib/features/geckoview/domain/repositories/tab.dart b/app/lib/features/geckoview/domain/repositories/tab.dart index b706c205..e5e595ef 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.dart @@ -114,7 +114,7 @@ class TabRepository extends _$TabRepository { Future selectTab(String tabId) async { final containerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(tabId); + .getContainerTabId(tabId); final containerData = await containerId.mapNotNull( (containerId) => ref @@ -156,7 +156,7 @@ class TabRepository extends _$TabRepository { final currentContainerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(tabId); + .getContainerTabId(tabId); final sameContainerTabs = await ref .read(containerRepositoryProvider.notifier) diff --git a/app/lib/features/geckoview/domain/repositories/tab.g.dart b/app/lib/features/geckoview/domain/repositories/tab.g.dart index 7bbe174b..7f6e6544 100644 --- a/app/lib/features/geckoview/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/domain/repositories/tab.g.dart @@ -6,7 +6,7 @@ part of 'tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabRepositoryHash() => r'94e67307d67c8873b2ebd8cfadcd71258782987a'; +String _$tabRepositoryHash() => r'4b0dc3bbfd3635398009d655d811a4a35dbfb503'; /// See also [TabRepository]. @ProviderFor(TabRepository) diff --git a/app/lib/features/geckoview/features/browser/presentation/dialogs/web_page_dialog.dart b/app/lib/features/geckoview/features/browser/presentation/dialogs/web_page_dialog.dart index 093ab9d7..c5d9815d 100644 --- a/app/lib/features/geckoview/features/browser/presentation/dialogs/web_page_dialog.dart +++ b/app/lib/features/geckoview/features/browser/presentation/dialogs/web_page_dialog.dart @@ -231,7 +231,9 @@ class WebPageDialog extends HookConsumerWidget { ), builder: (context, ref, child) { final containerId = ref.watch( - selectedContainerProvider, + selectedTabContainerIdProvider.select( + (value) => value.valueOrNull, + ), ); return Visibility( diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tabs.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tabs.dart index 0bc4d40e..0c0fe38a 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tabs.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/sheets/view_tabs.dart @@ -433,7 +433,7 @@ class ViewTabsSheetWidget extends HookConsumerWidget { filteredTabEntities.value[oldIndex].tabId; final containerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(tabId); + .getContainerTabId(tabId); final String key; if (newIndex <= 0) { diff --git a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart index a8ff1257..a13db2fa 100644 --- a/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart +++ b/app/lib/features/geckoview/features/browser/presentation/widgets/tab_preview.dart @@ -237,7 +237,7 @@ class SingleTabPreview extends HookConsumerWidget { onDeleteAll: (host) async { final containerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(tab.id); + .getContainerTabId(tab.id); await ref .read(tabDataRepositoryProvider.notifier) diff --git a/app/lib/features/geckoview/features/tabs/domain/providers.dart b/app/lib/features/geckoview/features/tabs/domain/providers.dart index c5c93240..b487f349 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers.dart @@ -77,3 +77,12 @@ Stream> containerTabsData(Ref ref, String containerId) { final db = ref.watch(tabDatabaseProvider); return db.containerDao.getContainerTabsData(containerId).watch(); } + +@Riverpod() +Stream watchContainerTabId(Ref ref, String tabId) { + return ref + .read(tabDatabaseProvider) + .tabDao + .getTabContainerId(tabId) + .watchSingleOrNull(); +} diff --git a/app/lib/features/geckoview/features/tabs/domain/providers.g.dart b/app/lib/features/geckoview/features/tabs/domain/providers.g.dart index a66c24e8..f134ceb6 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers.g.dart @@ -687,5 +687,126 @@ class _ContainerTabsDataProviderElement String get containerId => (origin as ContainerTabsDataProvider).containerId; } +String _$watchContainerTabIdHash() => + r'b8f107e462f417b128221240242167a0754f040f'; + +/// See also [watchContainerTabId]. +@ProviderFor(watchContainerTabId) +const watchContainerTabIdProvider = WatchContainerTabIdFamily(); + +/// See also [watchContainerTabId]. +class WatchContainerTabIdFamily extends Family> { + /// See also [watchContainerTabId]. + const WatchContainerTabIdFamily(); + + /// See also [watchContainerTabId]. + WatchContainerTabIdProvider call(String tabId) { + return WatchContainerTabIdProvider(tabId); + } + + @override + WatchContainerTabIdProvider getProviderOverride( + covariant WatchContainerTabIdProvider provider, + ) { + return call(provider.tabId); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'watchContainerTabIdProvider'; +} + +/// See also [watchContainerTabId]. +class WatchContainerTabIdProvider extends AutoDisposeStreamProvider { + /// See also [watchContainerTabId]. + WatchContainerTabIdProvider(String tabId) + : this._internal( + (ref) => watchContainerTabId(ref as WatchContainerTabIdRef, tabId), + from: watchContainerTabIdProvider, + name: r'watchContainerTabIdProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$watchContainerTabIdHash, + dependencies: WatchContainerTabIdFamily._dependencies, + allTransitiveDependencies: + WatchContainerTabIdFamily._allTransitiveDependencies, + tabId: tabId, + ); + + WatchContainerTabIdProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.tabId, + }) : super.internal(); + + final String tabId; + + @override + Override overrideWith( + Stream Function(WatchContainerTabIdRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: WatchContainerTabIdProvider._internal( + (ref) => create(ref as WatchContainerTabIdRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + tabId: tabId, + ), + ); + } + + @override + AutoDisposeStreamProviderElement createElement() { + return _WatchContainerTabIdProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is WatchContainerTabIdProvider && other.tabId == tabId; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, tabId.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin WatchContainerTabIdRef on AutoDisposeStreamProviderRef { + /// The parameter `tabId` of this provider. + String get tabId; +} + +class _WatchContainerTabIdProviderElement + extends AutoDisposeStreamProviderElement + with WatchContainerTabIdRef { + _WatchContainerTabIdProviderElement(super.provider); + + @override + String get tabId => (origin as WatchContainerTabIdProvider).tabId; +} + // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart index e6541a0e..fe168b9c 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.dart @@ -102,7 +102,7 @@ class SelectedContainer extends _$SelectedContainer { if (next != null) { final tabContainerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(next); + .getContainerTabId(next); if (tabContainerId != stateOrNull) { if (tabContainerId != null) { diff --git a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart index fe1ba768..5c73f314 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers/selected_container.g.dart @@ -44,7 +44,7 @@ final selectedContainerTabCountProvider = @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element typedef SelectedContainerTabCountRef = AutoDisposeProviderRef>; -String _$selectedContainerHash() => r'34457f0adc45d437a9ab817387be4b1664cd2e7a'; +String _$selectedContainerHash() => r'0441c56a22fd8cab71fec4906d3c22f40553b327'; /// See also [SelectedContainer]. @ProviderFor(SelectedContainer) diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart index ab02d7ea..a7854bdb 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart @@ -15,7 +15,7 @@ class TabDataRepository extends _$TabDataRepository { ) async { final currentContainerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(tabId); + .getContainerTabId(tabId); final currentContainerData = await currentContainerId.mapNotNull( (containerId) => ref @@ -81,7 +81,7 @@ class TabDataRepository extends _$TabDataRepository { } } - Future containerTabId(String tabId) { + Future getContainerTabId(String tabId) { return ref .read(tabDatabaseProvider) .tabDao diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart index 74f161cb..519416cb 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.g.dart @@ -6,7 +6,7 @@ part of 'tab.dart'; // RiverpodGenerator // ************************************************************************** -String _$tabDataRepositoryHash() => r'c9a551adc4eff3b6680fee90be141e10a161db81'; +String _$tabDataRepositoryHash() => r'be1bb8a8118c7bfd90d0f1ac89a04c0a2149a0b0'; /// See also [TabDataRepository]. @ProviderFor(TabDataRepository) diff --git a/app/lib/presentation/controllers/website_title.dart b/app/lib/presentation/controllers/website_title.dart index 48526963..e3915587 100644 --- a/app/lib/presentation/controllers/website_title.dart +++ b/app/lib/presentation/controllers/website_title.dart @@ -68,7 +68,7 @@ Future pageInfo( if (tabId != null) { final containerId = await ref .read(tabDataRepositoryProvider.notifier) - .containerTabId(tabId); + .getContainerTabId(tabId); final containerData = await containerId.mapNotNull( (containerId) => ref diff --git a/app/lib/presentation/controllers/website_title.g.dart b/app/lib/presentation/controllers/website_title.g.dart index 6654d17e..1869d990 100644 --- a/app/lib/presentation/controllers/website_title.g.dart +++ b/app/lib/presentation/controllers/website_title.g.dart @@ -6,7 +6,7 @@ part of 'website_title.dart'; // RiverpodGenerator // ************************************************************************** -String _$pageInfoHash() => r'a57b4b72b16b63f5f366e014bb56cd0f021bcfa8'; +String _$pageInfoHash() => r'46eec6236555d37b5bbb4d8d887c5ee6ee0336e3'; /// Copied from Dart SDK class _SystemHash {