pretty good

This commit is contained in:
Fabian Freund
2025-02-07 20:45:47 +01:00
parent 025ecaf2e3
commit a12ef8244f
68 changed files with 2359 additions and 1015 deletions
@@ -3,9 +3,14 @@
import 'dart:async';
import 'package:lensai/data/models/equatable_iterable.dart';
import 'package:lensai/extensions/nullable.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/domain/repositories/data.dart';
import 'package:lensai/features/geckoview/domain/entities/tab_state.dart';
import 'package:lensai/features/geckoview/domain/providers/tab_list.dart';
import 'package:lensai/features/geckoview/domain/providers/tab_state.dart';
import 'package:lensai/features/geckoview/features/search/domain/entities/tab_preview.dart';
import 'package:lensai/features/geckoview/features/tabs/data/entities/container_filter.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/providers.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/repositories/tab_search.dart';
import 'package:lensai/features/kagi/data/entities/modes.dart';
@@ -87,27 +92,48 @@ class ShowFindInPage extends _$ShowFindInPage {
}
@Riverpod()
List<String> availableTabIds(
EquatableCollection<List<String>> availableTabIds(
Ref ref,
String? containerId,
ContainerFilter containerFilter,
) {
final containerTabs = ref.watch(
containerTabIdsProvider(containerId).select((value) => value.valueOrNull),
containerTabIdsProvider(containerFilter)
.select((value) => value.valueOrNull),
);
final tabStates = ref.watch(tabListProvider);
final tabList = ref.watch(tabListProvider);
return containerTabs?.where((tabId) => tabStates.contains(tabId)).toList() ??
[];
return EquatableCollection(
containerTabs?.where((tabId) => tabList.contains(tabId)).toList() ?? [],
immutable: true,
);
}
@Riverpod()
List<String> seamlessFilteredTabs(
EquatableCollection<Map<String, TabState>> availableTabStates(
Ref ref,
String? containerId,
ContainerFilter containerFilter,
) {
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
final tabStates = ref.watch(tabStatesProvider);
return EquatableCollection(
{
for (final tabId in availableTabs.collection)
if (tabStates.containsKey(tabId)) tabId: tabStates[tabId]!,
},
immutable: true,
);
}
@Riverpod()
EquatableCollection<List<String>> seamlessFilteredTabIds(
Ref ref,
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
final tabSearchResults = ref
.watch(
tabSearchRepositoryProvider.select(
tabSearchRepositoryProvider(searchPartition).select(
(value) => EquatableCollection(
value.valueOrNull?.map((tab) => tab.id).toList(),
immutable: true,
@@ -116,17 +142,74 @@ List<String> seamlessFilteredTabs(
)
.collection;
final availableTabs = ref
.watch(
availableTabIdsProvider(containerId).select(
(value) => EquatableCollection(value, immutable: true),
),
)
.collection;
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
if (tabSearchResults == null) {
return availableTabs;
}
return tabSearchResults.where((tab) => availableTabs.contains(tab)).toList();
return EquatableCollection(
tabSearchResults
.where((tab) => availableTabs.collection.contains(tab))
.toList(),
immutable: true,
);
}
@Riverpod()
EquatableCollection<List<TabPreview>> seamlessFilteredTabPreviews(
Ref ref,
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
final tabSearchResults = ref
.watch(
tabSearchRepositoryProvider(searchPartition).select(
(value) => EquatableCollection(
value.valueOrNull,
immutable: true,
),
),
)
.collection;
final availableTabStates =
ref.watch(availableTabStatesProvider(containerFilter));
if (tabSearchResults == null) {
return EquatableCollection(
availableTabStates.collection.values
.map(
(state) => TabPreview(
id: state.id,
title: state.title,
icon: state.icon,
url: state.url,
highlightedUrl: null,
content: null,
),
)
.toList(),
immutable: true,
);
}
return EquatableCollection(
tabSearchResults
.where((tab) => availableTabStates.collection.containsKey(tab.id))
.map((tab) {
return TabPreview(
id: tab.id,
title: tab.title ?? availableTabStates.collection[tab.id]!.title,
icon: null,
url: tab.cleanUrl.mapNotNull(Uri.tryParse) ??
availableTabStates.collection[tab.id]!.url,
highlightedUrl: tab.url,
content: tab.extractedContent ?? tab.fullContent,
);
})
.whereType<TabPreview>()
.toList(),
immutable: true,
);
}
@@ -158,23 +158,23 @@ class _SelectedBangDataProviderElement
String? get domain => (origin as SelectedBangDataProvider).domain;
}
String _$availableTabIdsHash() => r'646d42c747d815496849c7342903caf48258a8ab';
String _$availableTabIdsHash() => r'd8b55b012b38111c8d5e069987a55645d1a71b89';
/// See also [availableTabIds].
@ProviderFor(availableTabIds)
const availableTabIdsProvider = AvailableTabIdsFamily();
/// See also [availableTabIds].
class AvailableTabIdsFamily extends Family<List<String>> {
class AvailableTabIdsFamily extends Family<EquatableCollection<List<String>>> {
/// See also [availableTabIds].
const AvailableTabIdsFamily();
/// See also [availableTabIds].
AvailableTabIdsProvider call(
String? containerId,
ContainerFilter containerFilter,
) {
return AvailableTabIdsProvider(
containerId,
containerFilter,
);
}
@@ -183,7 +183,7 @@ class AvailableTabIdsFamily extends Family<List<String>> {
covariant AvailableTabIdsProvider provider,
) {
return call(
provider.containerId,
provider.containerFilter,
);
}
@@ -203,14 +203,15 @@ class AvailableTabIdsFamily extends Family<List<String>> {
}
/// See also [availableTabIds].
class AvailableTabIdsProvider extends AutoDisposeProvider<List<String>> {
class AvailableTabIdsProvider
extends AutoDisposeProvider<EquatableCollection<List<String>>> {
/// See also [availableTabIds].
AvailableTabIdsProvider(
String? containerId,
ContainerFilter containerFilter,
) : this._internal(
(ref) => availableTabIds(
ref as AvailableTabIdsRef,
containerId,
containerFilter,
),
from: availableTabIdsProvider,
name: r'availableTabIdsProvider',
@@ -221,7 +222,7 @@ class AvailableTabIdsProvider extends AutoDisposeProvider<List<String>> {
dependencies: AvailableTabIdsFamily._dependencies,
allTransitiveDependencies:
AvailableTabIdsFamily._allTransitiveDependencies,
containerId: containerId,
containerFilter: containerFilter,
);
AvailableTabIdsProvider._internal(
@@ -231,14 +232,15 @@ class AvailableTabIdsProvider extends AutoDisposeProvider<List<String>> {
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.containerId,
required this.containerFilter,
}) : super.internal();
final String? containerId;
final ContainerFilter containerFilter;
@override
Override overrideWith(
List<String> Function(AvailableTabIdsRef provider) create,
EquatableCollection<List<String>> Function(AvailableTabIdsRef provider)
create,
) {
return ProviderOverride(
origin: this,
@@ -249,25 +251,27 @@ class AvailableTabIdsProvider extends AutoDisposeProvider<List<String>> {
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
containerId: containerId,
containerFilter: containerFilter,
),
);
}
@override
AutoDisposeProviderElement<List<String>> createElement() {
AutoDisposeProviderElement<EquatableCollection<List<String>>>
createElement() {
return _AvailableTabIdsProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is AvailableTabIdsProvider && other.containerId == containerId;
return other is AvailableTabIdsProvider &&
other.containerFilter == containerFilter;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, containerId.hashCode);
hash = _SystemHash.combine(hash, containerFilter.hashCode);
return _SystemHash.finish(hash);
}
@@ -275,46 +279,50 @@ class AvailableTabIdsProvider extends AutoDisposeProvider<List<String>> {
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin AvailableTabIdsRef on AutoDisposeProviderRef<List<String>> {
/// The parameter `containerId` of this provider.
String? get containerId;
mixin AvailableTabIdsRef
on AutoDisposeProviderRef<EquatableCollection<List<String>>> {
/// The parameter `containerFilter` of this provider.
ContainerFilter get containerFilter;
}
class _AvailableTabIdsProviderElement
extends AutoDisposeProviderElement<List<String>> with AvailableTabIdsRef {
extends AutoDisposeProviderElement<EquatableCollection<List<String>>>
with AvailableTabIdsRef {
_AvailableTabIdsProviderElement(super.provider);
@override
String? get containerId => (origin as AvailableTabIdsProvider).containerId;
ContainerFilter get containerFilter =>
(origin as AvailableTabIdsProvider).containerFilter;
}
String _$seamlessFilteredTabsHash() =>
r'1abfb0e9ae834cdde5ab64b6174f24f45f36a272';
String _$availableTabStatesHash() =>
r'ca42dc8cb88070fb58ab085ab6c9bcbf31ef4f0b';
/// See also [seamlessFilteredTabs].
@ProviderFor(seamlessFilteredTabs)
const seamlessFilteredTabsProvider = SeamlessFilteredTabsFamily();
/// See also [availableTabStates].
@ProviderFor(availableTabStates)
const availableTabStatesProvider = AvailableTabStatesFamily();
/// See also [seamlessFilteredTabs].
class SeamlessFilteredTabsFamily extends Family<List<String>> {
/// See also [seamlessFilteredTabs].
const SeamlessFilteredTabsFamily();
/// See also [availableTabStates].
class AvailableTabStatesFamily
extends Family<EquatableCollection<Map<String, TabState>>> {
/// See also [availableTabStates].
const AvailableTabStatesFamily();
/// See also [seamlessFilteredTabs].
SeamlessFilteredTabsProvider call(
String? containerId,
/// See also [availableTabStates].
AvailableTabStatesProvider call(
ContainerFilter containerFilter,
) {
return SeamlessFilteredTabsProvider(
containerId,
return AvailableTabStatesProvider(
containerFilter,
);
}
@override
SeamlessFilteredTabsProvider getProviderOverride(
covariant SeamlessFilteredTabsProvider provider,
AvailableTabStatesProvider getProviderOverride(
covariant AvailableTabStatesProvider provider,
) {
return call(
provider.containerId,
provider.containerFilter,
);
}
@@ -330,76 +338,80 @@ class SeamlessFilteredTabsFamily extends Family<List<String>> {
_allTransitiveDependencies;
@override
String? get name => r'seamlessFilteredTabsProvider';
String? get name => r'availableTabStatesProvider';
}
/// See also [seamlessFilteredTabs].
class SeamlessFilteredTabsProvider extends AutoDisposeProvider<List<String>> {
/// See also [seamlessFilteredTabs].
SeamlessFilteredTabsProvider(
String? containerId,
/// See also [availableTabStates].
class AvailableTabStatesProvider
extends AutoDisposeProvider<EquatableCollection<Map<String, TabState>>> {
/// See also [availableTabStates].
AvailableTabStatesProvider(
ContainerFilter containerFilter,
) : this._internal(
(ref) => seamlessFilteredTabs(
ref as SeamlessFilteredTabsRef,
containerId,
(ref) => availableTabStates(
ref as AvailableTabStatesRef,
containerFilter,
),
from: seamlessFilteredTabsProvider,
name: r'seamlessFilteredTabsProvider',
from: availableTabStatesProvider,
name: r'availableTabStatesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabsHash,
dependencies: SeamlessFilteredTabsFamily._dependencies,
: _$availableTabStatesHash,
dependencies: AvailableTabStatesFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabsFamily._allTransitiveDependencies,
containerId: containerId,
AvailableTabStatesFamily._allTransitiveDependencies,
containerFilter: containerFilter,
);
SeamlessFilteredTabsProvider._internal(
AvailableTabStatesProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.containerId,
required this.containerFilter,
}) : super.internal();
final String? containerId;
final ContainerFilter containerFilter;
@override
Override overrideWith(
List<String> Function(SeamlessFilteredTabsRef provider) create,
EquatableCollection<Map<String, TabState>> Function(
AvailableTabStatesRef provider)
create,
) {
return ProviderOverride(
origin: this,
override: SeamlessFilteredTabsProvider._internal(
(ref) => create(ref as SeamlessFilteredTabsRef),
override: AvailableTabStatesProvider._internal(
(ref) => create(ref as AvailableTabStatesRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
containerId: containerId,
containerFilter: containerFilter,
),
);
}
@override
AutoDisposeProviderElement<List<String>> createElement() {
return _SeamlessFilteredTabsProviderElement(this);
AutoDisposeProviderElement<EquatableCollection<Map<String, TabState>>>
createElement() {
return _AvailableTabStatesProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SeamlessFilteredTabsProvider &&
other.containerId == containerId;
return other is AvailableTabStatesProvider &&
other.containerFilter == containerFilter;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, containerId.hashCode);
hash = _SystemHash.combine(hash, containerFilter.hashCode);
return _SystemHash.finish(hash);
}
@@ -407,19 +419,333 @@ class SeamlessFilteredTabsProvider extends AutoDisposeProvider<List<String>> {
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin SeamlessFilteredTabsRef on AutoDisposeProviderRef<List<String>> {
/// The parameter `containerId` of this provider.
String? get containerId;
mixin AvailableTabStatesRef
on AutoDisposeProviderRef<EquatableCollection<Map<String, TabState>>> {
/// The parameter `containerFilter` of this provider.
ContainerFilter get containerFilter;
}
class _SeamlessFilteredTabsProviderElement
extends AutoDisposeProviderElement<List<String>>
with SeamlessFilteredTabsRef {
_SeamlessFilteredTabsProviderElement(super.provider);
class _AvailableTabStatesProviderElement extends AutoDisposeProviderElement<
EquatableCollection<Map<String, TabState>>> with AvailableTabStatesRef {
_AvailableTabStatesProviderElement(super.provider);
@override
String? get containerId =>
(origin as SeamlessFilteredTabsProvider).containerId;
ContainerFilter get containerFilter =>
(origin as AvailableTabStatesProvider).containerFilter;
}
String _$seamlessFilteredTabIdsHash() =>
r'2e29ca53c35be89972d3f9aea24198fe1feb9e05';
/// See also [seamlessFilteredTabIds].
@ProviderFor(seamlessFilteredTabIds)
const seamlessFilteredTabIdsProvider = SeamlessFilteredTabIdsFamily();
/// See also [seamlessFilteredTabIds].
class SeamlessFilteredTabIdsFamily
extends Family<EquatableCollection<List<String>>> {
/// See also [seamlessFilteredTabIds].
const SeamlessFilteredTabIdsFamily();
/// See also [seamlessFilteredTabIds].
SeamlessFilteredTabIdsProvider call(
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
return SeamlessFilteredTabIdsProvider(
searchPartition,
containerFilter,
);
}
@override
SeamlessFilteredTabIdsProvider getProviderOverride(
covariant SeamlessFilteredTabIdsProvider provider,
) {
return call(
provider.searchPartition,
provider.containerFilter,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'seamlessFilteredTabIdsProvider';
}
/// See also [seamlessFilteredTabIds].
class SeamlessFilteredTabIdsProvider
extends AutoDisposeProvider<EquatableCollection<List<String>>> {
/// See also [seamlessFilteredTabIds].
SeamlessFilteredTabIdsProvider(
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) : this._internal(
(ref) => seamlessFilteredTabIds(
ref as SeamlessFilteredTabIdsRef,
searchPartition,
containerFilter,
),
from: seamlessFilteredTabIdsProvider,
name: r'seamlessFilteredTabIdsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabIdsHash,
dependencies: SeamlessFilteredTabIdsFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabIdsFamily._allTransitiveDependencies,
searchPartition: searchPartition,
containerFilter: containerFilter,
);
SeamlessFilteredTabIdsProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.searchPartition,
required this.containerFilter,
}) : super.internal();
final TabSearchPartition searchPartition;
final ContainerFilter containerFilter;
@override
Override overrideWith(
EquatableCollection<List<String>> Function(
SeamlessFilteredTabIdsRef provider)
create,
) {
return ProviderOverride(
origin: this,
override: SeamlessFilteredTabIdsProvider._internal(
(ref) => create(ref as SeamlessFilteredTabIdsRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
searchPartition: searchPartition,
containerFilter: containerFilter,
),
);
}
@override
AutoDisposeProviderElement<EquatableCollection<List<String>>>
createElement() {
return _SeamlessFilteredTabIdsProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SeamlessFilteredTabIdsProvider &&
other.searchPartition == searchPartition &&
other.containerFilter == containerFilter;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, searchPartition.hashCode);
hash = _SystemHash.combine(hash, containerFilter.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin SeamlessFilteredTabIdsRef
on AutoDisposeProviderRef<EquatableCollection<List<String>>> {
/// The parameter `searchPartition` of this provider.
TabSearchPartition get searchPartition;
/// The parameter `containerFilter` of this provider.
ContainerFilter get containerFilter;
}
class _SeamlessFilteredTabIdsProviderElement
extends AutoDisposeProviderElement<EquatableCollection<List<String>>>
with SeamlessFilteredTabIdsRef {
_SeamlessFilteredTabIdsProviderElement(super.provider);
@override
TabSearchPartition get searchPartition =>
(origin as SeamlessFilteredTabIdsProvider).searchPartition;
@override
ContainerFilter get containerFilter =>
(origin as SeamlessFilteredTabIdsProvider).containerFilter;
}
String _$seamlessFilteredTabPreviewsHash() =>
r'7a70eb2f3f59de5188d94a73790e39c339a6293b';
/// See also [seamlessFilteredTabPreviews].
@ProviderFor(seamlessFilteredTabPreviews)
const seamlessFilteredTabPreviewsProvider = SeamlessFilteredTabPreviewsFamily();
/// See also [seamlessFilteredTabPreviews].
class SeamlessFilteredTabPreviewsFamily
extends Family<EquatableCollection<List<TabPreview>>> {
/// See also [seamlessFilteredTabPreviews].
const SeamlessFilteredTabPreviewsFamily();
/// See also [seamlessFilteredTabPreviews].
SeamlessFilteredTabPreviewsProvider call(
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
return SeamlessFilteredTabPreviewsProvider(
searchPartition,
containerFilter,
);
}
@override
SeamlessFilteredTabPreviewsProvider getProviderOverride(
covariant SeamlessFilteredTabPreviewsProvider provider,
) {
return call(
provider.searchPartition,
provider.containerFilter,
);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@override
Iterable<ProviderOrFamily>? get dependencies => _dependencies;
static const Iterable<ProviderOrFamily>? _allTransitiveDependencies = null;
@override
Iterable<ProviderOrFamily>? get allTransitiveDependencies =>
_allTransitiveDependencies;
@override
String? get name => r'seamlessFilteredTabPreviewsProvider';
}
/// See also [seamlessFilteredTabPreviews].
class SeamlessFilteredTabPreviewsProvider
extends AutoDisposeProvider<EquatableCollection<List<TabPreview>>> {
/// See also [seamlessFilteredTabPreviews].
SeamlessFilteredTabPreviewsProvider(
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) : this._internal(
(ref) => seamlessFilteredTabPreviews(
ref as SeamlessFilteredTabPreviewsRef,
searchPartition,
containerFilter,
),
from: seamlessFilteredTabPreviewsProvider,
name: r'seamlessFilteredTabPreviewsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabPreviewsHash,
dependencies: SeamlessFilteredTabPreviewsFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabPreviewsFamily._allTransitiveDependencies,
searchPartition: searchPartition,
containerFilter: containerFilter,
);
SeamlessFilteredTabPreviewsProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.searchPartition,
required this.containerFilter,
}) : super.internal();
final TabSearchPartition searchPartition;
final ContainerFilter containerFilter;
@override
Override overrideWith(
EquatableCollection<List<TabPreview>> Function(
SeamlessFilteredTabPreviewsRef provider)
create,
) {
return ProviderOverride(
origin: this,
override: SeamlessFilteredTabPreviewsProvider._internal(
(ref) => create(ref as SeamlessFilteredTabPreviewsRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
searchPartition: searchPartition,
containerFilter: containerFilter,
),
);
}
@override
AutoDisposeProviderElement<EquatableCollection<List<TabPreview>>>
createElement() {
return _SeamlessFilteredTabPreviewsProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is SeamlessFilteredTabPreviewsProvider &&
other.searchPartition == searchPartition &&
other.containerFilter == containerFilter;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, searchPartition.hashCode);
hash = _SystemHash.combine(hash, containerFilter.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin SeamlessFilteredTabPreviewsRef
on AutoDisposeProviderRef<EquatableCollection<List<TabPreview>>> {
/// The parameter `searchPartition` of this provider.
TabSearchPartition get searchPartition;
/// The parameter `containerFilter` of this provider.
ContainerFilter get containerFilter;
}
class _SeamlessFilteredTabPreviewsProviderElement
extends AutoDisposeProviderElement<EquatableCollection<List<TabPreview>>>
with SeamlessFilteredTabPreviewsRef {
_SeamlessFilteredTabPreviewsProviderElement(super.provider);
@override
TabSearchPartition get searchPartition =>
(origin as SeamlessFilteredTabPreviewsProvider).searchPartition;
@override
ContainerFilter get containerFilter =>
(origin as SeamlessFilteredTabPreviewsProvider).containerFilter;
}
String _$selectedBangTriggerHash() =>
@@ -48,6 +48,8 @@ class CreateTabStream extends _$CreateTabStream {
}
void createTab(CreateTabSheet parameter) {
_streamController.add(parameter);
if (!_streamController.isClosed) {
_streamController.add(parameter);
}
}
}
@@ -6,7 +6,7 @@ part of 'create_tab.dart';
// RiverpodGenerator
// **************************************************************************
String _$createTabStreamHash() => r'05ad914e41e0d346e082e4638afe5fe5a04052f1';
String _$createTabStreamHash() => r'2e802a10ecaf1862074f32b76e89c26997bdd7b2';
/// See also [CreateTabStream].
@ProviderFor(CreateTabStream)
@@ -7,15 +7,13 @@ import 'package:flutter_reorderable_grid_view/widgets/widgets.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lensai/core/providers.dart';
import 'package:lensai/data/models/drag_data.dart';
import 'package:lensai/data/models/equatable_iterable.dart';
import 'package:lensai/features/geckoview/domain/controllers/overlay_dialog.dart';
import 'package:lensai/features/geckoview/domain/providers/selected_tab.dart';
import 'package:lensai/features/geckoview/domain/providers/tab_state.dart';
import 'package:lensai/features/geckoview/domain/repositories/tab.dart';
import 'package:lensai/features/geckoview/features/browser/domain/providers.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/dialogs/tab_action.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/draggable_scrollable_header.dart';
import 'package:lensai/features/geckoview/features/browser/presentation/widgets/tab_preview.dart';
import 'package:lensai/features/geckoview/features/tabs/data/entities/container_filter.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/providers/selected_container.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/repositories/container.dart';
import 'package:lensai/features/geckoview/features/tabs/domain/repositories/tab.dart';
@@ -94,7 +92,9 @@ class _Tab extends HookConsumerWidget {
searchTextController,
() async {
await ref
.read(tabSearchRepositoryProvider.notifier)
.read(
tabSearchRepositoryProvider(TabSearchPartition.preview).notifier,
)
.addQuery(searchTextController.text);
},
);
@@ -248,14 +248,12 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
builder: (context, ref, child) {
final container = ref.watch(selectedContainerProvider);
final filteredTabs = ref
.watch(
seamlessFilteredTabsProvider(container).select(
(value) =>
EquatableCollection(value, immutable: true),
),
)
.collection;
final filteredTabIds = ref.watch(
seamlessFilteredTabIdsProvider(
TabSearchPartition.preview,
ContainerFilterById(containerId: container),
),
);
final activeTab = ref.watch(selectedTabProvider);
@@ -273,7 +271,7 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
useEffect(
() {
final index = filteredTabs
final index = filteredTabIds.collection
.indexWhere((webView) => webView == activeTab);
if (index > -1) {
@@ -292,12 +290,12 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
return null;
},
[filteredTabs, activeTab],
[filteredTabIds, activeTab],
);
final tabs = useMemoized(
() {
return filteredTabs
return filteredTabIds.collection
.mapIndexed(
(index, tabId) => CustomDraggable(
key: Key(tabId),
@@ -350,7 +348,7 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
.toList();
},
[
EquatableCollection(filteredTabs, immutable: true),
filteredTabIds,
activeTab,
],
);
@@ -375,7 +373,7 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
final containerRepository =
ref.read(containerRepositoryProvider.notifier);
final tabId = filteredTabs[oldIndex];
final tabId = filteredTabIds.collection[oldIndex];
final containerId = await ref
.read(tabDataRepositoryProvider.notifier)
.containerTabId(tabId);
@@ -384,13 +382,14 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
if (newIndex <= 0) {
key = await containerRepository
.getLeadingOrderKey(containerId);
} else if (newIndex >= filteredTabs.length - 1) {
} else if (newIndex >=
filteredTabIds.collection.length - 1) {
key = await containerRepository
.getTrailingOrderKey(containerId);
} else {
final orderAfterIndex = newIndex;
key = await containerRepository.getOrderKeyAfterTab(
filteredTabs[orderAfterIndex],
filteredTabIds.collection[orderAfterIndex],
containerId,
);
}