fix tree view issues and improve providers

This commit is contained in:
Fabian Freund
2025-11-09 07:23:23 +01:00
parent 0bc49b155f
commit da232bf8aa
12 changed files with 203 additions and 127 deletions
@@ -85,7 +85,9 @@ EquatableValue<List<String>> availableTabIds(
ContainerFilter containerFilter, ContainerFilter containerFilter,
) { ) {
final containerTabs = ref.watch( final containerTabs = ref.watch(
containerTabIdsProvider(containerFilter).select((value) => value.value), watchContainerTabIdsProvider(
containerFilter,
).select((value) => value.value),
); );
final tabList = ref.watch(tabListProvider); final tabList = ref.watch(tabListProvider);
@@ -125,7 +127,7 @@ EquatableValue<List<TabEntity>> suggestedTabEntities(
} }
final excludedTabIds = ref.watch( final excludedTabIds = ref.watch(
containerTabIdsProvider( watchContainerTabIdsProvider(
// ignore: provider_parameters // ignore: provider_parameters
ContainerFilterById(containerId: containerId), ContainerFilterById(containerId: containerId),
).select((value) => EquatableValue(value.value)), ).select((value) => EquatableValue(value.value)),
@@ -187,7 +189,7 @@ EquatableValue<List<TabEntity>> seamlessFilteredTabEntities(
if (tabSearchResults == null) { if (tabSearchResults == null) {
if (groupTrees) { if (groupTrees) {
final trees = ref.watch( final trees = ref.watch(
tabTreesProvider.select( watchTabTreesProvider.select(
(value) => EquatableValue( (value) => EquatableValue(
value.value value.value
?.map( ?.map(
@@ -269,7 +269,7 @@ final class AvailableTabIdsProvider
} }
} }
String _$availableTabIdsHash() => r'6926ca03f97b12ebf9a46a48ed3da1b2cd559a74'; String _$availableTabIdsHash() => r'aa166b471d45913df5166a3126abeb7c0d791412';
final class AvailableTabIdsFamily extends $Family final class AvailableTabIdsFamily extends $Family
with with
@@ -448,7 +448,7 @@ final class SuggestedTabEntitiesProvider
} }
String _$suggestedTabEntitiesHash() => String _$suggestedTabEntitiesHash() =>
r'534e78a9d1ddc5bace24dc0d9e5efee1292107c5'; r'6fb58bf4b7377f826377c88110c8e4aca9f6d6f9';
final class SuggestedTabEntitiesFamily extends $Family final class SuggestedTabEntitiesFamily extends $Family
with $FunctionalFamilyOverride<EquatableValue<List<TabEntity>>, String?> { with $FunctionalFamilyOverride<EquatableValue<List<TabEntity>>, String?> {
@@ -552,7 +552,7 @@ final class SeamlessFilteredTabEntitiesProvider
} }
String _$seamlessFilteredTabEntitiesHash() => String _$seamlessFilteredTabEntitiesHash() =>
r'18b8ec876116eaa6e60fa321faba18a3bd7dd004'; r'eb6573514f55b598fbc1a91370079b4b8372c55e';
final class SeamlessFilteredTabEntitiesFamily extends $Family final class SeamlessFilteredTabEntitiesFamily extends $Family
with with
@@ -48,13 +48,13 @@ class TabTreeDialog extends HookConsumerWidget {
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final selectedTabId = ref.watch(selectedTabProvider); final selectedTabId = ref.watch(selectedTabProvider);
final tabs = ref.watch(tabDescendantsProvider(tabId)); final tabs = ref.watch(watchTabDescendantsProvider(tabId));
final graph = useMemoized(() { final graph = useMemoized(() {
final graph = Graph()..isTree = true; final graph = Graph()..isTree = true;
if (tabs.hasValue) { if (tabs.hasValue) {
for (final MapEntry(:key, :value) in tabs.value!.entries) { for (final MapEntry(:key, :value) in tabs.requireValue.entries) {
if (value != null) { if (value != null) {
final current = Node.Id(key); final current = Node.Id(key);
final parent = Node.Id(value); final parent = Node.Id(value);
@@ -84,12 +84,7 @@ class TabTreeDialog extends HookConsumerWidget {
appBar: AppBar( appBar: AppBar(
backgroundColor: const Color(0x44000000), backgroundColor: const Color(0x44000000),
elevation: 0, elevation: 0,
leading: IconButton( leading: const CloseButton(),
onPressed: () {
context.pop();
},
icon: const Icon(Icons.close),
),
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
child: const Icon(MdiIcons.target), child: const Icon(MdiIcons.target),
@@ -145,6 +140,11 @@ class TabTreeDialog extends HookConsumerWidget {
BrowserRoute().go(context); BrowserRoute().go(context);
}, },
onBeforeDelete: () {
if (graph.nodes.length <= 2) {
context.pop();
}
},
sourceSearchQuery: null, sourceSearchQuery: null,
), ),
); );
@@ -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/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/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/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/features/geckoview/features/tabs/domain/repositories/tab.dart';
import 'package:weblibre/presentation/hooks/menu_controller.dart'; import 'package:weblibre/presentation/hooks/menu_controller.dart';
import 'package:weblibre/utils/ui_helper.dart' as ui_helper; import 'package:weblibre/utils/ui_helper.dart' as ui_helper;
@@ -266,6 +265,7 @@ class SingleTabPreview extends HookConsumerWidget {
final double deleteThreshold; final double deleteThreshold;
final void Function() onClose; final void Function() onClose;
final void Function()? onBeforeDelete;
const SingleTabPreview({ const SingleTabPreview({
required this.tabId, required this.tabId,
@@ -273,6 +273,7 @@ class SingleTabPreview extends HookConsumerWidget {
required this.onClose, required this.onClose,
required this.sourceSearchQuery, required this.sourceSearchQuery,
this.deleteThreshold = 100, this.deleteThreshold = 100,
this.onBeforeDelete,
super.key, super.key,
}); });
@@ -364,6 +365,8 @@ class SingleTabPreview extends HookConsumerWidget {
// ); // );
// }, // },
onDelete: () async { onDelete: () async {
onBeforeDelete?.call();
await ref.read(tabRepositoryProvider.notifier).closeTab(tabId); await ref.read(tabRepositoryProvider.notifier).closeTab(tabId);
if (context.mounted) { if (context.mounted) {
@@ -495,6 +498,8 @@ class TabTreePreview extends HookConsumerWidget {
await ref await ref
.read(tabRepositoryProvider.notifier) .read(tabRepositoryProvider.notifier)
.selectTab(entity.tabId); .selectTab(entity.tabId);
} else {
onClose();
} }
}, },
// onDeleteAll: (host) async { // onDeleteAll: (host) async {
@@ -516,9 +521,9 @@ class TabTreePreview extends HookConsumerWidget {
// ); // );
// }, // },
onDelete: () async { onDelete: () async {
final tabs = await ref.read( final tabs = await ref
tabDescendantsProvider(entity.rootId).future, .read(tabDataRepositoryProvider.notifier)
); .getTabDescendants(entity.rootId);
await ref await ref
.read(tabRepositoryProvider.notifier) .read(tabRepositoryProvider.notifier)
@@ -29,7 +29,7 @@ import 'package:weblibre/features/search/util/tokenized_filter.dart';
part 'providers.g.dart'; part 'providers.g.dart';
@Riverpod(keepAlive: true) @Riverpod(keepAlive: true)
Stream<List<ContainerDataWithCount>> containersWithCount(Ref ref) { Stream<List<ContainerDataWithCount>> watchContainersWithCount(Ref ref) {
final db = ref.watch(tabDatabaseProvider); final db = ref.watch(tabDatabaseProvider);
return db.definitionsDrift.containersWithCount().watch(); return db.definitionsDrift.containersWithCount().watch();
} }
@@ -40,7 +40,7 @@ AsyncValue<List<ContainerDataWithCount>> matchSortedContainersWithCount(
String? searchText, String? searchText,
) { ) {
return ref.watch( return ref.watch(
containersWithCountProvider.select((value) { watchContainersWithCountProvider.select((value) {
if (searchText.isEmpty) { if (searchText.isEmpty) {
return value; return value;
} }
@@ -57,7 +57,10 @@ AsyncValue<List<ContainerDataWithCount>> matchSortedContainersWithCount(
} }
@Riverpod() @Riverpod()
Stream<List<String>> containerTabIds(Ref ref, ContainerFilter containerFilter) { Stream<List<String>> watchContainerTabIds(
Ref ref,
ContainerFilter containerFilter,
) {
final db = ref.watch(tabDatabaseProvider); final db = ref.watch(tabDatabaseProvider);
switch (containerFilter) { switch (containerFilter) {
@@ -71,18 +74,20 @@ Stream<List<String>> containerTabIds(Ref ref, ContainerFilter containerFilter) {
@Riverpod() @Riverpod()
Future<int> containerTabCount(Ref ref, ContainerFilter containerFilter) { Future<int> containerTabCount(Ref ref, ContainerFilter containerFilter) {
return ref.watch( return ref.watch(
containerTabIdsProvider(containerFilter).selectAsync((tabs) => tabs.length), watchContainerTabIdsProvider(
containerFilter,
).selectAsync((tabs) => tabs.length),
); );
} }
@Riverpod() @Riverpod()
Stream<List<TabTreesResult>> tabTrees(Ref ref) { Stream<List<TabTreesResult>> watchTabTrees(Ref ref) {
final db = ref.watch(tabDatabaseProvider); final db = ref.watch(tabDatabaseProvider);
return db.definitionsDrift.tabTrees().watch(); return db.definitionsDrift.tabTrees().watch();
} }
@Riverpod() @Riverpod()
Stream<Map<String, String?>> tabDescendants(Ref ref, String tabId) { Stream<Map<String, String?>> watchTabDescendants(Ref ref, String tabId) {
final db = ref.watch(tabDatabaseProvider); final db = ref.watch(tabDatabaseProvider);
return db.definitionsDrift.unorderedTabDescendants(tabId: tabId).watch().map(( return db.definitionsDrift.unorderedTabDescendants(tabId: tabId).watch().map((
results, results,
@@ -94,13 +99,13 @@ Stream<Map<String, String?>> tabDescendants(Ref ref, String tabId) {
} }
@Riverpod() @Riverpod()
Stream<List<TabData>> containerTabsData(Ref ref, String? containerId) { Stream<List<TabData>> watchContainerTabsData(Ref ref, String? containerId) {
final db = ref.watch(tabDatabaseProvider); final db = ref.watch(tabDatabaseProvider);
return db.containerDao.getContainerTabsData(containerId).watch(); return db.containerDao.getContainerTabsData(containerId).watch();
} }
@Riverpod() @Riverpod()
Stream<ContainerData?> containerData(Ref ref, String containerId) { Stream<ContainerData?> watchContainerData(Ref ref, String containerId) {
final db = ref.watch(tabDatabaseProvider); final db = ref.watch(tabDatabaseProvider);
return db.containerDao.getContainerData(containerId).watchSingleOrNull(); return db.containerDao.getContainerData(containerId).watchSingleOrNull();
} }
@@ -9,10 +9,10 @@ part of 'providers.dart';
// GENERATED CODE - DO NOT MODIFY BY HAND // GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning // ignore_for_file: type=lint, type=warning
@ProviderFor(containersWithCount) @ProviderFor(watchContainersWithCount)
const containersWithCountProvider = ContainersWithCountProvider._(); const watchContainersWithCountProvider = WatchContainersWithCountProvider._();
final class ContainersWithCountProvider final class WatchContainersWithCountProvider
extends extends
$FunctionalProvider< $FunctionalProvider<
AsyncValue<List<ContainerDataWithCount>>, AsyncValue<List<ContainerDataWithCount>>,
@@ -22,19 +22,19 @@ final class ContainersWithCountProvider
with with
$FutureModifier<List<ContainerDataWithCount>>, $FutureModifier<List<ContainerDataWithCount>>,
$StreamProvider<List<ContainerDataWithCount>> { $StreamProvider<List<ContainerDataWithCount>> {
const ContainersWithCountProvider._() const WatchContainersWithCountProvider._()
: super( : super(
from: null, from: null,
argument: null, argument: null,
retry: null, retry: null,
name: r'containersWithCountProvider', name: r'watchContainersWithCountProvider',
isAutoDispose: false, isAutoDispose: false,
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
); );
@override @override
String debugGetCreateSourceHash() => _$containersWithCountHash(); String debugGetCreateSourceHash() => _$watchContainersWithCountHash();
@$internal @$internal
@override @override
@@ -44,12 +44,12 @@ final class ContainersWithCountProvider
@override @override
Stream<List<ContainerDataWithCount>> create(Ref ref) { Stream<List<ContainerDataWithCount>> create(Ref ref) {
return containersWithCount(ref); return watchContainersWithCount(ref);
} }
} }
String _$containersWithCountHash() => String _$watchContainersWithCountHash() =>
r'757bb0102afedc07ef0f80a420b4c87cbdbed3e1'; r'50d8e9b39cb589b0b5f50d79cbe20b8d10d7a504';
@ProviderFor(matchSortedContainersWithCount) @ProviderFor(matchSortedContainersWithCount)
const matchSortedContainersWithCountProvider = const matchSortedContainersWithCountProvider =
@@ -118,7 +118,7 @@ final class MatchSortedContainersWithCountProvider
} }
String _$matchSortedContainersWithCountHash() => String _$matchSortedContainersWithCountHash() =>
r'bc2077602c3c1d86c5b916e4ad920053310993e4'; r'e66ca1d96a735155f582975ae05a90503e615882';
final class MatchSortedContainersWithCountFamily extends $Family final class MatchSortedContainersWithCountFamily extends $Family
with with
@@ -145,10 +145,10 @@ final class MatchSortedContainersWithCountFamily extends $Family
String toString() => r'matchSortedContainersWithCountProvider'; String toString() => r'matchSortedContainersWithCountProvider';
} }
@ProviderFor(containerTabIds) @ProviderFor(watchContainerTabIds)
const containerTabIdsProvider = ContainerTabIdsFamily._(); const watchContainerTabIdsProvider = WatchContainerTabIdsFamily._();
final class ContainerTabIdsProvider final class WatchContainerTabIdsProvider
extends extends
$FunctionalProvider< $FunctionalProvider<
AsyncValue<List<String>>, AsyncValue<List<String>>,
@@ -156,23 +156,23 @@ final class ContainerTabIdsProvider
Stream<List<String>> Stream<List<String>>
> >
with $FutureModifier<List<String>>, $StreamProvider<List<String>> { with $FutureModifier<List<String>>, $StreamProvider<List<String>> {
const ContainerTabIdsProvider._({ const WatchContainerTabIdsProvider._({
required ContainerTabIdsFamily super.from, required WatchContainerTabIdsFamily super.from,
required ContainerFilter super.argument, required ContainerFilter super.argument,
}) : super( }) : super(
retry: null, retry: null,
name: r'containerTabIdsProvider', name: r'watchContainerTabIdsProvider',
isAutoDispose: true, isAutoDispose: true,
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
); );
@override @override
String debugGetCreateSourceHash() => _$containerTabIdsHash(); String debugGetCreateSourceHash() => _$watchContainerTabIdsHash();
@override @override
String toString() { String toString() {
return r'containerTabIdsProvider' return r'watchContainerTabIdsProvider'
'' ''
'($argument)'; '($argument)';
} }
@@ -186,12 +186,12 @@ final class ContainerTabIdsProvider
@override @override
Stream<List<String>> create(Ref ref) { Stream<List<String>> create(Ref ref) {
final argument = this.argument as ContainerFilter; final argument = this.argument as ContainerFilter;
return containerTabIds(ref, argument); return watchContainerTabIds(ref, argument);
} }
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return other is ContainerTabIdsProvider && other.argument == argument; return other is WatchContainerTabIdsProvider && other.argument == argument;
} }
@override @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<Stream<List<String>>, ContainerFilter> { with $FunctionalFamilyOverride<Stream<List<String>>, ContainerFilter> {
const ContainerTabIdsFamily._() const WatchContainerTabIdsFamily._()
: super( : super(
retry: null, retry: null,
name: r'containerTabIdsProvider', name: r'watchContainerTabIdsProvider',
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
isAutoDispose: true, isAutoDispose: true,
); );
ContainerTabIdsProvider call(ContainerFilter containerFilter) => WatchContainerTabIdsProvider call(ContainerFilter containerFilter) =>
ContainerTabIdsProvider._(argument: containerFilter, from: this); WatchContainerTabIdsProvider._(argument: containerFilter, from: this);
@override @override
String toString() => r'containerTabIdsProvider'; String toString() => r'watchContainerTabIdsProvider';
} }
@ProviderFor(containerTabCount) @ProviderFor(containerTabCount)
@@ -269,7 +270,7 @@ final class ContainerTabCountProvider
} }
} }
String _$containerTabCountHash() => r'586e83429b527b546d43232a58453635ab860d69'; String _$containerTabCountHash() => r'df4008a9c589936c8a0699b082ab23087ae9b85f';
final class ContainerTabCountFamily extends $Family final class ContainerTabCountFamily extends $Family
with $FunctionalFamilyOverride<FutureOr<int>, ContainerFilter> { with $FunctionalFamilyOverride<FutureOr<int>, ContainerFilter> {
@@ -289,10 +290,10 @@ final class ContainerTabCountFamily extends $Family
String toString() => r'containerTabCountProvider'; String toString() => r'containerTabCountProvider';
} }
@ProviderFor(tabTrees) @ProviderFor(watchTabTrees)
const tabTreesProvider = TabTreesProvider._(); const watchTabTreesProvider = WatchTabTreesProvider._();
final class TabTreesProvider final class WatchTabTreesProvider
extends extends
$FunctionalProvider< $FunctionalProvider<
AsyncValue<List<TabTreesResult>>, AsyncValue<List<TabTreesResult>>,
@@ -302,19 +303,19 @@ final class TabTreesProvider
with with
$FutureModifier<List<TabTreesResult>>, $FutureModifier<List<TabTreesResult>>,
$StreamProvider<List<TabTreesResult>> { $StreamProvider<List<TabTreesResult>> {
const TabTreesProvider._() const WatchTabTreesProvider._()
: super( : super(
from: null, from: null,
argument: null, argument: null,
retry: null, retry: null,
name: r'tabTreesProvider', name: r'watchTabTreesProvider',
isAutoDispose: true, isAutoDispose: true,
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
); );
@override @override
String debugGetCreateSourceHash() => _$tabTreesHash(); String debugGetCreateSourceHash() => _$watchTabTreesHash();
@$internal @$internal
@override @override
@@ -324,16 +325,16 @@ final class TabTreesProvider
@override @override
Stream<List<TabTreesResult>> create(Ref ref) { Stream<List<TabTreesResult>> create(Ref ref) {
return tabTrees(ref); return watchTabTrees(ref);
} }
} }
String _$tabTreesHash() => r'd9256293a97d5451c2ab881a30ae99c9e2178999'; String _$watchTabTreesHash() => r'a2be591acb6818ea8675a12d90e6c4684a0448a8';
@ProviderFor(tabDescendants) @ProviderFor(watchTabDescendants)
const tabDescendantsProvider = TabDescendantsFamily._(); const watchTabDescendantsProvider = WatchTabDescendantsFamily._();
final class TabDescendantsProvider final class WatchTabDescendantsProvider
extends extends
$FunctionalProvider< $FunctionalProvider<
AsyncValue<Map<String, String?>>, AsyncValue<Map<String, String?>>,
@@ -343,23 +344,23 @@ final class TabDescendantsProvider
with with
$FutureModifier<Map<String, String?>>, $FutureModifier<Map<String, String?>>,
$StreamProvider<Map<String, String?>> { $StreamProvider<Map<String, String?>> {
const TabDescendantsProvider._({ const WatchTabDescendantsProvider._({
required TabDescendantsFamily super.from, required WatchTabDescendantsFamily super.from,
required String super.argument, required String super.argument,
}) : super( }) : super(
retry: null, retry: null,
name: r'tabDescendantsProvider', name: r'watchTabDescendantsProvider',
isAutoDispose: true, isAutoDispose: true,
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
); );
@override @override
String debugGetCreateSourceHash() => _$tabDescendantsHash(); String debugGetCreateSourceHash() => _$watchTabDescendantsHash();
@override @override
String toString() { String toString() {
return r'tabDescendantsProvider' return r'watchTabDescendantsProvider'
'' ''
'($argument)'; '($argument)';
} }
@@ -373,12 +374,12 @@ final class TabDescendantsProvider
@override @override
Stream<Map<String, String?>> create(Ref ref) { Stream<Map<String, String?>> create(Ref ref) {
final argument = this.argument as String; final argument = this.argument as String;
return tabDescendants(ref, argument); return watchTabDescendants(ref, argument);
} }
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return other is TabDescendantsProvider && other.argument == argument; return other is WatchTabDescendantsProvider && other.argument == argument;
} }
@override @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<Stream<Map<String, String?>>, String> { with $FunctionalFamilyOverride<Stream<Map<String, String?>>, String> {
const TabDescendantsFamily._() const WatchTabDescendantsFamily._()
: super( : super(
retry: null, retry: null,
name: r'tabDescendantsProvider', name: r'watchTabDescendantsProvider',
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
isAutoDispose: true, isAutoDispose: true,
); );
TabDescendantsProvider call(String tabId) => WatchTabDescendantsProvider call(String tabId) =>
TabDescendantsProvider._(argument: tabId, from: this); WatchTabDescendantsProvider._(argument: tabId, from: this);
@override @override
String toString() => r'tabDescendantsProvider'; String toString() => r'watchTabDescendantsProvider';
} }
@ProviderFor(containerTabsData) @ProviderFor(watchContainerTabsData)
const containerTabsDataProvider = ContainerTabsDataFamily._(); const watchContainerTabsDataProvider = WatchContainerTabsDataFamily._();
final class ContainerTabsDataProvider final class WatchContainerTabsDataProvider
extends extends
$FunctionalProvider< $FunctionalProvider<
AsyncValue<List<TabData>>, AsyncValue<List<TabData>>,
@@ -418,23 +420,23 @@ final class ContainerTabsDataProvider
Stream<List<TabData>> Stream<List<TabData>>
> >
with $FutureModifier<List<TabData>>, $StreamProvider<List<TabData>> { with $FutureModifier<List<TabData>>, $StreamProvider<List<TabData>> {
const ContainerTabsDataProvider._({ const WatchContainerTabsDataProvider._({
required ContainerTabsDataFamily super.from, required WatchContainerTabsDataFamily super.from,
required String? super.argument, required String? super.argument,
}) : super( }) : super(
retry: null, retry: null,
name: r'containerTabsDataProvider', name: r'watchContainerTabsDataProvider',
isAutoDispose: true, isAutoDispose: true,
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
); );
@override @override
String debugGetCreateSourceHash() => _$containerTabsDataHash(); String debugGetCreateSourceHash() => _$watchContainerTabsDataHash();
@override @override
String toString() { String toString() {
return r'containerTabsDataProvider' return r'watchContainerTabsDataProvider'
'' ''
'($argument)'; '($argument)';
} }
@@ -448,12 +450,13 @@ final class ContainerTabsDataProvider
@override @override
Stream<List<TabData>> create(Ref ref) { Stream<List<TabData>> create(Ref ref) {
final argument = this.argument as String?; final argument = this.argument as String?;
return containerTabsData(ref, argument); return watchContainerTabsData(ref, argument);
} }
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return other is ContainerTabsDataProvider && other.argument == argument; return other is WatchContainerTabsDataProvider &&
other.argument == argument;
} }
@override @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<Stream<List<TabData>>, String?> { with $FunctionalFamilyOverride<Stream<List<TabData>>, String?> {
const ContainerTabsDataFamily._() const WatchContainerTabsDataFamily._()
: super( : super(
retry: null, retry: null,
name: r'containerTabsDataProvider', name: r'watchContainerTabsDataProvider',
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
isAutoDispose: true, isAutoDispose: true,
); );
ContainerTabsDataProvider call(String? containerId) => WatchContainerTabsDataProvider call(String? containerId) =>
ContainerTabsDataProvider._(argument: containerId, from: this); WatchContainerTabsDataProvider._(argument: containerId, from: this);
@override @override
String toString() => r'containerTabsDataProvider'; String toString() => r'watchContainerTabsDataProvider';
} }
@ProviderFor(containerData) @ProviderFor(watchContainerData)
const containerDataProvider = ContainerDataFamily._(); const watchContainerDataProvider = WatchContainerDataFamily._();
final class ContainerDataProvider final class WatchContainerDataProvider
extends extends
$FunctionalProvider< $FunctionalProvider<
AsyncValue<ContainerData?>, AsyncValue<ContainerData?>,
@@ -493,23 +497,23 @@ final class ContainerDataProvider
Stream<ContainerData?> Stream<ContainerData?>
> >
with $FutureModifier<ContainerData?>, $StreamProvider<ContainerData?> { with $FutureModifier<ContainerData?>, $StreamProvider<ContainerData?> {
const ContainerDataProvider._({ const WatchContainerDataProvider._({
required ContainerDataFamily super.from, required WatchContainerDataFamily super.from,
required String super.argument, required String super.argument,
}) : super( }) : super(
retry: null, retry: null,
name: r'containerDataProvider', name: r'watchContainerDataProvider',
isAutoDispose: true, isAutoDispose: true,
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
); );
@override @override
String debugGetCreateSourceHash() => _$containerDataHash(); String debugGetCreateSourceHash() => _$watchContainerDataHash();
@override @override
String toString() { String toString() {
return r'containerDataProvider' return r'watchContainerDataProvider'
'' ''
'($argument)'; '($argument)';
} }
@@ -523,12 +527,12 @@ final class ContainerDataProvider
@override @override
Stream<ContainerData?> create(Ref ref) { Stream<ContainerData?> create(Ref ref) {
final argument = this.argument as String; final argument = this.argument as String;
return containerData(ref, argument); return watchContainerData(ref, argument);
} }
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
return other is ContainerDataProvider && other.argument == argument; return other is WatchContainerDataProvider && other.argument == argument;
} }
@override @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<Stream<ContainerData?>, String> { with $FunctionalFamilyOverride<Stream<ContainerData?>, String> {
const ContainerDataFamily._() const WatchContainerDataFamily._()
: super( : super(
retry: null, retry: null,
name: r'containerDataProvider', name: r'watchContainerDataProvider',
dependencies: null, dependencies: null,
$allTransitiveDependencies: null, $allTransitiveDependencies: null,
isAutoDispose: true, isAutoDispose: true,
); );
ContainerDataProvider call(String containerId) => WatchContainerDataProvider call(String containerId) =>
ContainerDataProvider._(argument: containerId, from: this); WatchContainerDataProvider._(argument: containerId, from: this);
@override @override
String toString() => r'containerDataProvider'; String toString() => r'watchContainerDataProvider';
} }
@ProviderFor(watchContainerTabId) @ProviderFor(watchContainerTabId)
@@ -626,3 +631,45 @@ final class WatchContainerTabIdFamily extends $Family
@override @override
String toString() => r'watchContainerTabIdProvider'; String toString() => r'watchContainerTabIdProvider';
} }
@ProviderFor(watchAllAssignedSites)
const watchAllAssignedSitesProvider = WatchAllAssignedSitesProvider._();
final class WatchAllAssignedSitesProvider
extends
$FunctionalProvider<
AsyncValue<List<SiteAssignment>>,
List<SiteAssignment>,
Stream<List<SiteAssignment>>
>
with
$FutureModifier<List<SiteAssignment>>,
$StreamProvider<List<SiteAssignment>> {
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<List<SiteAssignment>> $createElement(
$ProviderPointer pointer,
) => $StreamProviderElement(pointer);
@override
Stream<List<SiteAssignment>> create(Ref ref) {
return watchAllAssignedSites(ref);
}
}
String _$watchAllAssignedSitesHash() =>
r'd755451be0ad7e03db36ba39c64f6f0b5c1d9ba3';
@@ -101,7 +101,7 @@ class SelectedContainer extends _$SelectedContainer {
String? build() { String? build() {
ref.listen( ref.listen(
fireImmediately: true, fireImmediately: true,
containersWithCountProvider, watchContainersWithCountProvider,
(previous, next) { (previous, next) {
if (stateOrNull != null && next.value != null) { if (stateOrNull != null && next.value != null) {
if (!next.value!.any((container) => container.id == state)) { if (!next.value!.any((container) => container.id == state)) {
@@ -41,7 +41,7 @@ final class SelectedContainerProvider
} }
} }
String _$selectedContainerHash() => r'4754aa8ad9b43b022821a41771eb5af5e33b1cb6'; String _$selectedContainerHash() => r'fd41c7d7ff0cfaff2829fd93e2afd41d883b8317';
abstract class _$SelectedContainer extends $Notifier<String?> { abstract class _$SelectedContainer extends $Notifier<String?> {
String? build(); String? build();
@@ -299,7 +299,7 @@ class GeckoInferenceRepository extends _$GeckoInferenceRepository {
@Riverpod() @Riverpod()
Future<String?> containerTopic(Ref ref, String containerId) async { Future<String?> containerTopic(Ref ref, String containerId) async {
final titles = await ref.watch( final titles = await ref.watch(
containerTabsDataProvider(containerId).selectAsync( watchContainerTabsDataProvider(containerId).selectAsync(
(tabData) => (tabData) =>
EquatableValue(tabData.map((tab) => tab.title).nonNulls.toSet()), EquatableValue(tabData.map((tab) => tab.title).nonNulls.toSet()),
), ),
@@ -360,7 +360,7 @@ Future<String?> topicSuggestion(
@Riverpod() @Riverpod()
Future<List<SuggestedContainer>?> suggestClusters(Ref ref) async { Future<List<SuggestedContainer>?> suggestClusters(Ref ref) async {
final unassignedTitles = await ref.watch( final unassignedTitles = await ref.watch(
containerTabsDataProvider(null).selectAsync( watchContainerTabsDataProvider(null).selectAsync(
(tabData) => EquatableValue( (tabData) => EquatableValue(
Map.fromEntries( Map.fromEntries(
tabData tabData
@@ -389,12 +389,14 @@ Future<List<String>?> containerTabSuggestions(
return null; return null;
} }
final container = await ref.watch(containerDataProvider(containerId).future); final container = await ref.watch(
watchContainerDataProvider(containerId).future,
);
if (!ref.mounted) return null; if (!ref.mounted) return null;
final assignedTitles = await ref.watch( final assignedTitles = await ref.watch(
containerTabsDataProvider(containerId).selectAsync( watchContainerTabsDataProvider(containerId).selectAsync(
(tabData) => EquatableValue( (tabData) => EquatableValue(
tabData tabData
.where((tab) => tab.title.isNotEmpty) .where((tab) => tab.title.isNotEmpty)
@@ -407,7 +409,7 @@ Future<List<String>?> containerTabSuggestions(
if (!ref.mounted) return null; if (!ref.mounted) return null;
final unassignedTitles = await ref.watch( final unassignedTitles = await ref.watch(
containerTabsDataProvider(null).selectAsync( watchContainerTabsDataProvider(null).selectAsync(
(tabData) => EquatableValue( (tabData) => EquatableValue(
tabData tabData
.where((tab) => tab.title.isNotEmpty) .where((tab) => tab.title.isNotEmpty)
@@ -112,7 +112,7 @@ final class ContainerTopicProvider
} }
} }
String _$containerTopicHash() => r'c6e4cc316d3f05d0316909ec0bb58a95ad2fd57c'; String _$containerTopicHash() => r'2d04d50890c4ab0ddb70f3c1a2f45fd9ca56412d';
final class ContainerTopicFamily extends $Family final class ContainerTopicFamily extends $Family
with $FunctionalFamilyOverride<FutureOr<String?>, String> { with $FunctionalFamilyOverride<FutureOr<String?>, String> {
@@ -331,7 +331,7 @@ final class SuggestClustersProvider
} }
} }
String _$suggestClustersHash() => r'694b401ddd6ce68084f79883e67fda4b44607ef0'; String _$suggestClustersHash() => r'3fa169a2696954589078c7567b6245c708303232';
@ProviderFor(containerTabSuggestions) @ProviderFor(containerTabSuggestions)
const containerTabSuggestionsProvider = ContainerTabSuggestionsFamily._(); const containerTabSuggestionsProvider = ContainerTabSuggestionsFamily._();
@@ -390,7 +390,7 @@ final class ContainerTabSuggestionsProvider
} }
String _$containerTabSuggestionsHash() => String _$containerTabSuggestionsHash() =>
r'1b681736215826886241aea834f99ebfb9761197'; r'958c7432aa5c2a2828fcccd0127e0110d0a008cf';
final class ContainerTabSuggestionsFamily extends $Family final class ContainerTabSuggestionsFamily extends $Family
with $FunctionalFamilyOverride<FutureOr<List<String>?>, String?> { with $FunctionalFamilyOverride<FutureOr<List<String>?>, String?> {
@@ -30,8 +30,9 @@ part 'tab.g.dart';
class TabDataRepository extends _$TabDataRepository { class TabDataRepository extends _$TabDataRepository {
Future<void> assignContainer( Future<void> assignContainer(
String tabId, String tabId,
ContainerData targetContainer, ContainerData targetContainer, {
) async { bool closeOldTab = true,
}) async {
final currentContainerId = await getContainerTabId(tabId); final currentContainerId = await getContainerTabId(tabId);
final currentContainerData = await currentContainerId.mapNotNull( final currentContainerData = await currentContainerId.mapNotNull(
@@ -51,7 +52,9 @@ class TabDataRepository extends _$TabDataRepository {
.read(tabRepositoryProvider.notifier) .read(tabRepositoryProvider.notifier)
.duplicateTab(selectTabId: tabId, containerId: targetContainer.id); .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(); .getSingleOrNull();
} }
Future<Map<String, String?>> 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 @override
void build() {} void build() {}
} }
@@ -41,7 +41,7 @@ final class TabDataRepositoryProvider
} }
} }
String _$tabDataRepositoryHash() => r'cc25e0e23a0c0cff5670e59bb0f20496e21a2824'; String _$tabDataRepositoryHash() => r'8f8a1dff5e5be5cbe59562c86b2e57c229b97f8a';
abstract class _$TabDataRepository extends $Notifier<void> { abstract class _$TabDataRepository extends $Notifier<void> {
void build(); void build();