increase min sdk and apply new formatter

This commit is contained in:
Fabian Freund
2025-02-18 15:37:03 +01:00
parent f7885fc829
commit a1ee8bef35
266 changed files with 11329 additions and 10058 deletions
@@ -95,13 +95,9 @@ class BangDao extends DatabaseAccessor<BangDatabase> with _$BangDaoMixin {
final ftsQuery = db.buildFtsQuery(searchString);
if (ftsQuery.isNotEmpty) {
return db.queryBangs(
query: ftsQuery,
);
return db.queryBangs(query: ftsQuery);
} else {
return db.queryBangsBasic(
query: db.buildLikeQuery(searchString),
);
return db.queryBangsBasic(query: db.buildLikeQuery(searchString));
}
}
@@ -9,19 +9,17 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
SyncDao(super.db);
SingleOrNullSelectable<DateTime?> lastSyncOfGroup(BangGroup group) {
final query = selectOnly(db.bangSync)
..addColumns([db.bangSync.lastSync])
..where(db.bangSync.group.equalsValue(group));
final query =
selectOnly(db.bangSync)
..addColumns([db.bangSync.lastSync])
..where(db.bangSync.group.equalsValue(group));
return query.map((row) => row.read(db.bangSync.lastSync));
}
Future<void> upsertLastSyncOfGroup(BangGroup group, DateTime lastSync) {
return db.bangSync.insertOne(
BangSyncCompanion.insert(
group: Value(group),
lastSync: lastSync,
),
BangSyncCompanion.insert(group: Value(group), lastSync: lastSync),
onConflict: DoUpdate(
(old) => BangSyncCompanion.custom(lastSync: Variable(lastSync)),
),
@@ -33,11 +31,9 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
}
Future<void> replaceBangs(Iterable<Bang> bangs) {
return batch(
(batch) {
batch.replaceAll(db.bang, bangs);
},
);
return batch((batch) {
batch.replaceAll(db.bang, bangs);
});
}
Future<int> deleteBangs(Iterable<String> triggers) {
@@ -50,36 +46,34 @@ class SyncDao extends DatabaseAccessor<BangDatabase> with _$SyncDaoMixin {
required Iterable<Bang> remoteBangs,
required DateTime syncTime,
}) async {
final remoteBangMap =
Map.fromEntries(remoteBangs.map((e) => MapEntry(e.trigger, e)));
final localBangMap =
await db.bangDao.getBangList(groups: [group]).get().then(
(bangs) =>
Map.fromEntries(bangs.map((e) => MapEntry(e.trigger, e))),
);
final remoteBangMap = Map.fromEntries(
remoteBangs.map((e) => MapEntry(e.trigger, e)),
);
final localBangMap = await db.bangDao
.getBangList(groups: [group])
.get()
.then(
(bangs) => Map.fromEntries(bangs.map((e) => MapEntry(e.trigger, e))),
);
final remoteBangTriggers = remoteBangMap.keys.toSet();
final localBangTriggers = localBangMap.keys.toSet();
final removedBangs = localBangTriggers.difference(remoteBangTriggers);
final addedBangs = remoteBangTriggers.difference(localBangTriggers).map(
(e) => remoteBangMap[e]!,
);
final addedBangs = remoteBangTriggers
.difference(localBangTriggers)
.map((e) => remoteBangMap[e]!);
final changedBangs = remoteBangTriggers
.intersection(localBangTriggers)
.where((e) => remoteBangMap[e] != localBangMap[e])
.map(
(e) => remoteBangMap[e]!,
);
.map((e) => remoteBangMap[e]!);
await db.transaction(
() async {
await deleteBangs(removedBangs);
await insertBangs(addedBangs);
await replaceBangs(changedBangs);
await upsertLastSyncOfGroup(group, syncTime);
},
);
await db.transaction(() async {
await deleteBangs(removedBangs);
await insertBangs(addedBangs);
await replaceBangs(changedBangs);
await upsertLastSyncOfGroup(group, syncTime);
});
}
}
@@ -9,10 +9,7 @@ import 'package:lensai/features/search/domain/fts_tokenizer.dart';
part 'database.g.dart';
@DriftDatabase(
include: {'database.drift'},
daos: [BangDao, SyncDao],
)
@DriftDatabase(include: {'database.drift'}, daos: [BangDao, SyncDao])
class BangDatabase extends _$BangDatabase with PrefixQueryBuilderMixin {
@override
final int schemaVersion = 1;
@@ -24,10 +21,10 @@ class BangDatabase extends _$BangDatabase with PrefixQueryBuilderMixin {
@override
MigrationStrategy get migration => MigrationStrategy(
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON;');
},
);
beforeOpen: (details) async {
await customStatement('PRAGMA foreign_keys = ON;');
},
);
BangDatabase(super.e);
}
File diff suppressed because it is too large Load Diff
+20 -19
View File
@@ -8,9 +8,7 @@ import 'package:lensai/features/bangs/data/database/database.dart'
part 'bang.g.dart';
enum BangGroup {
general(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json',
),
general('https://raw.githubusercontent.com/FaFre/bangs/main/data/bangs.json'),
assistant(
'https://raw.githubusercontent.com/FaFre/bangs/main/data/assistant_bangs.json',
),
@@ -90,16 +88,19 @@ class Bang with FastEquatable implements Insertable<Bang> {
}
Uri getUrl(String? query) {
final url = (query != null)
? urlTemplate.replaceAll(_templateQueryPlaceholder, formatQuery(query))
: urlTemplate;
final url =
(query != null)
? urlTemplate.replaceAll(
_templateQueryPlaceholder,
formatQuery(query),
)
: urlTemplate;
var template = Uri.parse(url);
if (!template.hasScheme || template.origin.isEmpty) {
template = Uri.https(domain).replace(
path: template.path,
query: template.query,
);
template = Uri.https(
domain,
).replace(path: template.path, query: template.query);
}
return template;
@@ -133,15 +134,15 @@ class Bang with FastEquatable implements Insertable<Bang> {
@override
List<Object?> get hashParameters => [
group,
websiteName,
domain,
trigger,
urlTemplate,
category,
subCategory,
format,
];
group,
websiteName,
domain,
trigger,
urlTemplate,
category,
subCategory,
format,
];
@override
Map<String, Expression<Object>> toColumns(bool nullToAbsent) {
+57 -49
View File
@@ -72,7 +72,6 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
Bang format(Set<BangFormat>? format) => this(format: format);
@override
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `Bang(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
///
/// Usage
@@ -90,38 +89,46 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
Object? format = const $CopyWithPlaceholder(),
}) {
return Bang(
websiteName: websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain: domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger: trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate: urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
group: group == const $CopyWithPlaceholder()
? _value.group
// ignore: cast_nullable_to_non_nullable
: group as BangGroup?,
category: category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory: subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format: format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
websiteName:
websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain:
domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger:
trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate:
urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
group:
group == const $CopyWithPlaceholder()
? _value.group
// ignore: cast_nullable_to_non_nullable
: group as BangGroup?,
category:
category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory:
subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format:
format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
);
}
}
@@ -137,26 +144,27 @@ extension $BangCopyWith on Bang {
// **************************************************************************
Bang _$BangFromJson(Map<String, dynamic> json) => Bang(
websiteName: json['s'] as String,
domain: json['d'] as String,
trigger: json['t'] as String,
urlTemplate: json['u'] as String,
category: json['c'] as String?,
subCategory: json['sc'] as String?,
format: (json['fmt'] as List<dynamic>?)
websiteName: json['s'] as String,
domain: json['d'] as String,
trigger: json['t'] as String,
urlTemplate: json['u'] as String,
category: json['c'] as String?,
subCategory: json['sc'] as String?,
format:
(json['fmt'] as List<dynamic>?)
?.map((e) => $enumDecode(_$BangFormatEnumMap, e))
.toSet(),
);
);
Map<String, dynamic> _$BangToJson(Bang instance) => <String, dynamic>{
's': instance.websiteName,
'd': instance.domain,
't': instance.trigger,
'u': instance.urlTemplate,
'c': instance.category,
'sc': instance.subCategory,
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
};
's': instance.websiteName,
'd': instance.domain,
't': instance.trigger,
'u': instance.urlTemplate,
'c': instance.category,
'sc': instance.subCategory,
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
};
const _$BangFormatEnumMap = {
BangFormat.openBasePath: 'open_base_path',
@@ -29,9 +29,9 @@ class BangData extends Bang {
@override
List<Object?> get hashParameters => [
...super.hashParameters,
frequency,
lastUsed,
icon,
];
...super.hashParameters,
frequency,
lastUsed,
icon,
];
}
@@ -84,7 +84,6 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
BangData icon(BrowserIcon? icon) => this(icon: icon);
@override
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `BangData(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
///
/// Usage
@@ -104,46 +103,56 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
Object? icon = const $CopyWithPlaceholder(),
}) {
return BangData(
websiteName: websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain: domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger: trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate: urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
category: category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory: subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format: format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
frequency: frequency == const $CopyWithPlaceholder()
? _value.frequency
// ignore: cast_nullable_to_non_nullable
: frequency as int?,
lastUsed: lastUsed == const $CopyWithPlaceholder()
? _value.lastUsed
// ignore: cast_nullable_to_non_nullable
: lastUsed as DateTime?,
icon: icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as BrowserIcon?,
websiteName:
websiteName == const $CopyWithPlaceholder()
? _value.websiteName
// ignore: cast_nullable_to_non_nullable
: websiteName as String,
domain:
domain == const $CopyWithPlaceholder()
? _value.domain
// ignore: cast_nullable_to_non_nullable
: domain as String,
trigger:
trigger == const $CopyWithPlaceholder()
? _value.trigger
// ignore: cast_nullable_to_non_nullable
: trigger as String,
urlTemplate:
urlTemplate == const $CopyWithPlaceholder()
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
category:
category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
: category as String?,
subCategory:
subCategory == const $CopyWithPlaceholder()
? _value.subCategory
// ignore: cast_nullable_to_non_nullable
: subCategory as String?,
format:
format == const $CopyWithPlaceholder()
? _value.format
// ignore: cast_nullable_to_non_nullable
: format as Set<BangFormat>?,
frequency:
frequency == const $CopyWithPlaceholder()
? _value.frequency
// ignore: cast_nullable_to_non_nullable
: frequency as int?,
lastUsed:
lastUsed == const $CopyWithPlaceholder()
? _value.lastUsed
// ignore: cast_nullable_to_non_nullable
: lastUsed as DateTime?,
icon:
icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as BrowserIcon?,
);
}
}
@@ -15,9 +15,5 @@ class SearchHistoryEntry with FastEquatable {
bool get cacheHash => true;
@override
List<Object?> get hashParameters => [
searchQuery,
trigger,
searchDate,
];
List<Object?> get hashParameters => [searchQuery, trigger, searchDate];
}
@@ -19,25 +19,22 @@ class BangSourceService extends _$BangSourceService {
}
Future<Result<List<Bang>>> getBangs(Uri url, BangGroup? group) async {
return Result.fromAsync(
() async {
final response = await _client.get(url);
return await compute(
(args) => jsonDecode(utf8.decode(args[0])) as List,
[response.bodyBytes],
).then(
(json) => json.map((e) {
var bang = Bang.fromJson(e as Map<String, dynamic>);
return Result.fromAsync(() async {
final response = await _client.get(url);
return await compute((args) => jsonDecode(utf8.decode(args[0])) as List, [
response.bodyBytes,
]).then(
(json) =>
json.map((e) {
var bang = Bang.fromJson(e as Map<String, dynamic>);
if (group != null) {
bang = bang.copyWith.group(group);
}
if (group != null) {
bang = bang.copyWith.group(group);
}
return bang;
}).toList(),
);
},
exceptionHandler: handleHttpError,
);
return bang;
}).toList(),
);
}, exceptionHandler: handleHttpError);
}
}
@@ -12,14 +12,15 @@ String _$bangSourceServiceHash() => r'2f734d563fa20de306a72013526ef1f72f910fe1';
@ProviderFor(BangSourceService)
final bangSourceServiceProvider =
AutoDisposeNotifierProvider<BangSourceService, void>.internal(
BangSourceService.new,
name: r'bangSourceServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSourceServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
BangSourceService.new,
name: r'bangSourceServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSourceServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BangSourceService = AutoDisposeNotifier<void>;
// ignore_for_file: type=lint
@@ -34,7 +34,8 @@ Stream<List<BangData>> bangDataList(
String? domain,
({String category, String? subCategory})? categoryFilter,
bool? orderMostFrequentFirst,
})? filter,
})?
filter,
}) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchBangs(
@@ -58,19 +59,13 @@ Stream<List<SearchHistoryEntry>> searchHistory(Ref ref) {
}
@Riverpod()
Stream<DateTime?> lastSyncOfGroup(
Ref ref,
BangGroup group,
) {
Stream<DateTime?> lastSyncOfGroup(Ref ref, BangGroup group) {
final repository = ref.watch(bangSyncRepositoryProvider.notifier);
return repository.watchLastSyncOfGroup(group);
}
@Riverpod()
Stream<int> bangCountOfGroup(
Ref ref,
BangGroup group,
) {
Stream<int> bangCountOfGroup(Ref ref, BangGroup group) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchBangCount(group);
}
@@ -39,21 +39,13 @@ class BangDataFamily extends Family<AsyncValue<BangData?>> {
const BangDataFamily();
/// See also [bangData].
BangDataProvider call(
String? trigger,
) {
return BangDataProvider(
trigger,
);
BangDataProvider call(String? trigger) {
return BangDataProvider(trigger);
}
@override
BangDataProvider getProviderOverride(
covariant BangDataProvider provider,
) {
return call(
provider.trigger,
);
BangDataProvider getProviderOverride(covariant BangDataProvider provider) {
return call(provider.trigger);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -74,23 +66,19 @@ class BangDataFamily extends Family<AsyncValue<BangData?>> {
/// 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(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, {
@@ -149,7 +137,8 @@ mixin BangDataRef on AutoDisposeStreamProviderRef<BangData?> {
}
class _BangDataProviderElement
extends AutoDisposeStreamProviderElement<BangData?> with BangDataRef {
extends AutoDisposeStreamProviderElement<BangData?>
with BangDataRef {
_BangDataProviderElement(super.provider);
@override
@@ -164,9 +153,10 @@ String _$defaultSearchBangDataHash() =>
final defaultSearchBangDataProvider = StreamProvider<BangData?>.internal(
defaultSearchBangData,
name: r'defaultSearchBangDataProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$defaultSearchBangDataHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$defaultSearchBangDataHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -180,19 +170,20 @@ String _$bangCategoriesHash() => r'947fcfd2dffcc7f585c6ed7379d319f4fe72293a';
@ProviderFor(bangCategories)
final bangCategoriesProvider =
AutoDisposeStreamProvider<Map<String, List<String>>>.internal(
bangCategories,
name: r'bangCategoriesProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bangCategoriesHash,
dependencies: null,
allTransitiveDependencies: null,
);
bangCategories,
name: r'bangCategoriesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangCategoriesHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef BangCategoriesRef
= AutoDisposeStreamProviderRef<Map<String, List<String>>>;
typedef BangCategoriesRef =
AutoDisposeStreamProviderRef<Map<String, List<String>>>;
String _$bangDataListHash() => r'cd034fdf046b156ac452edd0857ac054ab477917';
/// See also [bangDataList].
@@ -210,21 +201,18 @@ class BangDataListFamily extends Family<AsyncValue<List<BangData>>> {
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? filter,
bool? orderMostFrequentFirst,
})?
filter,
}) {
return BangDataListProvider(
filter: filter,
);
return BangDataListProvider(filter: filter);
}
@override
BangDataListProvider getProviderOverride(
covariant BangDataListProvider provider,
) {
return call(
filter: provider.filter,
);
return call(filter: provider.filter);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -250,24 +238,22 @@ class BangDataListProvider extends AutoDisposeStreamProvider<List<BangData>> {
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? filter,
bool? orderMostFrequentFirst,
})?
filter,
}) : this._internal(
(ref) => bangDataList(
ref as BangDataListRef,
filter: filter,
),
from: bangDataListProvider,
name: r'bangDataListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangDataListHash,
dependencies: BangDataListFamily._dependencies,
allTransitiveDependencies:
BangDataListFamily._allTransitiveDependencies,
filter: filter,
);
(ref) => bangDataList(ref as BangDataListRef, filter: filter),
from: bangDataListProvider,
name: r'bangDataListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangDataListHash,
dependencies: BangDataListFamily._dependencies,
allTransitiveDependencies:
BangDataListFamily._allTransitiveDependencies,
filter: filter,
);
BangDataListProvider._internal(
super._createNotifier, {
@@ -283,8 +269,9 @@ class BangDataListProvider extends AutoDisposeStreamProvider<List<BangData>> {
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? filter;
bool? orderMostFrequentFirst,
})?
filter;
@override
Override overrideWith(
@@ -331,8 +318,9 @@ mixin BangDataListRef on AutoDisposeStreamProviderRef<List<BangData>> {
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? get filter;
bool? orderMostFrequentFirst,
})?
get filter;
}
class _BangDataListProviderElement
@@ -345,8 +333,9 @@ class _BangDataListProviderElement
({String category, String? subCategory})? categoryFilter,
String? domain,
Iterable<BangGroup>? groups,
bool? orderMostFrequentFirst
})? get filter => (origin as BangDataListProvider).filter;
bool? orderMostFrequentFirst,
})?
get filter => (origin as BangDataListProvider).filter;
}
String _$frequentBangDataListHash() =>
@@ -356,14 +345,15 @@ String _$frequentBangDataListHash() =>
@ProviderFor(frequentBangDataList)
final frequentBangDataListProvider =
AutoDisposeStreamProvider<List<BangData>>.internal(
frequentBangDataList,
name: r'frequentBangDataListProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$frequentBangDataListHash,
dependencies: null,
allTransitiveDependencies: null,
);
frequentBangDataList,
name: r'frequentBangDataListProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$frequentBangDataListHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
@@ -374,19 +364,20 @@ String _$searchHistoryHash() => r'7b97798729643de8e44fd8024cdc02f35124b08b';
@ProviderFor(searchHistory)
final searchHistoryProvider =
AutoDisposeStreamProvider<List<SearchHistoryEntry>>.internal(
searchHistory,
name: r'searchHistoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$searchHistoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
searchHistory,
name: r'searchHistoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$searchHistoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef SearchHistoryRef
= AutoDisposeStreamProviderRef<List<SearchHistoryEntry>>;
typedef SearchHistoryRef =
AutoDisposeStreamProviderRef<List<SearchHistoryEntry>>;
String _$lastSyncOfGroupHash() => r'23d07f3132ba9bb35a31f74e3a69698d31d4c569';
/// See also [lastSyncOfGroup].
@@ -399,21 +390,15 @@ class LastSyncOfGroupFamily extends Family<AsyncValue<DateTime?>> {
const LastSyncOfGroupFamily();
/// See also [lastSyncOfGroup].
LastSyncOfGroupProvider call(
BangGroup group,
) {
return LastSyncOfGroupProvider(
group,
);
LastSyncOfGroupProvider call(BangGroup group) {
return LastSyncOfGroupProvider(group);
}
@override
LastSyncOfGroupProvider getProviderOverride(
covariant LastSyncOfGroupProvider provider,
) {
return call(
provider.group,
);
return call(provider.group);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -434,24 +419,20 @@ class LastSyncOfGroupFamily extends Family<AsyncValue<DateTime?>> {
/// See also [lastSyncOfGroup].
class LastSyncOfGroupProvider extends AutoDisposeStreamProvider<DateTime?> {
/// See also [lastSyncOfGroup].
LastSyncOfGroupProvider(
BangGroup group,
) : this._internal(
(ref) => lastSyncOfGroup(
ref as LastSyncOfGroupRef,
group,
),
from: lastSyncOfGroupProvider,
name: r'lastSyncOfGroupProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$lastSyncOfGroupHash,
dependencies: LastSyncOfGroupFamily._dependencies,
allTransitiveDependencies:
LastSyncOfGroupFamily._allTransitiveDependencies,
group: group,
);
LastSyncOfGroupProvider(BangGroup group)
: this._internal(
(ref) => lastSyncOfGroup(ref as LastSyncOfGroupRef, group),
from: lastSyncOfGroupProvider,
name: r'lastSyncOfGroupProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$lastSyncOfGroupHash,
dependencies: LastSyncOfGroupFamily._dependencies,
allTransitiveDependencies:
LastSyncOfGroupFamily._allTransitiveDependencies,
group: group,
);
LastSyncOfGroupProvider._internal(
super._createNotifier, {
@@ -530,21 +511,15 @@ class BangCountOfGroupFamily extends Family<AsyncValue<int>> {
const BangCountOfGroupFamily();
/// See also [bangCountOfGroup].
BangCountOfGroupProvider call(
BangGroup group,
) {
return BangCountOfGroupProvider(
group,
);
BangCountOfGroupProvider call(BangGroup group) {
return BangCountOfGroupProvider(group);
}
@override
BangCountOfGroupProvider getProviderOverride(
covariant BangCountOfGroupProvider provider,
) {
return call(
provider.group,
);
return call(provider.group);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -565,24 +540,20 @@ class BangCountOfGroupFamily extends Family<AsyncValue<int>> {
/// See also [bangCountOfGroup].
class BangCountOfGroupProvider extends AutoDisposeStreamProvider<int> {
/// See also [bangCountOfGroup].
BangCountOfGroupProvider(
BangGroup group,
) : this._internal(
(ref) => bangCountOfGroup(
ref as BangCountOfGroupRef,
group,
),
from: bangCountOfGroupProvider,
name: r'bangCountOfGroupProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangCountOfGroupHash,
dependencies: BangCountOfGroupFamily._dependencies,
allTransitiveDependencies:
BangCountOfGroupFamily._allTransitiveDependencies,
group: group,
);
BangCountOfGroupProvider(BangGroup group)
: this._internal(
(ref) => bangCountOfGroup(ref as BangCountOfGroupRef, group),
from: bangCountOfGroupProvider,
name: r'bangCountOfGroupProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangCountOfGroupHash,
dependencies: BangCountOfGroupFamily._dependencies,
allTransitiveDependencies:
BangCountOfGroupFamily._allTransitiveDependencies,
group: group,
);
BangCountOfGroupProvider._internal(
super._createNotifier, {
@@ -641,11 +612,13 @@ mixin BangCountOfGroupRef on AutoDisposeStreamProviderRef<int> {
}
class _BangCountOfGroupProviderElement
extends AutoDisposeStreamProviderElement<int> with BangCountOfGroupRef {
extends AutoDisposeStreamProviderElement<int>
with BangCountOfGroupRef {
_BangCountOfGroupProviderElement(super.provider);
@override
BangGroup get group => (origin as BangCountOfGroupProvider).group;
}
// 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
@@ -39,24 +39,15 @@ class TriggerBangSearchFamily extends Family<AsyncValue<Uri>> {
const TriggerBangSearchFamily();
/// See also [triggerBangSearch].
TriggerBangSearchProvider call(
BangData bang,
String searchQuery,
) {
return TriggerBangSearchProvider(
bang,
searchQuery,
);
TriggerBangSearchProvider call(BangData bang, String searchQuery) {
return TriggerBangSearchProvider(bang, searchQuery);
}
@override
TriggerBangSearchProvider getProviderOverride(
covariant TriggerBangSearchProvider provider,
) {
return call(
provider.bang,
provider.searchQuery,
);
return call(provider.bang, provider.searchQuery);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -77,27 +68,22 @@ class TriggerBangSearchFamily extends Family<AsyncValue<Uri>> {
/// 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(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, {
@@ -165,7 +151,8 @@ mixin TriggerBangSearchRef on AutoDisposeFutureProviderRef<Uri> {
}
class _TriggerBangSearchProviderElement
extends AutoDisposeFutureProviderElement<Uri> with TriggerBangSearchRef {
extends AutoDisposeFutureProviderElement<Uri>
with TriggerBangSearchRef {
_TriggerBangSearchProviderElement(super.provider);
@override
@@ -173,5 +160,6 @@ class _TriggerBangSearchProviderElement
@override
String get searchQuery => (origin as TriggerBangSearchProvider).searchQuery;
}
// 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
@@ -27,11 +27,9 @@ class BangDataRepository extends _$BangDataRepository {
}
Stream<Map<String, List<String>>> watchCategories() {
return ref
.read(bangDatabaseProvider)
.categoriesJson()
.watchSingle()
.map((json) {
return ref.read(bangDatabaseProvider).categoriesJson().watchSingle().map((
json,
) {
final decoded = jsonDecode(json) as Map<String, dynamic>;
return decoded.map(
(key, value) => MapEntry(key, (value as List<dynamic>).cast()),
@@ -43,7 +41,8 @@ class BangDataRepository extends _$BangDataRepository {
return ref
.read(bangDatabaseProvider)
.bangDao
.getBangCount(groups: [group]).watchSingle();
.getBangCount(groups: [group])
.watchSingle();
}
Stream<List<BangData>> watchBangs({
@@ -94,12 +93,10 @@ class BangDataRepository extends _$BangDataRepository {
}) {
final db = ref.read(bangDatabaseProvider);
//Pack in a transaction to bundle rebuilds of watch() queries
return db.transaction(
() async {
await db.bangDao.addSearchEntry(trigger, searchQuery);
await db.evictHistoryEntries(limit: maxEntryCount);
},
);
return db.transaction(() async {
await db.bangDao.addSearchEntry(trigger, searchQuery);
await db.evictHistoryEntries(limit: maxEntryCount);
});
}
Future<void> removeSearchEntry(String searchQuery) {
@@ -13,14 +13,15 @@ String _$bangDataRepositoryHash() =>
@ProviderFor(BangDataRepository)
final bangDataRepositoryProvider =
NotifierProvider<BangDataRepository, void>.internal(
BangDataRepository.new,
name: r'bangDataRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bangDataRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
BangDataRepository.new,
name: r'bangDataRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangDataRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BangDataRepository = Notifier<void>;
// ignore_for_file: type=lint
@@ -12,13 +12,15 @@ String _$bangSearchHash() => r'abf9ff5badf2ecfbcbde148fd2c849beac83bec4';
@ProviderFor(BangSearch)
final bangSearchProvider =
AutoDisposeStreamNotifierProvider<BangSearch, List<BangData>>.internal(
BangSearch.new,
name: r'bangSearchProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$bangSearchHash,
dependencies: null,
allTransitiveDependencies: null,
);
BangSearch.new,
name: r'bangSearchProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSearchHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BangSearch = AutoDisposeStreamNotifier<List<BangData>>;
String _$seamlessBangProviderHash() =>
@@ -27,17 +29,20 @@ String _$seamlessBangProviderHash() =>
/// See also [SeamlessBangProvider].
@ProviderFor(SeamlessBangProvider)
final seamlessBangProviderProvider = AutoDisposeNotifierProvider<
SeamlessBangProvider, AsyncValue<List<BangData>>>.internal(
SeamlessBangProvider,
AsyncValue<List<BangData>>
>.internal(
SeamlessBangProvider.new,
name: r'seamlessBangProviderProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessBangProviderHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessBangProviderHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$SeamlessBangProvider
= AutoDisposeNotifier<AsyncValue<List<BangData>>>;
typedef _$SeamlessBangProvider =
AutoDisposeNotifier<AsyncValue<List<BangData>>>;
// 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
@@ -29,16 +29,14 @@ class BangSyncRepository extends _$BangSyncRepository {
}
final result = await sourceService.getBangs(url, group);
return result.flatMapAsync(
(remoteBangs) async {
await db.syncDao.syncBangs(
group: group,
remoteBangs: remoteBangs,
syncTime: DateTime.now(),
);
await db.optimizeFtsIndex();
},
);
return result.flatMapAsync((remoteBangs) async {
await db.syncDao.syncBangs(
group: group,
remoteBangs: remoteBangs,
syncTime: DateTime.now(),
);
await db.optimizeFtsIndex();
});
}
Future<Result<void>> syncBangGroup(
@@ -47,7 +45,9 @@ class BangSyncRepository extends _$BangSyncRepository {
) async {
try {
return Result.success(
await ref.read(bangDatabaseProvider).computeWithDatabase(
await ref
.read(bangDatabaseProvider)
.computeWithDatabase(
connect: BangDatabase.new,
computation: (db) async {
final ref = ProviderContainer();
@@ -92,8 +92,10 @@ class BangSyncRepository extends _$BangSyncRepository {
//Run isolated operations
final futures = groups.map(
(source) => syncBangGroup(source, syncInterval)
.then((result) => MapEntry(source, result)),
(source) => syncBangGroup(
source,
syncInterval,
).then((result) => MapEntry(source, result)),
);
return Map.fromEntries(await Future.wait(futures));
@@ -13,14 +13,15 @@ String _$bangSyncRepositoryHash() =>
@ProviderFor(BangSyncRepository)
final bangSyncRepositoryProvider =
NotifierProvider<BangSyncRepository, void>.internal(
BangSyncRepository.new,
name: r'bangSyncRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSyncRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
BangSyncRepository.new,
name: r'bangSyncRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bangSyncRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BangSyncRepository = Notifier<void>;
// ignore_for_file: type=lint
@@ -45,38 +45,43 @@ class BangCategoriesScreen extends HookConsumerWidget {
expanded.value = {...expanded.value}..remove(key);
}
},
children: categories.entries
.map(
(category) => ExpansionPanel(
canTapOnHeader: true,
isExpanded: expanded.value.contains(category.key),
headerBuilder: (context, isExpanded) => ListTile(
title: Text(category.key),
),
body: Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: category.value
.map(
(subCategory) => ListTile(
title: Text(subCategory),
onTap: () async {
await context.push(
BangSubCategoryRoute(
category: category.key,
subCategory: subCategory,
).location,
);
},
),
)
.toList(),
children:
categories.entries
.map(
(category) => ExpansionPanel(
canTapOnHeader: true,
isExpanded: expanded.value.contains(
category.key,
),
headerBuilder:
(context, isExpanded) =>
ListTile(title: Text(category.key)),
body: Padding(
padding: const EdgeInsets.only(left: 16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children:
category.value
.map(
(subCategory) => ListTile(
title: Text(subCategory),
onTap: () async {
await context.push(
BangSubCategoryRoute(
category: category.key,
subCategory:
subCategory,
).location,
);
},
),
)
.toList(),
),
),
),
),
),
)
.toList(),
)
.toList(),
);
},
),
@@ -84,12 +89,13 @@ class BangCategoriesScreen extends HookConsumerWidget {
},
);
},
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Failed to load Bang Categories',
exception: error,
),
),
error:
(error, stackTrace) => Center(
child: FailureWidget(
title: 'Failed to load Bang Categories',
exception: error,
),
),
loading: () => const Center(child: CircularProgressIndicator()),
),
);
@@ -35,9 +35,7 @@ class BangListScreen extends HookConsumerWidget {
return Scaffold(
body: CustomScrollView(
slivers: [
SliverAppBar.medium(
title: Text('$category: $subCategory'),
),
SliverAppBar.medium(title: Text('$category: $subCategory')),
bangsAsync.when(
data: (bangs) {
return SliverList.builder(
@@ -53,10 +51,10 @@ class BangListScreen extends HookConsumerWidget {
if (ref.read(bottomSheetControllerProvider)
is! CreateTabSheet) {
ref.read(bottomSheetControllerProvider.notifier).show(
CreateTabSheet(
preferredTool: KagiTool.search,
),
ref
.read(bottomSheetControllerProvider.notifier)
.show(
CreateTabSheet(preferredTool: KagiTool.search),
);
}
@@ -66,17 +64,19 @@ class BangListScreen extends HookConsumerWidget {
},
);
},
error: (error, stackTrace) => SliverToBoxAdapter(
child: Center(
child: FailureWidget(
title: 'Failed to load Bangs',
exception: error,
error:
(error, stackTrace) => SliverToBoxAdapter(
child: Center(
child: FailureWidget(
title: 'Failed to load Bangs',
exception: error,
),
),
),
loading:
() => const SliverToBoxAdapter(
child: Center(child: CircularProgressIndicator()),
),
),
),
loading: () => const SliverToBoxAdapter(
child: Center(child: CircularProgressIndicator()),
),
),
],
),
@@ -22,8 +22,9 @@ class BangSearchScreen extends HookConsumerWidget {
final resultsAsync = ref.watch(bangSearchProvider);
final incognitoEnabled = ref.watch(incognitoModeEnabledProvider);
final textEditingController =
useTextEditingController(text: initialSearchText);
final textEditingController = useTextEditingController(
text: initialSearchText,
);
useListenableCallback(textEditingController, () async {
unawaited(
@@ -57,42 +58,44 @@ class BangSearchScreen extends HookConsumerWidget {
),
body: resultsAsync.when(
skipLoadingOnReload: true,
data: (bangs) => FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return ListView.builder(
controller: controller,
itemCount: bangs.length,
itemBuilder: (context, index) {
final bang = bangs[index];
return BangDetails(
bang,
onTap: () {
ref
.read(selectedBangTriggerProvider().notifier)
.setTrigger(bang.trigger);
data:
(bangs) => FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return ListView.builder(
controller: controller,
itemCount: bangs.length,
itemBuilder: (context, index) {
final bang = bangs[index];
return BangDetails(
bang,
onTap: () {
ref
.read(selectedBangTriggerProvider().notifier)
.setTrigger(bang.trigger);
// if (ref.read(bottomSheetControllerProvider)
// is! CreateTabSheet) {
// ref.read(bottomSheetControllerProvider.notifier).show(
// CreateTabSheet(preferredTool: KagiTool.search),
// );
// }
// if (ref.read(bottomSheetControllerProvider)
// is! CreateTabSheet) {
// ref.read(bottomSheetControllerProvider.notifier).show(
// CreateTabSheet(preferredTool: KagiTool.search),
// );
// }
// context.go(BrowserRoute().location);
context.pop();
// context.go(BrowserRoute().location);
context.pop();
},
);
},
);
},
);
},
),
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Bang Search failed',
exception: error,
),
),
),
error:
(error, stackTrace) => Center(
child: FailureWidget(
title: 'Bang Search failed',
exception: error,
),
),
loading: () => const SizedBox.shrink(),
),
);
@@ -63,8 +63,9 @@ class BangDetails extends HookConsumerWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
FilledButton.tonalIcon(
style:
const ButtonStyle(visualDensity: VisualDensity.compact),
style: const ButtonStyle(
visualDensity: VisualDensity.compact,
),
onPressed: () async {
final url = Uri.parse(bangData.getUrl('').origin);
@@ -79,9 +80,7 @@ class BangDetails extends HookConsumerWidget {
label: Text(bangData.domain),
icon: const Icon(Icons.open_in_new),
),
const SizedBox(
width: 8,
),
const SizedBox(width: 8),
Expanded(
child: Text(
'!${bangData.trigger}',
@@ -30,14 +30,11 @@ class SiteSearch extends HookConsumerWidget {
final searchTextController = useTextEditingController();
useListenableCallback(
searchTextController,
() async {
ref
.read(searchSuggestionsProvider().notifier)
.addQuery(searchTextController.text);
},
);
useListenableCallback(searchTextController, () async {
ref
.read(searchSuggestionsProvider().notifier)
.addQuery(searchTextController.text);
});
final selectedBang = ref.watch(selectedBangDataProvider(domain: domain));
@@ -73,15 +70,11 @@ class SiteSearch extends HookConsumerWidget {
selectedItem: selectedBang,
onSelected: (bang) {
ref
.read(
selectedBangTriggerProvider(domain: domain).notifier,
)
.read(selectedBangTriggerProvider(domain: domain).notifier)
.setTrigger(bang.trigger);
},
onDeleted: (bang) {
if (ref.read(
selectedBangTriggerProvider(domain: domain),
) ==
if (ref.read(selectedBangTriggerProvider(domain: domain)) ==
bang.trigger) {
ref
.read(