pretty good
This commit is contained in:
@@ -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)
|
||||
|
||||
+18
-19
@@ -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,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user