refactoring
This commit is contained in:
@@ -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';
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
+6
-3
@@ -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(
|
||||
+11
-10
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user