refactoring

This commit is contained in:
Fabian Freund
2025-02-20 12:27:34 +01:00
parent b81fc1cc42
commit 490e13000b
138 changed files with 1392 additions and 3251 deletions
@@ -3,6 +3,7 @@ import 'package:lensai/extensions/nullable.dart';
import 'package:lensai/features/bangs/data/database/database.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
part 'bang.g.dart';
@@ -121,18 +122,4 @@ class BangDao extends DatabaseAccessor<BangDatabase> with _$BangDaoMixin {
Future<int> removeSearchEntry(String searchQuery) {
return db.bangHistory.deleteWhere((t) => t.searchQuery.equals(searchQuery));
}
// Future<int> upsertBangIcon(String trigger, BrowserIcon icon) async {
// //TODO: swithc to WEBP in future, requires 3rd party
// final compressed = await icon.image.toByteData(format: ImageByteFormat.png);
// return db.bangIcon.insertOne(
// BangIconCompanion.insert(
// trigger: trigger,
// iconData: compressed!.buffer.asUint8List(),
// fetchDate: DateTime.now(),
// ),
// mode: InsertMode.insertOrReplace,
// );
// }
}
@@ -1,6 +1,7 @@
import 'package:drift/drift.dart';
import 'package:lensai/features/bangs/data/database/database.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
part 'sync.g.dart';
@@ -8,7 +9,7 @@ part 'sync.g.dart';
class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
SyncDao(super.db);
SingleOrNullSelectable<DateTime?> lastSyncOfGroup(BangGroup group) {
SingleOrNullSelectable<DateTime?> getLastSyncOfGroup(BangGroup group) {
final query =
selectOnly(db.bangSync)
..addColumns([db.bangSync.lastSync])
@@ -4,6 +4,7 @@ import 'package:lensai/features/bangs/data/database/daos/sync.dart';
import 'package:lensai/features/bangs/data/database/drift/converters/bang_format.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
import 'package:lensai/features/bangs/data/models/search_history_entry.dart';
import 'package:lensai/features/search/domain/fts_tokenizer.dart';
@@ -1,5 +1,6 @@
import 'package:lensai/features/bangs/data/database/drift/converters/bang_format.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/search_history_entry.dart';
+1 -17
View File
@@ -4,26 +4,10 @@ import 'package:fast_equatable/fast_equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:lensai/features/bangs/data/database/database.dart'
show BangCompanion;
import 'package:lensai/features/bangs/data/models/bang_group.dart';
part 'bang.g.dart';
enum BangGroup {
general('https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json'),
assistant(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json',
),
kagi(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/kagi_bangs.json',
),
custom(
'https://raw.githubusercontent.com/FaFre/bangs/refs/heads/custom/data/custom.json',
);
final String url;
const BangGroup(this.url);
}
enum BangFormat {
///When the bang is invoked with no query, opens the base path of the URL (/)
///instead of any path given in the template (g., /search)
@@ -0,0 +1,16 @@
enum BangGroup {
general('https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json'),
assistant(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json',
),
kagi(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/kagi_bangs.json',
),
custom(
'https://raw.githubusercontent.com/FaFre/bangs/refs/heads/custom/data/custom.json',
);
final String url;
const BangGroup(this.url);
}
@@ -5,12 +5,13 @@ import 'package:flutter/foundation.dart';
import 'package:http/http.dart' as http;
import 'package:lensai/core/http_error_handler.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'source.g.dart';
part 'data_source.g.dart';
@Riverpod()
class BangSourceService extends _$BangSourceService {
class BangDataSourceService extends _$BangDataSourceService {
late http.Client _client;
@override
@@ -20,7 +21,9 @@ class BangSourceService extends _$BangSourceService {
Future<Result<List<Bang>>> getBangs(Uri url, BangGroup? group) async {
return Result.fromAsync(() async {
final response = await _client.get(url);
final response = await _client
.get(url)
.timeout(const Duration(seconds: 30));
return await compute((args) => jsonDecode(utf8.decode(args[0])) as List, [
response.bodyBytes,
]).then(
@@ -1,26 +1,27 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'source.dart';
part of 'data_source.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$bangSourceServiceHash() => r'2f734d563fa20de306a72013526ef1f72f910fe1';
String _$bangDataSourceServiceHash() =>
r'fb00762858a2878505c14e2b1a0f26c1b2f60d7d';
/// See also [BangSourceService].
@ProviderFor(BangSourceService)
final bangSourceServiceProvider =
AutoDisposeNotifierProvider<BangSourceService, void>.internal(
BangSourceService.new,
name: r'bangSourceServiceProvider',
/// See also [BangDataSourceService].
@ProviderFor(BangDataSourceService)
final bangDataSourceServiceProvider =
AutoDisposeNotifierProvider<BangDataSourceService, void>.internal(
BangDataSourceService.new,
name: r'bangDataSourceServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSourceServiceHash,
: _$bangDataSourceServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BangSourceService = AutoDisposeNotifier<void>;
typedef _$BangDataSourceService = AutoDisposeNotifier<void>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
@@ -1,5 +1,5 @@
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
import 'package:lensai/features/bangs/data/models/search_history_entry.dart';
import 'package:lensai/features/bangs/domain/repositories/data.dart';
import 'package:lensai/features/bangs/domain/repositories/sync.dart';
@@ -8,15 +8,10 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'bangs.g.dart';
@Riverpod()
Stream<BangData?> bangData(Ref ref, String? trigger) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchBang(trigger);
}
@Riverpod(keepAlive: true)
Stream<BangData?> defaultSearchBangData(Ref ref) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
//TODO: Setting
return repository.watchBang('lai');
}
@@ -27,27 +22,24 @@ Stream<Map<String, List<String>>> bangCategories(Ref ref) {
}
@Riverpod()
Stream<List<BangData>> bangDataList(
Stream<List<BangData>> bangList(
Ref ref, {
({
Iterable<BangGroup>? groups,
String? domain,
({String category, String? subCategory})? categoryFilter,
bool? orderMostFrequentFirst,
})?
filter,
List<BangGroup>? groups,
String? domain,
({String category, String? subCategory})? categoryFilter,
bool? orderMostFrequentFirst,
}) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchBangs(
groups: filter?.groups,
domain: filter?.domain,
categoryFilter: filter?.categoryFilter,
orderMostFrequentFirst: filter?.orderMostFrequentFirst,
groups: groups,
domain: domain,
categoryFilter: categoryFilter,
orderMostFrequentFirst: orderMostFrequentFirst,
);
}
@Riverpod()
Stream<List<BangData>> frequentBangDataList(Ref ref) {
Stream<List<BangData>> frequentBangList(Ref ref) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchFrequentBangs();
}
@@ -6,156 +6,6 @@ part of 'bangs.dart';
// RiverpodGenerator
// **************************************************************************
String _$bangDataHash() => r'057a002de9789ab74c8f3b337a43faa26b788d8d';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [bangData].
@ProviderFor(bangData)
const bangDataProvider = BangDataFamily();
/// See also [bangData].
class BangDataFamily extends Family<AsyncValue<BangData?>> {
/// See also [bangData].
const BangDataFamily();
/// See also [bangData].
BangDataProvider call(
String? trigger,
) {
return BangDataProvider(
trigger,
);
}
@override
BangDataProvider getProviderOverride(
covariant BangDataProvider provider,
) {
return call(
provider.trigger,
);
}
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'bangDataProvider';
}
/// See also [bangData].
class BangDataProvider extends AutoDisposeStreamProvider<BangData?> {
/// See also [bangData].
BangDataProvider(
String? trigger,
) : this._internal(
(ref) => bangData(
ref as BangDataRef,
trigger,
),
from: bangDataProvider,
name: r'bangDataProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangDataHash,
dependencies: BangDataFamily._dependencies,
allTransitiveDependencies: BangDataFamily._allTransitiveDependencies,
trigger: trigger,
);
BangDataProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.trigger,
}) : super.internal();
final String? trigger;
@override
Override overrideWith(
Stream<BangData?> Function(BangDataRef provider) create,
) {
return ProviderOverride(
origin: this,
override: BangDataProvider._internal(
(ref) => create(ref as BangDataRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
trigger: trigger,
),
);
}
@override
AutoDisposeStreamProviderElement<BangData?> createElement() {
return _BangDataProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is BangDataProvider && other.trigger == trigger;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, trigger.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin BangDataRef on AutoDisposeStreamProviderRef<BangData?> {
/// The parameter `trigger` of this provider.
String? get trigger;
}
class _BangDataProviderElement
extends AutoDisposeStreamProviderElement<BangData?> with BangDataRef {
_BangDataProviderElement(super.provider);
@override
String? get trigger => (origin as BangDataProvider).trigger;
}
String _$defaultSearchBangDataHash() =>
r'c93026fe7b1650fe8a39bb2a8850af3ee416c306';
@@ -193,37 +43,62 @@ final bangCategoriesProvider =
// ignore: unused_element
typedef BangCategoriesRef
= AutoDisposeStreamProviderRef<Map<String, List<String>>>;
String _$bangDataListHash() => r'cd034fdf046b156ac452edd0857ac054ab477917';
String _$bangListHash() => r'dc168bd1246bea3e5f8015dd52fbf41c5f98ca13';
/// See also [bangDataList].
@ProviderFor(bangDataList)
const bangDataListProvider = BangDataListFamily();
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
/// See also [bangDataList].
class BangDataListFamily extends Family<AsyncValue<List<BangData>>> {
/// See also [bangDataList].
const BangDataListFamily();
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
/// See also [bangDataList].
BangDataListProvider call({
({
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? filter,
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [bangList].
@ProviderFor(bangList)
const bangListProvider = BangListFamily();
/// See also [bangList].
class BangListFamily extends Family<AsyncValue<List<BangData>>> {
/// See also [bangList].
const BangListFamily();
/// See also [bangList].
BangListProvider call({
List<BangGroup>? groups,
String? domain,
({String category, String? subCategory})? categoryFilter,
bool? orderMostFrequentFirst,
}) {
return BangDataListProvider(
filter: filter,
return BangListProvider(
groups: groups,
domain: domain,
categoryFilter: categoryFilter,
orderMostFrequentFirst: orderMostFrequentFirst,
);
}
@override
BangDataListProvider getProviderOverride(
covariant BangDataListProvider provider,
BangListProvider getProviderOverride(
covariant BangListProvider provider,
) {
return call(
filter: provider.filter,
groups: provider.groups,
domain: provider.domain,
categoryFilter: provider.categoryFilter,
orderMostFrequentFirst: provider.orderMostFrequentFirst,
);
}
@@ -239,85 +114,99 @@ class BangDataListFamily extends Family<AsyncValue<List<BangData>>> {
_allTransitiveDependencies;
@override
String? get name => r'bangDataListProvider';
String? get name => r'bangListProvider';
}
/// See also [bangDataList].
class BangDataListProvider extends AutoDisposeStreamProvider<List<BangData>> {
/// See also [bangDataList].
BangDataListProvider({
({
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? filter,
/// See also [bangList].
class BangListProvider extends AutoDisposeStreamProvider<List<BangData>> {
/// See also [bangList].
BangListProvider({
List<BangGroup>? groups,
String? domain,
({String category, String? subCategory})? categoryFilter,
bool? orderMostFrequentFirst,
}) : this._internal(
(ref) => bangDataList(
ref as BangDataListRef,
filter: filter,
(ref) => bangList(
ref as BangListRef,
groups: groups,
domain: domain,
categoryFilter: categoryFilter,
orderMostFrequentFirst: orderMostFrequentFirst,
),
from: bangDataListProvider,
name: r'bangDataListProvider',
from: bangListProvider,
name: r'bangListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangDataListHash,
dependencies: BangDataListFamily._dependencies,
allTransitiveDependencies:
BangDataListFamily._allTransitiveDependencies,
filter: filter,
: _$bangListHash,
dependencies: BangListFamily._dependencies,
allTransitiveDependencies: BangListFamily._allTransitiveDependencies,
groups: groups,
domain: domain,
categoryFilter: categoryFilter,
orderMostFrequentFirst: orderMostFrequentFirst,
);
BangDataListProvider._internal(
BangListProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.filter,
required this.groups,
required this.domain,
required this.categoryFilter,
required this.orderMostFrequentFirst,
}) : super.internal();
final ({
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? filter;
final List<BangGroup>? groups;
final String? domain;
final ({String category, String? subCategory})? categoryFilter;
final bool? orderMostFrequentFirst;
@override
Override overrideWith(
Stream<List<BangData>> Function(BangDataListRef provider) create,
Stream<List<BangData>> Function(BangListRef provider) create,
) {
return ProviderOverride(
origin: this,
override: BangDataListProvider._internal(
(ref) => create(ref as BangDataListRef),
override: BangListProvider._internal(
(ref) => create(ref as BangListRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
filter: filter,
groups: groups,
domain: domain,
categoryFilter: categoryFilter,
orderMostFrequentFirst: orderMostFrequentFirst,
),
);
}
@override
AutoDisposeStreamProviderElement<List<BangData>> createElement() {
return _BangDataListProviderElement(this);
return _BangListProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is BangDataListProvider && other.filter == filter;
return other is BangListProvider &&
other.groups == groups &&
other.domain == domain &&
other.categoryFilter == categoryFilter &&
other.orderMostFrequentFirst == orderMostFrequentFirst;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, filter.hashCode);
hash = _SystemHash.combine(hash, groups.hashCode);
hash = _SystemHash.combine(hash, domain.hashCode);
hash = _SystemHash.combine(hash, categoryFilter.hashCode);
hash = _SystemHash.combine(hash, orderMostFrequentFirst.hashCode);
return _SystemHash.finish(hash);
}
@@ -325,49 +214,54 @@ class BangDataListProvider extends AutoDisposeStreamProvider<List<BangData>> {
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin BangDataListRef on AutoDisposeStreamProviderRef<List<BangData>> {
/// The parameter `filter` of this provider.
({
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? get filter;
mixin BangListRef on AutoDisposeStreamProviderRef<List<BangData>> {
/// The parameter `groups` of this provider.
List<BangGroup>? get groups;
/// The parameter `domain` of this provider.
String? get domain;
/// The parameter `categoryFilter` of this provider.
({String category, String? subCategory})? get categoryFilter;
/// The parameter `orderMostFrequentFirst` of this provider.
bool? get orderMostFrequentFirst;
}
class _BangDataListProviderElement
extends AutoDisposeStreamProviderElement<List<BangData>>
with BangDataListRef {
_BangDataListProviderElement(super.provider);
class _BangListProviderElement
extends AutoDisposeStreamProviderElement<List<BangData>> with BangListRef {
_BangListProviderElement(super.provider);
@override
({
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? get filter => (origin as BangDataListProvider).filter;
List<BangGroup>? get groups => (origin as BangListProvider).groups;
@override
String? get domain => (origin as BangListProvider).domain;
@override
({String category, String? subCategory})? get categoryFilter =>
(origin as BangListProvider).categoryFilter;
@override
bool? get orderMostFrequentFirst =>
(origin as BangListProvider).orderMostFrequentFirst;
}
String _$frequentBangDataListHash() =>
r'27bc10ddf502266458af3910fff09bc8282a8e5c';
String _$frequentBangListHash() => r'2c1ecb7e9416772fc1c32d01d767e1eb4f865975';
/// See also [frequentBangDataList].
@ProviderFor(frequentBangDataList)
final frequentBangDataListProvider =
/// See also [frequentBangList].
@ProviderFor(frequentBangList)
final frequentBangListProvider =
AutoDisposeStreamProvider<List<BangData>>.internal(
frequentBangDataList,
name: r'frequentBangDataListProvider',
frequentBangList,
name: r'frequentBangListProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$frequentBangDataListHash,
: _$frequentBangListHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef FrequentBangDataListRef = AutoDisposeStreamProviderRef<List<BangData>>;
typedef FrequentBangListRef = AutoDisposeStreamProviderRef<List<BangData>>;
String _$searchHistoryHash() => r'7b97798729643de8e44fd8024cdc02f35124b08b';
/// See also [searchHistory].
@@ -1,24 +1,24 @@
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/domain/repositories/data.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'search.g.dart';
@Riverpod()
Future<Uri> triggerBangSearch(
Ref ref,
BangData bang,
String searchQuery,
) async {
final bangDataNotifier = ref.watch(bangDataRepositoryProvider.notifier);
class BangSearch extends _$BangSearch {
Future<Uri> triggerBangSearch(BangData bang, String searchQuery) async {
final bangDataNotifier = ref.read(bangDataRepositoryProvider.notifier);
await bangDataNotifier.increaseFrequency(bang.trigger);
await bangDataNotifier.addSearchEntry(
bang.trigger,
searchQuery,
maxEntryCount: 3,
); //TODO: make count dynamic
await bangDataNotifier.increaseFrequency(bang.trigger);
await bangDataNotifier.addSearchEntry(
bang.trigger,
searchQuery,
maxEntryCount: 3,
); //TODO: make count dynamic
return bang.getUrl(searchQuery);
return bang.getUrl(searchQuery);
}
@override
void build() {}
}
@@ -6,172 +6,20 @@ part of 'search.dart';
// RiverpodGenerator
// **************************************************************************
String _$triggerBangSearchHash() => r'a5cff116ae09b26d4fa476ce6a2e6052fa6fa177';
String _$bangSearchHash() => r'a9bc5efc6e0df7b64bb648623f65911373a8e8e4';
/// Copied from Dart SDK
class _SystemHash {
_SystemHash._();
/// See also [BangSearch].
@ProviderFor(BangSearch)
final bangSearchProvider =
AutoDisposeNotifierProvider<BangSearch, void>.internal(
BangSearch.new,
name: r'bangSearchProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$bangSearchHash,
dependencies: null,
allTransitiveDependencies: null,
);
static int combine(int hash, int value) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + value);
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
return hash ^ (hash >> 6);
}
static int finish(int hash) {
// ignore: parameter_assignments
hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
// ignore: parameter_assignments
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
}
/// See also [triggerBangSearch].
@ProviderFor(triggerBangSearch)
const triggerBangSearchProvider = TriggerBangSearchFamily();
/// See also [triggerBangSearch].
class TriggerBangSearchFamily extends Family<AsyncValue<Uri>> {
/// See also [triggerBangSearch].
const TriggerBangSearchFamily();
/// See also [triggerBangSearch].
TriggerBangSearchProvider call(
BangData bang,
String searchQuery,
) {
return TriggerBangSearchProvider(
bang,
searchQuery,
);
}
@override
TriggerBangSearchProvider getProviderOverride(
covariant TriggerBangSearchProvider provider,
) {
return call(
provider.bang,
provider.searchQuery,
);
}
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'triggerBangSearchProvider';
}
/// See also [triggerBangSearch].
class TriggerBangSearchProvider extends AutoDisposeFutureProvider<Uri> {
/// See also [triggerBangSearch].
TriggerBangSearchProvider(
BangData bang,
String searchQuery,
) : this._internal(
(ref) => triggerBangSearch(
ref as TriggerBangSearchRef,
bang,
searchQuery,
),
from: triggerBangSearchProvider,
name: r'triggerBangSearchProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$triggerBangSearchHash,
dependencies: TriggerBangSearchFamily._dependencies,
allTransitiveDependencies:
TriggerBangSearchFamily._allTransitiveDependencies,
bang: bang,
searchQuery: searchQuery,
);
TriggerBangSearchProvider._internal(
super._createNotifier, {
required super.name,
required super.dependencies,
required super.allTransitiveDependencies,
required super.debugGetCreateSourceHash,
required super.from,
required this.bang,
required this.searchQuery,
}) : super.internal();
final BangData bang;
final String searchQuery;
@override
Override overrideWith(
FutureOr<Uri> Function(TriggerBangSearchRef provider) create,
) {
return ProviderOverride(
origin: this,
override: TriggerBangSearchProvider._internal(
(ref) => create(ref as TriggerBangSearchRef),
from: from,
name: null,
dependencies: null,
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
bang: bang,
searchQuery: searchQuery,
),
);
}
@override
AutoDisposeFutureProviderElement<Uri> createElement() {
return _TriggerBangSearchProviderElement(this);
}
@override
bool operator ==(Object other) {
return other is TriggerBangSearchProvider &&
other.bang == bang &&
other.searchQuery == searchQuery;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, bang.hashCode);
hash = _SystemHash.combine(hash, searchQuery.hashCode);
return _SystemHash.finish(hash);
}
}
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
mixin TriggerBangSearchRef on AutoDisposeFutureProviderRef<Uri> {
/// The parameter `bang` of this provider.
BangData get bang;
/// The parameter `searchQuery` of this provider.
String get searchQuery;
}
class _TriggerBangSearchProviderElement
extends AutoDisposeFutureProviderElement<Uri> with TriggerBangSearchRef {
_TriggerBangSearchProviderElement(super.provider);
@override
BangData get bang => (origin as TriggerBangSearchProvider).bang;
@override
String get searchQuery => (origin as TriggerBangSearchProvider).searchQuery;
}
typedef _$BangSearch = AutoDisposeNotifier<void>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package
@@ -1,8 +1,8 @@
import 'dart:convert';
import 'package:drift/drift.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
import 'package:lensai/features/bangs/data/models/search_history_entry.dart';
import 'package:lensai/features/bangs/data/providers.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -57,6 +57,6 @@ class SeamlessBangProvider extends _$SeamlessBangProvider {
AsyncValue<List<BangData>> build() {
return _hasSearch
? ref.watch(bangSearchProvider)
: ref.watch(frequentBangDataListProvider);
: ref.watch(frequentBangListProvider);
}
}
@@ -22,7 +22,7 @@ final bangSearchProvider =
typedef _$BangSearch = AutoDisposeStreamNotifier<List<BangData>>;
String _$seamlessBangProviderHash() =>
r'd2c8e94d6305a6a37cc27f8bc3617521f513e537';
r'c4c0b452c94ba447be5b02dfef5bc16148cc3dc7';
/// See also [SeamlessBangProvider].
@ProviderFor(SeamlessBangProvider)
@@ -1,9 +1,9 @@
import 'package:drift/isolate.dart';
import 'package:exceptions/exceptions.dart';
import 'package:lensai/features/bangs/data/database/database.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_group.dart';
import 'package:lensai/features/bangs/data/providers.dart';
import 'package:lensai/features/bangs/data/services/source.dart';
import 'package:lensai/features/bangs/data/services/data_source.dart';
import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
@@ -12,7 +12,7 @@ part 'sync.g.dart';
@Riverpod(keepAlive: true)
class BangSyncRepository extends _$BangSyncRepository {
static Future<Result<void>> _fetchAndSync({
required BangSourceService sourceService,
required BangDataSourceService sourceService,
required BangDatabase db,
required Uri url,
required BangGroup group,
@@ -20,7 +20,7 @@ class BangSyncRepository extends _$BangSyncRepository {
}) async {
if (syncInterval != null) {
final lastSync =
await db.syncDao.lastSyncOfGroup(group).getSingleOrNull();
await db.syncDao.getLastSyncOfGroup(group).getSingleOrNull();
if (lastSync != null &&
DateTime.now().difference(lastSync) < syncInterval) {
@@ -52,7 +52,9 @@ class BangSyncRepository extends _$BangSyncRepository {
computation: (db) async {
final ref = ProviderContainer();
final result = await _fetchAndSync(
sourceService: ref.read(bangSourceServiceProvider.notifier),
sourceService: ref.read(
bangDataSourceServiceProvider.notifier,
),
db: db,
url: Uri.parse(group.url),
group: group,
@@ -79,7 +81,7 @@ class BangSyncRepository extends _$BangSyncRepository {
return ref
.read(bangDatabaseProvider)
.syncDao
.lastSyncOfGroup(group)
.getLastSyncOfGroup(group)
.watchSingleOrNull();
}
@@ -7,7 +7,7 @@ part of 'sync.dart';
// **************************************************************************
String _$bangSyncRepositoryHash() =>
r'a46813f953e550585f432b11c364d87791819c34';
r'122dd04da82d4124e7c6be5234831bd62242845e';
/// See also [BangSyncRepository].
@ProviderFor(BangSyncRepository)
@@ -8,7 +8,6 @@ import 'package:lensai/features/bangs/presentation/widgets/bang_details.dart';
import 'package:lensai/features/geckoview/domain/controllers/bottom_sheet.dart';
import 'package:lensai/features/geckoview/features/browser/domain/entities/sheet.dart';
import 'package:lensai/features/geckoview/features/browser/domain/providers.dart';
import 'package:lensai/features/kagi/data/entities/modes.dart';
import 'package:lensai/presentation/widgets/failure_widget.dart';
class BangListScreen extends HookConsumerWidget {
@@ -20,14 +19,9 @@ class BangListScreen extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final bangsAsync = ref.watch(
bangDataListProvider(
filter: (
categoryFilter: category.mapNotNull(
(category) => (category: category, subCategory: subCategory),
),
domain: null,
groups: null,
orderMostFrequentFirst: null,
bangListProvider(
categoryFilter: category.mapNotNull(
(category) => (category: category, subCategory: subCategory),
),
),
);
@@ -49,16 +43,7 @@ class BangListScreen extends HookConsumerWidget {
.read(selectedBangTriggerProvider().notifier)
.setTrigger(bang.trigger);
if (ref.read(bottomSheetControllerProvider)
is! CreateTabSheet) {
ref
.read(bottomSheetControllerProvider.notifier)
.show(
CreateTabSheet(preferredTool: KagiTool.search),
);
}
context.go(BrowserRoute().location);
context.go(const SearchRoute().location);
},
);
},
@@ -74,14 +74,6 @@ class BangSearchScreen extends HookConsumerWidget {
.read(selectedBangTriggerProvider().notifier)
.setTrigger(bang.trigger);
// if (ref.read(bottomSheetControllerProvider)
// is! CreateTabSheet) {
// ref.read(bottomSheetControllerProvider.notifier).show(
// CreateTabSheet(preferredTool: KagiTool.search),
// );
// }
// context.go(BrowserRoute().location);
context.pop();
},
);
@@ -42,9 +42,9 @@ class SiteSearch extends HookConsumerWidget {
Future<void> submitSearch(String query) async {
if (activeBang != null && (formKey.currentState?.validate() == true)) {
final searchUri = await ref.read(
triggerBangSearchProvider(activeBang, query).future,
);
final searchUri = await ref
.read(bangSearchProvider.notifier)
.triggerBangSearch(activeBang, query);
await ref.read(tabRepositoryProvider.notifier).addTab(url: searchUri);