From da232bf8aa06d083d92d34c61c6b83679113bed5 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sun, 9 Nov 2025 07:23:23 +0100 Subject: [PATCH] fix tree view issues and improve providers --- .../features/browser/domain/providers.dart | 8 +- .../features/browser/domain/providers.g.dart | 6 +- .../presentation/dialogs/tab_tree.dart | 16 +- .../presentation/widgets/tab_preview.dart | 13 +- .../features/tabs/domain/providers.dart | 21 +- .../features/tabs/domain/providers.g.dart | 221 +++++++++++------- .../domain/providers/selected_container.dart | 2 +- .../providers/selected_container.g.dart | 2 +- .../domain/repositories/gecko_inference.dart | 12 +- .../repositories/gecko_inference.g.dart | 6 +- .../tabs/domain/repositories/tab.dart | 21 +- .../tabs/domain/repositories/tab.g.dart | 2 +- 12 files changed, 203 insertions(+), 127 deletions(-) diff --git a/app/lib/features/geckoview/features/browser/domain/providers.dart b/app/lib/features/geckoview/features/browser/domain/providers.dart index 3e439390..35ea6fc6 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.dart @@ -85,7 +85,9 @@ EquatableValue> availableTabIds( ContainerFilter containerFilter, ) { final containerTabs = ref.watch( - containerTabIdsProvider(containerFilter).select((value) => value.value), + watchContainerTabIdsProvider( + containerFilter, + ).select((value) => value.value), ); final tabList = ref.watch(tabListProvider); @@ -125,7 +127,7 @@ EquatableValue> suggestedTabEntities( } final excludedTabIds = ref.watch( - containerTabIdsProvider( + watchContainerTabIdsProvider( // ignore: provider_parameters ContainerFilterById(containerId: containerId), ).select((value) => EquatableValue(value.value)), @@ -187,7 +189,7 @@ EquatableValue> seamlessFilteredTabEntities( if (tabSearchResults == null) { if (groupTrees) { final trees = ref.watch( - tabTreesProvider.select( + watchTabTreesProvider.select( (value) => EquatableValue( value.value ?.map( diff --git a/app/lib/features/geckoview/features/browser/domain/providers.g.dart b/app/lib/features/geckoview/features/browser/domain/providers.g.dart index c4399619..e747c01f 100644 --- a/app/lib/features/geckoview/features/browser/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/browser/domain/providers.g.dart @@ -269,7 +269,7 @@ final class AvailableTabIdsProvider } } -String _$availableTabIdsHash() => r'6926ca03f97b12ebf9a46a48ed3da1b2cd559a74'; +String _$availableTabIdsHash() => r'aa166b471d45913df5166a3126abeb7c0d791412'; final class AvailableTabIdsFamily extends $Family with @@ -448,7 +448,7 @@ final class SuggestedTabEntitiesProvider } String _$suggestedTabEntitiesHash() => - r'534e78a9d1ddc5bace24dc0d9e5efee1292107c5'; + r'6fb58bf4b7377f826377c88110c8e4aca9f6d6f9'; final class SuggestedTabEntitiesFamily extends $Family with $FunctionalFamilyOverride>, String?> { @@ -552,7 +552,7 @@ final class SeamlessFilteredTabEntitiesProvider } String _$seamlessFilteredTabEntitiesHash() => - r'18b8ec876116eaa6e60fa321faba18a3bd7dd004'; + r'eb6573514f55b598fbc1a91370079b4b8372c55e'; final class SeamlessFilteredTabEntitiesFamily extends $Family with diff --git a/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart b/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart index a7c6f470..ccba7c41 100644 --- a/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart +++ b/app/lib/features/geckoview/features/browser/presentation/dialogs/tab_tree.dart @@ -48,13 +48,13 @@ class TabTreeDialog extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { final selectedTabId = ref.watch(selectedTabProvider); - final tabs = ref.watch(tabDescendantsProvider(tabId)); + final tabs = ref.watch(watchTabDescendantsProvider(tabId)); final graph = useMemoized(() { final graph = Graph()..isTree = true; if (tabs.hasValue) { - for (final MapEntry(:key, :value) in tabs.value!.entries) { + for (final MapEntry(:key, :value) in tabs.requireValue.entries) { if (value != null) { final current = Node.Id(key); final parent = Node.Id(value); @@ -84,12 +84,7 @@ class TabTreeDialog extends HookConsumerWidget { appBar: AppBar( backgroundColor: const Color(0x44000000), elevation: 0, - leading: IconButton( - onPressed: () { - context.pop(); - }, - icon: const Icon(Icons.close), - ), + leading: const CloseButton(), ), floatingActionButton: FloatingActionButton( child: const Icon(MdiIcons.target), @@ -145,6 +140,11 @@ class TabTreeDialog extends HookConsumerWidget { BrowserRoute().go(context); }, + onBeforeDelete: () { + if (graph.nodes.length <= 2) { + context.pop(); + } + }, sourceSearchQuery: null, ), ); 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 090cdfb8..53c00a12 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 @@ -32,7 +32,6 @@ import 'package:weblibre/features/geckoview/features/browser/presentation/widget import 'package:weblibre/features/geckoview/features/find_in_page/domain/entities/find_in_page_state.dart'; import 'package:weblibre/features/geckoview/features/find_in_page/presentation/controllers/find_in_page.dart'; import 'package:weblibre/features/geckoview/features/tabs/data/entities/tab_entity.dart'; -import 'package:weblibre/features/geckoview/features/tabs/domain/providers.dart'; import 'package:weblibre/features/geckoview/features/tabs/domain/repositories/tab.dart'; import 'package:weblibre/presentation/hooks/menu_controller.dart'; import 'package:weblibre/utils/ui_helper.dart' as ui_helper; @@ -266,6 +265,7 @@ class SingleTabPreview extends HookConsumerWidget { final double deleteThreshold; final void Function() onClose; + final void Function()? onBeforeDelete; const SingleTabPreview({ required this.tabId, @@ -273,6 +273,7 @@ class SingleTabPreview extends HookConsumerWidget { required this.onClose, required this.sourceSearchQuery, this.deleteThreshold = 100, + this.onBeforeDelete, super.key, }); @@ -364,6 +365,8 @@ class SingleTabPreview extends HookConsumerWidget { // ); // }, onDelete: () async { + onBeforeDelete?.call(); + await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); if (context.mounted) { @@ -495,6 +498,8 @@ class TabTreePreview extends HookConsumerWidget { await ref .read(tabRepositoryProvider.notifier) .selectTab(entity.tabId); + } else { + onClose(); } }, // onDeleteAll: (host) async { @@ -516,9 +521,9 @@ class TabTreePreview extends HookConsumerWidget { // ); // }, onDelete: () async { - final tabs = await ref.read( - tabDescendantsProvider(entity.rootId).future, - ); + final tabs = await ref + .read(tabDataRepositoryProvider.notifier) + .getTabDescendants(entity.rootId); await ref .read(tabRepositoryProvider.notifier) diff --git a/app/lib/features/geckoview/features/tabs/domain/providers.dart b/app/lib/features/geckoview/features/tabs/domain/providers.dart index 75044a45..0d33f068 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers.dart @@ -29,7 +29,7 @@ import 'package:weblibre/features/search/util/tokenized_filter.dart'; part 'providers.g.dart'; @Riverpod(keepAlive: true) -Stream> containersWithCount(Ref ref) { +Stream> watchContainersWithCount(Ref ref) { final db = ref.watch(tabDatabaseProvider); return db.definitionsDrift.containersWithCount().watch(); } @@ -40,7 +40,7 @@ AsyncValue> matchSortedContainersWithCount( String? searchText, ) { return ref.watch( - containersWithCountProvider.select((value) { + watchContainersWithCountProvider.select((value) { if (searchText.isEmpty) { return value; } @@ -57,7 +57,10 @@ AsyncValue> matchSortedContainersWithCount( } @Riverpod() -Stream> containerTabIds(Ref ref, ContainerFilter containerFilter) { +Stream> watchContainerTabIds( + Ref ref, + ContainerFilter containerFilter, +) { final db = ref.watch(tabDatabaseProvider); switch (containerFilter) { @@ -71,18 +74,20 @@ Stream> containerTabIds(Ref ref, ContainerFilter containerFilter) { @Riverpod() Future containerTabCount(Ref ref, ContainerFilter containerFilter) { return ref.watch( - containerTabIdsProvider(containerFilter).selectAsync((tabs) => tabs.length), + watchContainerTabIdsProvider( + containerFilter, + ).selectAsync((tabs) => tabs.length), ); } @Riverpod() -Stream> tabTrees(Ref ref) { +Stream> watchTabTrees(Ref ref) { final db = ref.watch(tabDatabaseProvider); return db.definitionsDrift.tabTrees().watch(); } @Riverpod() -Stream> tabDescendants(Ref ref, String tabId) { +Stream> watchTabDescendants(Ref ref, String tabId) { final db = ref.watch(tabDatabaseProvider); return db.definitionsDrift.unorderedTabDescendants(tabId: tabId).watch().map(( results, @@ -94,13 +99,13 @@ Stream> tabDescendants(Ref ref, String tabId) { } @Riverpod() -Stream> containerTabsData(Ref ref, String? containerId) { +Stream> watchContainerTabsData(Ref ref, String? containerId) { final db = ref.watch(tabDatabaseProvider); return db.containerDao.getContainerTabsData(containerId).watch(); } @Riverpod() -Stream containerData(Ref ref, String containerId) { +Stream watchContainerData(Ref ref, String containerId) { final db = ref.watch(tabDatabaseProvider); return db.containerDao.getContainerData(containerId).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 98ba51b5..6be6956a 100644 --- a/app/lib/features/geckoview/features/tabs/domain/providers.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/providers.g.dart @@ -9,10 +9,10 @@ part of 'providers.dart'; // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint, type=warning -@ProviderFor(containersWithCount) -const containersWithCountProvider = ContainersWithCountProvider._(); +@ProviderFor(watchContainersWithCount) +const watchContainersWithCountProvider = WatchContainersWithCountProvider._(); -final class ContainersWithCountProvider +final class WatchContainersWithCountProvider extends $FunctionalProvider< AsyncValue>, @@ -22,19 +22,19 @@ final class ContainersWithCountProvider with $FutureModifier>, $StreamProvider> { - const ContainersWithCountProvider._() + const WatchContainersWithCountProvider._() : super( from: null, argument: null, retry: null, - name: r'containersWithCountProvider', + name: r'watchContainersWithCountProvider', isAutoDispose: false, dependencies: null, $allTransitiveDependencies: null, ); @override - String debugGetCreateSourceHash() => _$containersWithCountHash(); + String debugGetCreateSourceHash() => _$watchContainersWithCountHash(); @$internal @override @@ -44,12 +44,12 @@ final class ContainersWithCountProvider @override Stream> create(Ref ref) { - return containersWithCount(ref); + return watchContainersWithCount(ref); } } -String _$containersWithCountHash() => - r'757bb0102afedc07ef0f80a420b4c87cbdbed3e1'; +String _$watchContainersWithCountHash() => + r'50d8e9b39cb589b0b5f50d79cbe20b8d10d7a504'; @ProviderFor(matchSortedContainersWithCount) const matchSortedContainersWithCountProvider = @@ -118,7 +118,7 @@ final class MatchSortedContainersWithCountProvider } String _$matchSortedContainersWithCountHash() => - r'bc2077602c3c1d86c5b916e4ad920053310993e4'; + r'e66ca1d96a735155f582975ae05a90503e615882'; final class MatchSortedContainersWithCountFamily extends $Family with @@ -145,10 +145,10 @@ final class MatchSortedContainersWithCountFamily extends $Family String toString() => r'matchSortedContainersWithCountProvider'; } -@ProviderFor(containerTabIds) -const containerTabIdsProvider = ContainerTabIdsFamily._(); +@ProviderFor(watchContainerTabIds) +const watchContainerTabIdsProvider = WatchContainerTabIdsFamily._(); -final class ContainerTabIdsProvider +final class WatchContainerTabIdsProvider extends $FunctionalProvider< AsyncValue>, @@ -156,23 +156,23 @@ final class ContainerTabIdsProvider Stream> > with $FutureModifier>, $StreamProvider> { - const ContainerTabIdsProvider._({ - required ContainerTabIdsFamily super.from, + const WatchContainerTabIdsProvider._({ + required WatchContainerTabIdsFamily super.from, required ContainerFilter super.argument, }) : super( retry: null, - name: r'containerTabIdsProvider', + name: r'watchContainerTabIdsProvider', isAutoDispose: true, dependencies: null, $allTransitiveDependencies: null, ); @override - String debugGetCreateSourceHash() => _$containerTabIdsHash(); + String debugGetCreateSourceHash() => _$watchContainerTabIdsHash(); @override String toString() { - return r'containerTabIdsProvider' + return r'watchContainerTabIdsProvider' '' '($argument)'; } @@ -186,12 +186,12 @@ final class ContainerTabIdsProvider @override Stream> create(Ref ref) { final argument = this.argument as ContainerFilter; - return containerTabIds(ref, argument); + return watchContainerTabIds(ref, argument); } @override bool operator ==(Object other) { - return other is ContainerTabIdsProvider && other.argument == argument; + return other is WatchContainerTabIdsProvider && other.argument == argument; } @override @@ -200,24 +200,25 @@ final class ContainerTabIdsProvider } } -String _$containerTabIdsHash() => r'61716a2ae74ffa590c1498d259382e69e24ad7f1'; +String _$watchContainerTabIdsHash() => + r'25f73fe16fad7ec0121b2bee99ecbd8b6bf47791'; -final class ContainerTabIdsFamily extends $Family +final class WatchContainerTabIdsFamily extends $Family with $FunctionalFamilyOverride>, ContainerFilter> { - const ContainerTabIdsFamily._() + const WatchContainerTabIdsFamily._() : super( retry: null, - name: r'containerTabIdsProvider', + name: r'watchContainerTabIdsProvider', dependencies: null, $allTransitiveDependencies: null, isAutoDispose: true, ); - ContainerTabIdsProvider call(ContainerFilter containerFilter) => - ContainerTabIdsProvider._(argument: containerFilter, from: this); + WatchContainerTabIdsProvider call(ContainerFilter containerFilter) => + WatchContainerTabIdsProvider._(argument: containerFilter, from: this); @override - String toString() => r'containerTabIdsProvider'; + String toString() => r'watchContainerTabIdsProvider'; } @ProviderFor(containerTabCount) @@ -269,7 +270,7 @@ final class ContainerTabCountProvider } } -String _$containerTabCountHash() => r'586e83429b527b546d43232a58453635ab860d69'; +String _$containerTabCountHash() => r'df4008a9c589936c8a0699b082ab23087ae9b85f'; final class ContainerTabCountFamily extends $Family with $FunctionalFamilyOverride, ContainerFilter> { @@ -289,10 +290,10 @@ final class ContainerTabCountFamily extends $Family String toString() => r'containerTabCountProvider'; } -@ProviderFor(tabTrees) -const tabTreesProvider = TabTreesProvider._(); +@ProviderFor(watchTabTrees) +const watchTabTreesProvider = WatchTabTreesProvider._(); -final class TabTreesProvider +final class WatchTabTreesProvider extends $FunctionalProvider< AsyncValue>, @@ -302,19 +303,19 @@ final class TabTreesProvider with $FutureModifier>, $StreamProvider> { - const TabTreesProvider._() + const WatchTabTreesProvider._() : super( from: null, argument: null, retry: null, - name: r'tabTreesProvider', + name: r'watchTabTreesProvider', isAutoDispose: true, dependencies: null, $allTransitiveDependencies: null, ); @override - String debugGetCreateSourceHash() => _$tabTreesHash(); + String debugGetCreateSourceHash() => _$watchTabTreesHash(); @$internal @override @@ -324,16 +325,16 @@ final class TabTreesProvider @override Stream> create(Ref ref) { - return tabTrees(ref); + return watchTabTrees(ref); } } -String _$tabTreesHash() => r'd9256293a97d5451c2ab881a30ae99c9e2178999'; +String _$watchTabTreesHash() => r'a2be591acb6818ea8675a12d90e6c4684a0448a8'; -@ProviderFor(tabDescendants) -const tabDescendantsProvider = TabDescendantsFamily._(); +@ProviderFor(watchTabDescendants) +const watchTabDescendantsProvider = WatchTabDescendantsFamily._(); -final class TabDescendantsProvider +final class WatchTabDescendantsProvider extends $FunctionalProvider< AsyncValue>, @@ -343,23 +344,23 @@ final class TabDescendantsProvider with $FutureModifier>, $StreamProvider> { - const TabDescendantsProvider._({ - required TabDescendantsFamily super.from, + const WatchTabDescendantsProvider._({ + required WatchTabDescendantsFamily super.from, required String super.argument, }) : super( retry: null, - name: r'tabDescendantsProvider', + name: r'watchTabDescendantsProvider', isAutoDispose: true, dependencies: null, $allTransitiveDependencies: null, ); @override - String debugGetCreateSourceHash() => _$tabDescendantsHash(); + String debugGetCreateSourceHash() => _$watchTabDescendantsHash(); @override String toString() { - return r'tabDescendantsProvider' + return r'watchTabDescendantsProvider' '' '($argument)'; } @@ -373,12 +374,12 @@ final class TabDescendantsProvider @override Stream> create(Ref ref) { final argument = this.argument as String; - return tabDescendants(ref, argument); + return watchTabDescendants(ref, argument); } @override bool operator ==(Object other) { - return other is TabDescendantsProvider && other.argument == argument; + return other is WatchTabDescendantsProvider && other.argument == argument; } @override @@ -387,30 +388,31 @@ final class TabDescendantsProvider } } -String _$tabDescendantsHash() => r'c2c3fe18e9b47c64df9ae6c1cfde683f3231d53c'; +String _$watchTabDescendantsHash() => + r'8b20353888a851191d835784e24d7d4a6e898b72'; -final class TabDescendantsFamily extends $Family +final class WatchTabDescendantsFamily extends $Family with $FunctionalFamilyOverride>, String> { - const TabDescendantsFamily._() + const WatchTabDescendantsFamily._() : super( retry: null, - name: r'tabDescendantsProvider', + name: r'watchTabDescendantsProvider', dependencies: null, $allTransitiveDependencies: null, isAutoDispose: true, ); - TabDescendantsProvider call(String tabId) => - TabDescendantsProvider._(argument: tabId, from: this); + WatchTabDescendantsProvider call(String tabId) => + WatchTabDescendantsProvider._(argument: tabId, from: this); @override - String toString() => r'tabDescendantsProvider'; + String toString() => r'watchTabDescendantsProvider'; } -@ProviderFor(containerTabsData) -const containerTabsDataProvider = ContainerTabsDataFamily._(); +@ProviderFor(watchContainerTabsData) +const watchContainerTabsDataProvider = WatchContainerTabsDataFamily._(); -final class ContainerTabsDataProvider +final class WatchContainerTabsDataProvider extends $FunctionalProvider< AsyncValue>, @@ -418,23 +420,23 @@ final class ContainerTabsDataProvider Stream> > with $FutureModifier>, $StreamProvider> { - const ContainerTabsDataProvider._({ - required ContainerTabsDataFamily super.from, + const WatchContainerTabsDataProvider._({ + required WatchContainerTabsDataFamily super.from, required String? super.argument, }) : super( retry: null, - name: r'containerTabsDataProvider', + name: r'watchContainerTabsDataProvider', isAutoDispose: true, dependencies: null, $allTransitiveDependencies: null, ); @override - String debugGetCreateSourceHash() => _$containerTabsDataHash(); + String debugGetCreateSourceHash() => _$watchContainerTabsDataHash(); @override String toString() { - return r'containerTabsDataProvider' + return r'watchContainerTabsDataProvider' '' '($argument)'; } @@ -448,12 +450,13 @@ final class ContainerTabsDataProvider @override Stream> create(Ref ref) { final argument = this.argument as String?; - return containerTabsData(ref, argument); + return watchContainerTabsData(ref, argument); } @override bool operator ==(Object other) { - return other is ContainerTabsDataProvider && other.argument == argument; + return other is WatchContainerTabsDataProvider && + other.argument == argument; } @override @@ -462,30 +465,31 @@ final class ContainerTabsDataProvider } } -String _$containerTabsDataHash() => r'2961c89fc9e16c8e6005342356ecf677fb2ff63c'; +String _$watchContainerTabsDataHash() => + r'4edbb3029f4ffb6181396d81d8076e0395ec2481'; -final class ContainerTabsDataFamily extends $Family +final class WatchContainerTabsDataFamily extends $Family with $FunctionalFamilyOverride>, String?> { - const ContainerTabsDataFamily._() + const WatchContainerTabsDataFamily._() : super( retry: null, - name: r'containerTabsDataProvider', + name: r'watchContainerTabsDataProvider', dependencies: null, $allTransitiveDependencies: null, isAutoDispose: true, ); - ContainerTabsDataProvider call(String? containerId) => - ContainerTabsDataProvider._(argument: containerId, from: this); + WatchContainerTabsDataProvider call(String? containerId) => + WatchContainerTabsDataProvider._(argument: containerId, from: this); @override - String toString() => r'containerTabsDataProvider'; + String toString() => r'watchContainerTabsDataProvider'; } -@ProviderFor(containerData) -const containerDataProvider = ContainerDataFamily._(); +@ProviderFor(watchContainerData) +const watchContainerDataProvider = WatchContainerDataFamily._(); -final class ContainerDataProvider +final class WatchContainerDataProvider extends $FunctionalProvider< AsyncValue, @@ -493,23 +497,23 @@ final class ContainerDataProvider Stream > with $FutureModifier, $StreamProvider { - const ContainerDataProvider._({ - required ContainerDataFamily super.from, + const WatchContainerDataProvider._({ + required WatchContainerDataFamily super.from, required String super.argument, }) : super( retry: null, - name: r'containerDataProvider', + name: r'watchContainerDataProvider', isAutoDispose: true, dependencies: null, $allTransitiveDependencies: null, ); @override - String debugGetCreateSourceHash() => _$containerDataHash(); + String debugGetCreateSourceHash() => _$watchContainerDataHash(); @override String toString() { - return r'containerDataProvider' + return r'watchContainerDataProvider' '' '($argument)'; } @@ -523,12 +527,12 @@ final class ContainerDataProvider @override Stream create(Ref ref) { final argument = this.argument as String; - return containerData(ref, argument); + return watchContainerData(ref, argument); } @override bool operator ==(Object other) { - return other is ContainerDataProvider && other.argument == argument; + return other is WatchContainerDataProvider && other.argument == argument; } @override @@ -537,24 +541,25 @@ final class ContainerDataProvider } } -String _$containerDataHash() => r'6adbec128876069189954832af35109b0779148c'; +String _$watchContainerDataHash() => + r'abd0e964a6444ed9be5da649a0f6a77bbbb54042'; -final class ContainerDataFamily extends $Family +final class WatchContainerDataFamily extends $Family with $FunctionalFamilyOverride, String> { - const ContainerDataFamily._() + const WatchContainerDataFamily._() : super( retry: null, - name: r'containerDataProvider', + name: r'watchContainerDataProvider', dependencies: null, $allTransitiveDependencies: null, isAutoDispose: true, ); - ContainerDataProvider call(String containerId) => - ContainerDataProvider._(argument: containerId, from: this); + WatchContainerDataProvider call(String containerId) => + WatchContainerDataProvider._(argument: containerId, from: this); @override - String toString() => r'containerDataProvider'; + String toString() => r'watchContainerDataProvider'; } @ProviderFor(watchContainerTabId) @@ -626,3 +631,45 @@ final class WatchContainerTabIdFamily extends $Family @override String toString() => r'watchContainerTabIdProvider'; } + +@ProviderFor(watchAllAssignedSites) +const watchAllAssignedSitesProvider = WatchAllAssignedSitesProvider._(); + +final class WatchAllAssignedSitesProvider + extends + $FunctionalProvider< + AsyncValue>, + List, + Stream> + > + with + $FutureModifier>, + $StreamProvider> { + const WatchAllAssignedSitesProvider._() + : super( + from: null, + argument: null, + retry: null, + name: r'watchAllAssignedSitesProvider', + isAutoDispose: true, + dependencies: null, + $allTransitiveDependencies: null, + ); + + @override + String debugGetCreateSourceHash() => _$watchAllAssignedSitesHash(); + + @$internal + @override + $StreamProviderElement> $createElement( + $ProviderPointer pointer, + ) => $StreamProviderElement(pointer); + + @override + Stream> create(Ref ref) { + return watchAllAssignedSites(ref); + } +} + +String _$watchAllAssignedSitesHash() => + r'd755451be0ad7e03db36ba39c64f6f0b5c1d9ba3'; 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 d43aca01..2192eea9 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 @@ -101,7 +101,7 @@ class SelectedContainer extends _$SelectedContainer { String? build() { ref.listen( fireImmediately: true, - containersWithCountProvider, + watchContainersWithCountProvider, (previous, next) { if (stateOrNull != null && next.value != null) { if (!next.value!.any((container) => container.id == state)) { 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 a5425339..14f5ad90 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 @@ -41,7 +41,7 @@ final class SelectedContainerProvider } } -String _$selectedContainerHash() => r'4754aa8ad9b43b022821a41771eb5af5e33b1cb6'; +String _$selectedContainerHash() => r'fd41c7d7ff0cfaff2829fd93e2afd41d883b8317'; abstract class _$SelectedContainer extends $Notifier { String? build(); diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.dart index a8cc248d..0d051bf3 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.dart @@ -299,7 +299,7 @@ class GeckoInferenceRepository extends _$GeckoInferenceRepository { @Riverpod() Future containerTopic(Ref ref, String containerId) async { final titles = await ref.watch( - containerTabsDataProvider(containerId).selectAsync( + watchContainerTabsDataProvider(containerId).selectAsync( (tabData) => EquatableValue(tabData.map((tab) => tab.title).nonNulls.toSet()), ), @@ -360,7 +360,7 @@ Future topicSuggestion( @Riverpod() Future?> suggestClusters(Ref ref) async { final unassignedTitles = await ref.watch( - containerTabsDataProvider(null).selectAsync( + watchContainerTabsDataProvider(null).selectAsync( (tabData) => EquatableValue( Map.fromEntries( tabData @@ -389,12 +389,14 @@ Future?> containerTabSuggestions( return null; } - final container = await ref.watch(containerDataProvider(containerId).future); + final container = await ref.watch( + watchContainerDataProvider(containerId).future, + ); if (!ref.mounted) return null; final assignedTitles = await ref.watch( - containerTabsDataProvider(containerId).selectAsync( + watchContainerTabsDataProvider(containerId).selectAsync( (tabData) => EquatableValue( tabData .where((tab) => tab.title.isNotEmpty) @@ -407,7 +409,7 @@ Future?> containerTabSuggestions( if (!ref.mounted) return null; final unassignedTitles = await ref.watch( - containerTabsDataProvider(null).selectAsync( + watchContainerTabsDataProvider(null).selectAsync( (tabData) => EquatableValue( tabData .where((tab) => tab.title.isNotEmpty) diff --git a/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart b/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart index cc9fc25f..09016f3c 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/gecko_inference.g.dart @@ -112,7 +112,7 @@ final class ContainerTopicProvider } } -String _$containerTopicHash() => r'c6e4cc316d3f05d0316909ec0bb58a95ad2fd57c'; +String _$containerTopicHash() => r'2d04d50890c4ab0ddb70f3c1a2f45fd9ca56412d'; final class ContainerTopicFamily extends $Family with $FunctionalFamilyOverride, String> { @@ -331,7 +331,7 @@ final class SuggestClustersProvider } } -String _$suggestClustersHash() => r'694b401ddd6ce68084f79883e67fda4b44607ef0'; +String _$suggestClustersHash() => r'3fa169a2696954589078c7567b6245c708303232'; @ProviderFor(containerTabSuggestions) const containerTabSuggestionsProvider = ContainerTabSuggestionsFamily._(); @@ -390,7 +390,7 @@ final class ContainerTabSuggestionsProvider } String _$containerTabSuggestionsHash() => - r'1b681736215826886241aea834f99ebfb9761197'; + r'958c7432aa5c2a2828fcccd0127e0110d0a008cf'; final class ContainerTabSuggestionsFamily extends $Family with $FunctionalFamilyOverride?>, String?> { 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 f93c40c6..c9811e32 100644 --- a/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart +++ b/app/lib/features/geckoview/features/tabs/domain/repositories/tab.dart @@ -30,8 +30,9 @@ part 'tab.g.dart'; class TabDataRepository extends _$TabDataRepository { Future assignContainer( String tabId, - ContainerData targetContainer, - ) async { + ContainerData targetContainer, { + bool closeOldTab = true, + }) async { final currentContainerId = await getContainerTabId(tabId); final currentContainerData = await currentContainerId.mapNotNull( @@ -51,7 +52,9 @@ class TabDataRepository extends _$TabDataRepository { .read(tabRepositoryProvider.notifier) .duplicateTab(selectTabId: tabId, containerId: targetContainer.id); - await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); + if (closeOldTab) { + await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); + } } } @@ -110,6 +113,18 @@ class TabDataRepository extends _$TabDataRepository { .getSingleOrNull(); } + Future> getTabDescendants(String tabId) async { + final results = await ref + .read(tabDatabaseProvider) + .definitionsDrift + .unorderedTabDescendants(tabId: tabId) + .get(); + + return Map.fromEntries( + results.map((pair) => MapEntry(pair.id, pair.parentId)), + ); + } + @override void build() {} } 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 05635da3..76e7e9d5 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 @@ -41,7 +41,7 @@ final class TabDataRepositoryProvider } } -String _$tabDataRepositoryHash() => r'cc25e0e23a0c0cff5670e59bb0f20496e21a2824'; +String _$tabDataRepositoryHash() => r'8f8a1dff5e5be5cbe59562c86b2e57c229b97f8a'; abstract class _$TabDataRepository extends $Notifier { void build();