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
@@ -12,13 +12,12 @@ FutureOr<bool> widgetPinnable(Ref ref) async {
}
@Riverpod()
Raw<Stream<ReceivedParameter>> appWidgetLaunchStream(
Ref ref,
) {
Raw<Stream<ReceivedParameter>> appWidgetLaunchStream(Ref ref) {
// ignore: discarded_futures
final initialStream = HomeWidget.initiallyLaunchedFromHomeWidget().asStream();
return ConcatStream([initialStream, HomeWidget.widgetClicked])
.whereNotNull()
.map((uri) => ReceivedParameter(null, uri.host));
return ConcatStream([
initialStream,
HomeWidget.widgetClicked,
]).whereNotNull().map((uri) => ReceivedParameter(null, uri.host));
}
@@ -13,9 +13,10 @@ String _$widgetPinnableHash() => r'f91041f0f051ad0f00dd765cafea5571ca8c8088';
final widgetPinnableProvider = FutureProvider<bool>.internal(
widgetPinnable,
name: r'widgetPinnableProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$widgetPinnableHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$widgetPinnableHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -30,18 +31,19 @@ String _$appWidgetLaunchStreamHash() =>
@ProviderFor(appWidgetLaunchStream)
final appWidgetLaunchStreamProvider =
AutoDisposeProvider<Raw<Stream<ReceivedParameter>>>.internal(
appWidgetLaunchStream,
name: r'appWidgetLaunchStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$appWidgetLaunchStreamHash,
dependencies: null,
allTransitiveDependencies: null,
);
appWidgetLaunchStream,
name: r'appWidgetLaunchStreamProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$appWidgetLaunchStreamHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
typedef AppWidgetLaunchStreamRef
= AutoDisposeProviderRef<Raw<Stream<ReceivedParameter>>>;
typedef AppWidgetLaunchStreamRef =
AutoDisposeProviderRef<Raw<Stream<ReceivedParameter>>>;
// 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
@@ -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(
@@ -13,9 +13,7 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
MessagesDao(super.db);
Selectable<int> messageCount({required String chatId}) {
return db.chatMessage.count(
where: (row) => row.chatId.equals(chatId),
);
return db.chatMessage.count(where: (row) => row.chatId.equals(chatId));
}
Selectable<ChatMessageData> chatMessages({required String chatId}) {
@@ -29,9 +27,9 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
db.chatMessage.select()..where((row) => row.messageId.equals(messageId)),
);
return db.selectExpressions([existsExpression]).map(
(row) => row.read(existsExpression)!,
);
return db
.selectExpressions([existsExpression])
.map((row) => row.read(existsExpression)!);
}
SingleOrNullSelectable<int> messageIndex({
@@ -52,39 +50,39 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
return null;
}
return db.transaction(
() async {
final String orderKey;
if (index != null) {
if (index <= 0) {
orderKey =
await db.leadingOrderKey(bucket: 0, chatId: chatId).getSingle();
} else {
orderKey = await db
.orderKeyBeforeIndex(chatId: chatId, rowIdx: index + 1)
.getSingle();
}
return db.transaction(() async {
final String orderKey;
if (index != null) {
if (index <= 0) {
orderKey =
await db.leadingOrderKey(bucket: 0, chatId: chatId).getSingle();
} else {
orderKey =
await db.trailingOrderKey(bucket: 0, chatId: chatId).getSingle();
await db
.orderKeyBeforeIndex(chatId: chatId, rowIdx: index + 1)
.getSingle();
}
} else {
orderKey =
await db.trailingOrderKey(bucket: 0, chatId: chatId).getSingle();
}
await db.chatMessage.insertOne(
ChatMessageCompanion.insert(
messageId: message.id,
chatId: chatId,
orderKey: orderKey,
messageJson: jsonEncode(message.toJson()),
),
);
await db.chatMessage.insertOne(
ChatMessageCompanion.insert(
messageId: message.id,
chatId: chatId,
orderKey: orderKey,
messageJson: jsonEncode(message.toJson()),
),
);
final rowIdx = await db
.messageIndex(chatId: chatId, messageId: message.id)
.getSingle();
final rowIdx =
await db
.messageIndex(chatId: chatId, messageId: message.id)
.getSingle();
return rowIdx - 1;
},
);
return rowIdx - 1;
});
}
Future<int> removeMessage({required String messageId}) {
@@ -98,10 +96,10 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
return (db.chatMessage.update()
..where((row) => row.messageId.equals(messageId)))
.write(
ChatMessageCompanion(
messageJson: Value(jsonEncode(message.toJson())),
),
);
ChatMessageCompanion(
messageJson: Value(jsonEncode(message.toJson())),
),
);
}
Future<int> deleteChatMessages({required String chatId}) {
@@ -120,21 +118,19 @@ class MessagesDao extends DatabaseAccessor<ChatDatabase>
await db.leadingOrderKey(bucket: 0, chatId: chatId).getSingle();
await db.chatMessage.insertAll(
messages.map(
(message) {
final insertable = ChatMessageCompanion.insert(
messageId: message.id,
chatId: chatId,
messageJson: jsonEncode(message.toJson()),
orderKey: currentOrderKey,
// timestamp: DateTime.now(),
);
messages.map((message) {
final insertable = ChatMessageCompanion.insert(
messageId: message.id,
chatId: chatId,
messageJson: jsonEncode(message.toJson()),
orderKey: currentOrderKey,
// timestamp: DateTime.now(),
);
currentOrderKey = LexoRank.parse(currentOrderKey).genPrev().value;
currentOrderKey = LexoRank.parse(currentOrderKey).genPrev().value;
return insertable;
},
),
return insertable;
}),
);
});
}
@@ -10,9 +10,10 @@ class MetadataDao extends DatabaseAccessor<ChatDatabase>
MetadataDao(super.db);
SingleOrNullSelectable<ChatMetadata> chatMetadata(String chatId) {
final statement = db.chatData.selectOnly()
..addColumns([db.chatData.metadata])
..where(db.chatData.chatId.equals(chatId));
final statement =
db.chatData.selectOnly()
..addColumns([db.chatData.metadata])
..where(db.chatData.chatId.equals(chatId));
return statement.map((row) => row.readWithConverter(db.chatData.metadata)!);
}
@@ -9,16 +9,22 @@ class ChatData extends Table with TableInfo<ChatData, ChatDataData> {
final String? _alias;
ChatData(this.attachedDatabase, [this._alias]);
late final GeneratedColumn<String> chatId = GeneratedColumn<String>(
'chat_id', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL');
'chat_id',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL',
);
late final GeneratedColumnWithTypeConverter<ChatMetadata, String> metadata =
GeneratedColumn<String>('metadata', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL')
.withConverter<ChatMetadata>(ChatData.$convertermetadata);
GeneratedColumn<String>(
'metadata',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL',
).withConverter<ChatMetadata>(ChatData.$convertermetadata);
@override
List<GeneratedColumn> get $columns => [chatId, metadata];
@override
@@ -32,10 +38,17 @@ class ChatData extends Table with TableInfo<ChatData, ChatDataData> {
ChatDataData map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
return ChatDataData(
chatId: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}chat_id'])!,
metadata: ChatData.$convertermetadata.fromSql(attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}metadata'])!),
chatId:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}chat_id'],
)!,
metadata: ChatData.$convertermetadata.fromSql(
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}metadata'],
)!,
),
);
}
@@ -59,14 +72,17 @@ class ChatDataData extends DataClass implements Insertable<ChatDataData> {
final map = <String, Expression>{};
map['chat_id'] = Variable<String>(chatId);
{
map['metadata'] =
Variable<String>(ChatData.$convertermetadata.toSql(metadata));
map['metadata'] = Variable<String>(
ChatData.$convertermetadata.toSql(metadata),
);
}
return map;
}
factory ChatDataData.fromJson(Map<String, dynamic> json,
{ValueSerializer? serializer}) {
factory ChatDataData.fromJson(
Map<String, dynamic> json, {
ValueSerializer? serializer,
}) {
serializer ??= driftRuntimeOptions.defaultSerializer;
return ChatDataData(
chatId: serializer.fromJson<String>(json['chat_id']),
@@ -126,8 +142,8 @@ class ChatDataCompanion extends UpdateCompanion<ChatDataData> {
required String chatId,
required ChatMetadata metadata,
this.rowid = const Value.absent(),
}) : chatId = Value(chatId),
metadata = Value(metadata);
}) : chatId = Value(chatId),
metadata = Value(metadata);
static Insertable<ChatDataData> custom({
Expression<String>? chatId,
Expression<String>? metadata,
@@ -140,10 +156,11 @@ class ChatDataCompanion extends UpdateCompanion<ChatDataData> {
});
}
ChatDataCompanion copyWith(
{Value<String>? chatId,
Value<ChatMetadata>? metadata,
Value<int>? rowid}) {
ChatDataCompanion copyWith({
Value<String>? chatId,
Value<ChatMetadata>? metadata,
Value<int>? rowid,
}) {
return ChatDataCompanion(
chatId: chatId ?? this.chatId,
metadata: metadata ?? this.metadata,
@@ -158,8 +175,9 @@ class ChatDataCompanion extends UpdateCompanion<ChatDataData> {
map['chat_id'] = Variable<String>(chatId.value);
}
if (metadata.present) {
map['metadata'] =
Variable<String>(ChatData.$convertermetadata.toSql(metadata.value));
map['metadata'] = Variable<String>(
ChatData.$convertermetadata.toSql(metadata.value),
);
}
if (rowid.present) {
map['rowid'] = Variable<int>(rowid.value);
@@ -184,28 +202,44 @@ class ChatMessage extends Table with TableInfo<ChatMessage, ChatMessageData> {
final String? _alias;
ChatMessage(this.attachedDatabase, [this._alias]);
late final GeneratedColumn<String> messageId = GeneratedColumn<String>(
'message_id', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL');
'message_id',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL',
);
late final GeneratedColumn<String> chatId = GeneratedColumn<String>(
'chat_id', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
'chat_id',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL',
);
late final GeneratedColumn<String> orderKey = GeneratedColumn<String>(
'order_key', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
'order_key',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL',
);
late final GeneratedColumn<String> messageJson = GeneratedColumn<String>(
'message_json', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
'message_json',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL',
);
@override
List<GeneratedColumn> get $columns =>
[messageId, chatId, orderKey, messageJson];
List<GeneratedColumn> get $columns => [
messageId,
chatId,
orderKey,
messageJson,
];
@override
String get aliasedName => _alias ?? actualTableName;
@override
@@ -217,14 +251,26 @@ class ChatMessage extends Table with TableInfo<ChatMessage, ChatMessageData> {
ChatMessageData map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
return ChatMessageData(
messageId: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}message_id'])!,
chatId: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}chat_id'])!,
orderKey: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}order_key'])!,
messageJson: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}message_json'])!,
messageId:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}message_id'],
)!,
chatId:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}chat_id'],
)!,
orderKey:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}order_key'],
)!,
messageJson:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}message_json'],
)!,
);
}
@@ -242,11 +288,12 @@ class ChatMessageData extends DataClass implements Insertable<ChatMessageData> {
final String chatId;
final String orderKey;
final String messageJson;
const ChatMessageData(
{required this.messageId,
required this.chatId,
required this.orderKey,
required this.messageJson});
const ChatMessageData({
required this.messageId,
required this.chatId,
required this.orderKey,
required this.messageJson,
});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
@@ -257,8 +304,10 @@ class ChatMessageData extends DataClass implements Insertable<ChatMessageData> {
return map;
}
factory ChatMessageData.fromJson(Map<String, dynamic> json,
{ValueSerializer? serializer}) {
factory ChatMessageData.fromJson(
Map<String, dynamic> json, {
ValueSerializer? serializer,
}) {
serializer ??= driftRuntimeOptions.defaultSerializer;
return ChatMessageData(
messageId: serializer.fromJson<String>(json['message_id']),
@@ -278,17 +327,17 @@ class ChatMessageData extends DataClass implements Insertable<ChatMessageData> {
};
}
ChatMessageData copyWith(
{String? messageId,
String? chatId,
String? orderKey,
String? messageJson}) =>
ChatMessageData(
messageId: messageId ?? this.messageId,
chatId: chatId ?? this.chatId,
orderKey: orderKey ?? this.orderKey,
messageJson: messageJson ?? this.messageJson,
);
ChatMessageData copyWith({
String? messageId,
String? chatId,
String? orderKey,
String? messageJson,
}) => ChatMessageData(
messageId: messageId ?? this.messageId,
chatId: chatId ?? this.chatId,
orderKey: orderKey ?? this.orderKey,
messageJson: messageJson ?? this.messageJson,
);
ChatMessageData copyWithCompanion(ChatMessageCompanion data) {
return ChatMessageData(
messageId: data.messageId.present ? data.messageId.value : this.messageId,
@@ -341,10 +390,10 @@ class ChatMessageCompanion extends UpdateCompanion<ChatMessageData> {
required String orderKey,
required String messageJson,
this.rowid = const Value.absent(),
}) : messageId = Value(messageId),
chatId = Value(chatId),
orderKey = Value(orderKey),
messageJson = Value(messageJson);
}) : messageId = Value(messageId),
chatId = Value(chatId),
orderKey = Value(orderKey),
messageJson = Value(messageJson);
static Insertable<ChatMessageData> custom({
Expression<String>? messageId,
Expression<String>? chatId,
@@ -361,12 +410,13 @@ class ChatMessageCompanion extends UpdateCompanion<ChatMessageData> {
});
}
ChatMessageCompanion copyWith(
{Value<String>? messageId,
Value<String>? chatId,
Value<String>? orderKey,
Value<String>? messageJson,
Value<int>? rowid}) {
ChatMessageCompanion copyWith({
Value<String>? messageId,
Value<String>? chatId,
Value<String>? orderKey,
Value<String>? messageJson,
Value<int>? rowid,
}) {
return ChatMessageCompanion(
messageId: messageId ?? this.messageId,
chatId: chatId ?? this.chatId,
@@ -415,80 +465,79 @@ abstract class _$ChatDatabase extends GeneratedDatabase {
$ChatDatabaseManager get managers => $ChatDatabaseManager(this);
late final ChatData chatData = ChatData(this);
late final ChatMessage chatMessage = ChatMessage(this);
late final Index groupOrderIdx = Index('group_order_idx',
'CREATE UNIQUE INDEX group_order_idx ON chat_message (chat_id, order_key)');
late final Index groupOrderIdx = Index(
'group_order_idx',
'CREATE UNIQUE INDEX group_order_idx ON chat_message (chat_id, order_key)',
);
late final MessagesDao messagesDao = MessagesDao(this as ChatDatabase);
late final MetadataDao metadataDao = MetadataDao(this as ChatDatabase);
Selectable<String> leadingOrderKey(
{required int bucket, required String chatId}) {
Selectable<String> leadingOrderKey({
required int bucket,
required String chatId,
}) {
return customSelect(
'SELECT lexo_rank_previous(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key LIMIT 1)) AS _c0',
variables: [
Variable<int>(bucket),
Variable<String>(chatId)
],
readsFrom: {
chatMessage,
}).map((QueryRow row) => row.read<String>('_c0'));
'SELECT lexo_rank_previous(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key LIMIT 1)) AS _c0',
variables: [Variable<int>(bucket), Variable<String>(chatId)],
readsFrom: {chatMessage},
).map((QueryRow row) => row.read<String>('_c0'));
}
Selectable<String> trailingOrderKey(
{required int bucket, required String chatId}) {
Selectable<String> trailingOrderKey({
required int bucket,
required String chatId,
}) {
return customSelect(
'SELECT lexo_rank_next(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key DESC LIMIT 1)) AS _c0',
variables: [
Variable<int>(bucket),
Variable<String>(chatId)
],
readsFrom: {
chatMessage,
}).map((QueryRow row) => row.read<String>('_c0'));
'SELECT lexo_rank_next(?1, (SELECT order_key FROM chat_message WHERE chat_id = ?2 ORDER BY order_key DESC LIMIT 1)) AS _c0',
variables: [Variable<int>(bucket), Variable<String>(chatId)],
readsFrom: {chatMessage},
).map((QueryRow row) => row.read<String>('_c0'));
}
Selectable<String> orderKeyBeforeIndex(
{required String chatId, required int rowIdx}) {
Selectable<String> orderKeyBeforeIndex({
required String chatId,
required int rowIdx,
}) {
return customSelect(
'WITH ordered_table AS (SELECT message_id, order_key, LEAD(order_key)OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS next_order_key, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx, COUNT(*)OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS total_rows FROM chat_message WHERE chat_id = ?1) SELECT lexo_rank_reorder_after(order_key, next_order_key) AS _c0 FROM ordered_table WHERE row_idx = MIN(?2, total_rows)',
variables: [
Variable<String>(chatId),
Variable<int>(rowIdx)
],
readsFrom: {
chatMessage,
}).map((QueryRow row) => row.read<String>('_c0'));
'WITH ordered_table AS (SELECT message_id, order_key, LEAD(order_key)OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS next_order_key, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx, COUNT(*)OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS total_rows FROM chat_message WHERE chat_id = ?1) SELECT lexo_rank_reorder_after(order_key, next_order_key) AS _c0 FROM ordered_table WHERE row_idx = MIN(?2, total_rows)',
variables: [Variable<String>(chatId), Variable<int>(rowIdx)],
readsFrom: {chatMessage},
).map((QueryRow row) => row.read<String>('_c0'));
}
Selectable<int> messageIndex(
{required String chatId, required String messageId}) {
Selectable<int> messageIndex({
required String chatId,
required String messageId,
}) {
return customSelect(
'WITH ordered_table AS (SELECT message_id, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx FROM chat_message WHERE chat_id = ?1) SELECT row_idx FROM ordered_table WHERE message_id = ?2',
variables: [
Variable<String>(chatId),
Variable<String>(messageId)
],
readsFrom: {
chatMessage,
}).map((QueryRow row) => row.read<int>('row_idx'));
'WITH ordered_table AS (SELECT message_id, ROW_NUMBER()OVER (ORDER BY order_key RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCLUDE NO OTHERS) AS row_idx FROM chat_message WHERE chat_id = ?1) SELECT row_idx FROM ordered_table WHERE message_id = ?2',
variables: [Variable<String>(chatId), Variable<String>(messageId)],
readsFrom: {chatMessage},
).map((QueryRow row) => row.read<int>('row_idx'));
}
@override
Iterable<TableInfo<Table, Object?>> get allTables =>
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
@override
List<DatabaseSchemaEntity> get allSchemaEntities =>
[chatData, chatMessage, groupOrderIdx];
List<DatabaseSchemaEntity> get allSchemaEntities => [
chatData,
chatMessage,
groupOrderIdx,
];
}
typedef $ChatDataCreateCompanionBuilder = ChatDataCompanion Function({
required String chatId,
required ChatMetadata metadata,
Value<int> rowid,
});
typedef $ChatDataUpdateCompanionBuilder = ChatDataCompanion Function({
Value<String> chatId,
Value<ChatMetadata> metadata,
Value<int> rowid,
});
typedef $ChatDataCreateCompanionBuilder =
ChatDataCompanion Function({
required String chatId,
required ChatMetadata metadata,
Value<int> rowid,
});
typedef $ChatDataUpdateCompanionBuilder =
ChatDataCompanion Function({
Value<String> chatId,
Value<ChatMetadata> metadata,
Value<int> rowid,
});
class $ChatDataFilterComposer extends Composer<_$ChatDatabase, ChatData> {
$ChatDataFilterComposer({
@@ -499,12 +548,15 @@ class $ChatDataFilterComposer extends Composer<_$ChatDatabase, ChatData> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnFilters<String> get chatId => $composableBuilder(
column: $table.chatId, builder: (column) => ColumnFilters(column));
column: $table.chatId,
builder: (column) => ColumnFilters(column),
);
ColumnWithTypeConverterFilters<ChatMetadata, ChatMetadata, String>
get metadata => $composableBuilder(
column: $table.metadata,
builder: (column) => ColumnWithTypeConverterFilters(column));
get metadata => $composableBuilder(
column: $table.metadata,
builder: (column) => ColumnWithTypeConverterFilters(column),
);
}
class $ChatDataOrderingComposer extends Composer<_$ChatDatabase, ChatData> {
@@ -516,10 +568,14 @@ class $ChatDataOrderingComposer extends Composer<_$ChatDatabase, ChatData> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnOrderings<String> get chatId => $composableBuilder(
column: $table.chatId, builder: (column) => ColumnOrderings(column));
column: $table.chatId,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get metadata => $composableBuilder(
column: $table.metadata, builder: (column) => ColumnOrderings(column));
column: $table.metadata,
builder: (column) => ColumnOrderings(column),
);
}
class $ChatDataAnnotationComposer extends Composer<_$ChatDatabase, ChatData> {
@@ -537,81 +593,100 @@ class $ChatDataAnnotationComposer extends Composer<_$ChatDatabase, ChatData> {
$composableBuilder(column: $table.metadata, builder: (column) => column);
}
class $ChatDataTableManager extends RootTableManager<
_$ChatDatabase,
ChatData,
ChatDataData,
$ChatDataFilterComposer,
$ChatDataOrderingComposer,
$ChatDataAnnotationComposer,
$ChatDataCreateCompanionBuilder,
$ChatDataUpdateCompanionBuilder,
(ChatDataData, BaseReferences<_$ChatDatabase, ChatData, ChatDataData>),
ChatDataData,
PrefetchHooks Function()> {
class $ChatDataTableManager
extends
RootTableManager<
_$ChatDatabase,
ChatData,
ChatDataData,
$ChatDataFilterComposer,
$ChatDataOrderingComposer,
$ChatDataAnnotationComposer,
$ChatDataCreateCompanionBuilder,
$ChatDataUpdateCompanionBuilder,
(
ChatDataData,
BaseReferences<_$ChatDatabase, ChatData, ChatDataData>,
),
ChatDataData,
PrefetchHooks Function()
> {
$ChatDataTableManager(_$ChatDatabase db, ChatData table)
: super(TableManagerState(
: super(
TableManagerState(
db: db,
table: table,
createFilteringComposer: () =>
$ChatDataFilterComposer($db: db, $table: table),
createOrderingComposer: () =>
$ChatDataOrderingComposer($db: db, $table: table),
createComputedFieldComposer: () =>
$ChatDataAnnotationComposer($db: db, $table: table),
updateCompanionCallback: ({
Value<String> chatId = const Value.absent(),
Value<ChatMetadata> metadata = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) =>
ChatDataCompanion(
chatId: chatId,
metadata: metadata,
rowid: rowid,
),
createCompanionCallback: ({
required String chatId,
required ChatMetadata metadata,
Value<int> rowid = const Value.absent(),
}) =>
ChatDataCompanion.insert(
chatId: chatId,
metadata: metadata,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
.toList(),
createFilteringComposer:
() => $ChatDataFilterComposer($db: db, $table: table),
createOrderingComposer:
() => $ChatDataOrderingComposer($db: db, $table: table),
createComputedFieldComposer:
() => $ChatDataAnnotationComposer($db: db, $table: table),
updateCompanionCallback:
({
Value<String> chatId = const Value.absent(),
Value<ChatMetadata> metadata = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => ChatDataCompanion(
chatId: chatId,
metadata: metadata,
rowid: rowid,
),
createCompanionCallback:
({
required String chatId,
required ChatMetadata metadata,
Value<int> rowid = const Value.absent(),
}) => ChatDataCompanion.insert(
chatId: chatId,
metadata: metadata,
rowid: rowid,
),
withReferenceMapper:
(p0) =>
p0
.map(
(e) => (
e.readTable(table),
BaseReferences(db, table, e),
),
)
.toList(),
prefetchHooksCallback: null,
));
),
);
}
typedef $ChatDataProcessedTableManager = ProcessedTableManager<
_$ChatDatabase,
ChatData,
ChatDataData,
$ChatDataFilterComposer,
$ChatDataOrderingComposer,
$ChatDataAnnotationComposer,
$ChatDataCreateCompanionBuilder,
$ChatDataUpdateCompanionBuilder,
(ChatDataData, BaseReferences<_$ChatDatabase, ChatData, ChatDataData>),
ChatDataData,
PrefetchHooks Function()>;
typedef $ChatMessageCreateCompanionBuilder = ChatMessageCompanion Function({
required String messageId,
required String chatId,
required String orderKey,
required String messageJson,
Value<int> rowid,
});
typedef $ChatMessageUpdateCompanionBuilder = ChatMessageCompanion Function({
Value<String> messageId,
Value<String> chatId,
Value<String> orderKey,
Value<String> messageJson,
Value<int> rowid,
});
typedef $ChatDataProcessedTableManager =
ProcessedTableManager<
_$ChatDatabase,
ChatData,
ChatDataData,
$ChatDataFilterComposer,
$ChatDataOrderingComposer,
$ChatDataAnnotationComposer,
$ChatDataCreateCompanionBuilder,
$ChatDataUpdateCompanionBuilder,
(ChatDataData, BaseReferences<_$ChatDatabase, ChatData, ChatDataData>),
ChatDataData,
PrefetchHooks Function()
>;
typedef $ChatMessageCreateCompanionBuilder =
ChatMessageCompanion Function({
required String messageId,
required String chatId,
required String orderKey,
required String messageJson,
Value<int> rowid,
});
typedef $ChatMessageUpdateCompanionBuilder =
ChatMessageCompanion Function({
Value<String> messageId,
Value<String> chatId,
Value<String> orderKey,
Value<String> messageJson,
Value<int> rowid,
});
class $ChatMessageFilterComposer extends Composer<_$ChatDatabase, ChatMessage> {
$ChatMessageFilterComposer({
@@ -622,16 +697,24 @@ class $ChatMessageFilterComposer extends Composer<_$ChatDatabase, ChatMessage> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnFilters<String> get messageId => $composableBuilder(
column: $table.messageId, builder: (column) => ColumnFilters(column));
column: $table.messageId,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get chatId => $composableBuilder(
column: $table.chatId, builder: (column) => ColumnFilters(column));
column: $table.chatId,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get orderKey => $composableBuilder(
column: $table.orderKey, builder: (column) => ColumnFilters(column));
column: $table.orderKey,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get messageJson => $composableBuilder(
column: $table.messageJson, builder: (column) => ColumnFilters(column));
column: $table.messageJson,
builder: (column) => ColumnFilters(column),
);
}
class $ChatMessageOrderingComposer
@@ -644,16 +727,24 @@ class $ChatMessageOrderingComposer
super.$removeJoinBuilderFromRootComposer,
});
ColumnOrderings<String> get messageId => $composableBuilder(
column: $table.messageId, builder: (column) => ColumnOrderings(column));
column: $table.messageId,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get chatId => $composableBuilder(
column: $table.chatId, builder: (column) => ColumnOrderings(column));
column: $table.chatId,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get orderKey => $composableBuilder(
column: $table.orderKey, builder: (column) => ColumnOrderings(column));
column: $table.orderKey,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get messageJson => $composableBuilder(
column: $table.messageJson, builder: (column) => ColumnOrderings(column));
column: $table.messageJson,
builder: (column) => ColumnOrderings(column),
);
}
class $ChatMessageAnnotationComposer
@@ -675,84 +766,100 @@ class $ChatMessageAnnotationComposer
$composableBuilder(column: $table.orderKey, builder: (column) => column);
GeneratedColumn<String> get messageJson => $composableBuilder(
column: $table.messageJson, builder: (column) => column);
column: $table.messageJson,
builder: (column) => column,
);
}
class $ChatMessageTableManager extends RootTableManager<
_$ChatDatabase,
ChatMessage,
ChatMessageData,
$ChatMessageFilterComposer,
$ChatMessageOrderingComposer,
$ChatMessageAnnotationComposer,
$ChatMessageCreateCompanionBuilder,
$ChatMessageUpdateCompanionBuilder,
(
ChatMessageData,
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>
),
ChatMessageData,
PrefetchHooks Function()> {
class $ChatMessageTableManager
extends
RootTableManager<
_$ChatDatabase,
ChatMessage,
ChatMessageData,
$ChatMessageFilterComposer,
$ChatMessageOrderingComposer,
$ChatMessageAnnotationComposer,
$ChatMessageCreateCompanionBuilder,
$ChatMessageUpdateCompanionBuilder,
(
ChatMessageData,
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>,
),
ChatMessageData,
PrefetchHooks Function()
> {
$ChatMessageTableManager(_$ChatDatabase db, ChatMessage table)
: super(TableManagerState(
: super(
TableManagerState(
db: db,
table: table,
createFilteringComposer: () =>
$ChatMessageFilterComposer($db: db, $table: table),
createOrderingComposer: () =>
$ChatMessageOrderingComposer($db: db, $table: table),
createComputedFieldComposer: () =>
$ChatMessageAnnotationComposer($db: db, $table: table),
updateCompanionCallback: ({
Value<String> messageId = const Value.absent(),
Value<String> chatId = const Value.absent(),
Value<String> orderKey = const Value.absent(),
Value<String> messageJson = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) =>
ChatMessageCompanion(
messageId: messageId,
chatId: chatId,
orderKey: orderKey,
messageJson: messageJson,
rowid: rowid,
),
createCompanionCallback: ({
required String messageId,
required String chatId,
required String orderKey,
required String messageJson,
Value<int> rowid = const Value.absent(),
}) =>
ChatMessageCompanion.insert(
messageId: messageId,
chatId: chatId,
orderKey: orderKey,
messageJson: messageJson,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
.toList(),
createFilteringComposer:
() => $ChatMessageFilterComposer($db: db, $table: table),
createOrderingComposer:
() => $ChatMessageOrderingComposer($db: db, $table: table),
createComputedFieldComposer:
() => $ChatMessageAnnotationComposer($db: db, $table: table),
updateCompanionCallback:
({
Value<String> messageId = const Value.absent(),
Value<String> chatId = const Value.absent(),
Value<String> orderKey = const Value.absent(),
Value<String> messageJson = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => ChatMessageCompanion(
messageId: messageId,
chatId: chatId,
orderKey: orderKey,
messageJson: messageJson,
rowid: rowid,
),
createCompanionCallback:
({
required String messageId,
required String chatId,
required String orderKey,
required String messageJson,
Value<int> rowid = const Value.absent(),
}) => ChatMessageCompanion.insert(
messageId: messageId,
chatId: chatId,
orderKey: orderKey,
messageJson: messageJson,
rowid: rowid,
),
withReferenceMapper:
(p0) =>
p0
.map(
(e) => (
e.readTable(table),
BaseReferences(db, table, e),
),
)
.toList(),
prefetchHooksCallback: null,
));
),
);
}
typedef $ChatMessageProcessedTableManager = ProcessedTableManager<
_$ChatDatabase,
ChatMessage,
ChatMessageData,
$ChatMessageFilterComposer,
$ChatMessageOrderingComposer,
$ChatMessageAnnotationComposer,
$ChatMessageCreateCompanionBuilder,
$ChatMessageUpdateCompanionBuilder,
(
typedef $ChatMessageProcessedTableManager =
ProcessedTableManager<
_$ChatDatabase,
ChatMessage,
ChatMessageData,
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>
),
ChatMessageData,
PrefetchHooks Function()>;
$ChatMessageFilterComposer,
$ChatMessageOrderingComposer,
$ChatMessageAnnotationComposer,
$ChatMessageCreateCompanionBuilder,
$ChatMessageUpdateCompanionBuilder,
(
ChatMessageData,
BaseReferences<_$ChatDatabase, ChatMessage, ChatMessageData>,
),
ChatMessageData,
PrefetchHooks Function()
>;
class $ChatDatabaseManager {
final _$ChatDatabase _db;
@@ -7,9 +7,9 @@ part of 'chat_metadata.dart';
// **************************************************************************
ChatMetadata _$ChatMetadataFromJson(Map<String, dynamic> json) => ChatMetadata(
mainDocumentId: json['mainDocumentId'] as String?,
contextId: json['contextId'] as String?,
);
mainDocumentId: json['mainDocumentId'] as String?,
contextId: json['contextId'] as String?,
);
Map<String, dynamic> _$ChatMetadataToJson(ChatMetadata instance) =>
<String, dynamic>{
@@ -59,44 +59,46 @@ class ChatMemory implements BaseMemory {
Future<MemoryVariables> loadMemoryVariables([
MemoryInputValues values = const {},
]) async {
final messages = _controller.messages
.whereNot(
(message) => message.metadata?['hideFromModelChatHistory'] == true,
)
.map(
(message) => switch (message) {
TextMessage(
authorId: final authorId,
text: final text,
metadata: final metadata,
) =>
() {
if (authorId == MessageAuthor.system.user.id) {
return SystemChatMessage(content: text);
}
if (authorId == MessageAuthor.human.user.id) {
return HumanChatMessage(
content: ChatMessageContent.text(text),
);
}
if (authorId == MessageAuthor.ai.user.id) {
final toolsRaw = metadata?['toolCalls'];
if (toolsRaw is String) {
return AIChatMessage(
content: text,
toolCalls: _deserializeToolCalls(toolsRaw),
);
}
return AIChatMessage(content: text);
}
throw UnimplementedError();
}(),
ImageMessage() => throw UnimplementedError(),
CustomMessage() => throw UnimplementedError(),
UnsupportedMessage() => throw UnimplementedError()
},
)
.toList();
final messages =
_controller.messages
.whereNot(
(message) =>
message.metadata?['hideFromModelChatHistory'] == true,
)
.map(
(message) => switch (message) {
TextMessage(
authorId: final authorId,
text: final text,
metadata: final metadata,
) =>
() {
if (authorId == MessageAuthor.system.user.id) {
return SystemChatMessage(content: text);
}
if (authorId == MessageAuthor.human.user.id) {
return HumanChatMessage(
content: ChatMessageContent.text(text),
);
}
if (authorId == MessageAuthor.ai.user.id) {
final toolsRaw = metadata?['toolCalls'];
if (toolsRaw is String) {
return AIChatMessage(
content: text,
toolCalls: _deserializeToolCalls(toolsRaw),
);
}
return AIChatMessage(content: text);
}
throw UnimplementedError();
}(),
ImageMessage() => throw UnimplementedError(),
CustomMessage() => throw UnimplementedError(),
UnsupportedMessage() => throw UnimplementedError(),
},
)
.toList();
int currentBufferLength = await llm.countTokens(PromptValue.chat(messages));
// Prune buffer if it exceeds max token limit
@@ -124,16 +126,17 @@ class ChatMemory implements BaseMemory {
List<AIChatMessageToolCall> _deserializeToolCalls(String toolsRaw) {
final decoded = jsonDecode(toolsRaw) as List<dynamic>;
final tools = decoded
.map(
(tool) => AIChatMessageToolCall(
id: tool['id'] as String,
name: tool['name'] as String,
arguments: tool['arguments'] as Map<String, dynamic>,
argumentsRaw: tool['argumentsRaw'] as String,
),
)
.toList();
final tools =
decoded
.map(
(tool) => AIChatMessageToolCall(
id: tool['id'] as String,
name: tool['name'] as String,
arguments: tool['arguments'] as Map<String, dynamic>,
argumentsRaw: tool['argumentsRaw'] as String,
),
)
.toList();
return tools;
}
@@ -17,30 +17,26 @@ class DriftChatController implements ChatController {
late final BehaviorSubject<Map<String, Message>> _intermediateMessages;
DriftChatController(this._dao, {required this.chatId}) {
final chatMessagesStream = _dao
.chatMessages(chatId: chatId)
.map(
(data) => Message.fromJson(
jsonDecode(data.messageJson) as Map<String, dynamic>,
),
)
.watch();
final chatMessagesStream =
_dao
.chatMessages(chatId: chatId)
.map(
(data) => Message.fromJson(
jsonDecode(data.messageJson) as Map<String, dynamic>,
),
)
.watch();
_intermediateMessages = BehaviorSubject.seeded({});
_mergedMessagesStream = Rx.combineLatest2(
chatMessagesStream,
_intermediateMessages,
(a, b) {
if (a.isNotEmpty && b.isNotEmpty) {
return [
for (final message in a) b[message.id] ?? message,
];
}
_mergedMessagesStream =
Rx.combineLatest2(chatMessagesStream, _intermediateMessages, (a, b) {
if (a.isNotEmpty && b.isNotEmpty) {
return [for (final message in a) b[message.id] ?? message];
}
return a;
},
).shareValue();
return a;
}).shareValue();
//Set initial messages
unawaited(
@@ -80,9 +76,10 @@ class DriftChatController implements ChatController {
@override
Future<void> remove(Message message) async {
final index = await _dao
.messageIndex(chatId: chatId, messageId: message.id)
.getSingleOrNull();
final index =
await _dao
.messageIndex(chatId: chatId, messageId: message.id)
.getSingleOrNull();
if (index != null) {
await _dao.removeMessage(messageId: message.id);
@@ -39,21 +39,15 @@ class ChatControllerFamily extends Family<DriftChatController> {
const ChatControllerFamily();
/// See also [chatController].
ChatControllerProvider call(
String chatId,
) {
return ChatControllerProvider(
chatId,
);
ChatControllerProvider call(String chatId) {
return ChatControllerProvider(chatId);
}
@override
ChatControllerProvider getProviderOverride(
covariant ChatControllerProvider provider,
) {
return call(
provider.chatId,
);
return call(provider.chatId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -74,24 +68,20 @@ class ChatControllerFamily extends Family<DriftChatController> {
/// See also [chatController].
class ChatControllerProvider extends AutoDisposeProvider<DriftChatController> {
/// See also [chatController].
ChatControllerProvider(
String chatId,
) : this._internal(
(ref) => chatController(
ref as ChatControllerRef,
chatId,
),
from: chatControllerProvider,
name: r'chatControllerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatControllerHash,
dependencies: ChatControllerFamily._dependencies,
allTransitiveDependencies:
ChatControllerFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatControllerProvider(String chatId)
: this._internal(
(ref) => chatController(ref as ChatControllerRef, chatId),
from: chatControllerProvider,
name: r'chatControllerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatControllerHash,
dependencies: ChatControllerFamily._dependencies,
allTransitiveDependencies:
ChatControllerFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatControllerProvider._internal(
super._createNotifier, {
@@ -170,21 +160,15 @@ class ChatMetadataFamily extends Family<AsyncValue<ChatMetadata?>> {
const ChatMetadataFamily();
/// See also [chatMetadata].
ChatMetadataProvider call(
String chatId,
) {
return ChatMetadataProvider(
chatId,
);
ChatMetadataProvider call(String chatId) {
return ChatMetadataProvider(chatId);
}
@override
ChatMetadataProvider getProviderOverride(
covariant ChatMetadataProvider provider,
) {
return call(
provider.chatId,
);
return call(provider.chatId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -205,24 +189,20 @@ class ChatMetadataFamily extends Family<AsyncValue<ChatMetadata?>> {
/// See also [chatMetadata].
class ChatMetadataProvider extends AutoDisposeStreamProvider<ChatMetadata?> {
/// See also [chatMetadata].
ChatMetadataProvider(
String chatId,
) : this._internal(
(ref) => chatMetadata(
ref as ChatMetadataRef,
chatId,
),
from: chatMetadataProvider,
name: r'chatMetadataProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatMetadataHash,
dependencies: ChatMetadataFamily._dependencies,
allTransitiveDependencies:
ChatMetadataFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatMetadataProvider(String chatId)
: this._internal(
(ref) => chatMetadata(ref as ChatMetadataRef, chatId),
from: chatMetadataProvider,
name: r'chatMetadataProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatMetadataHash,
dependencies: ChatMetadataFamily._dependencies,
allTransitiveDependencies:
ChatMetadataFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatMetadataProvider._internal(
super._createNotifier, {
@@ -288,5 +268,6 @@ class _ChatMetadataProviderElement
@override
String get chatId => (origin as ChatMetadataProvider).chatId;
}
// 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
@@ -31,9 +31,7 @@ class ChatMessageRepository extends _$ChatMessageRepository {
id: uuid.v4(),
authorId: author.user.id,
createdAt: DateTime.now().toUtc(),
metadata: {
'type': 'typing',
},
metadata: {'type': 'typing'},
),
);
@@ -65,12 +63,13 @@ class ChatMessageRepository extends _$ChatMessageRepository {
createdAt: DateTime.now().toUtc(),
text: content,
isOnlyEmoji: isOnlyEmoji(content),
metadata: (hideFromModelChatHistory || (toolCalls?.isNotEmpty ?? false))
? {
'toolCalls': toolCalls?.map((tool) => tool.toMap()).toList(),
if (hideFromModelChatHistory) 'hideFromModelChatHistory': true,
}
: null,
metadata:
(hideFromModelChatHistory || (toolCalls?.isNotEmpty ?? false))
? {
'toolCalls': toolCalls?.map((tool) => tool.toMap()).toList(),
if (hideFromModelChatHistory) 'hideFromModelChatHistory': true,
}
: null,
);
return Result.fromAsync(() async {
@@ -34,9 +34,7 @@ abstract class _$ChatMessageRepository
extends BuildlessAutoDisposeNotifier<void> {
late final String chatId;
void build(
String chatId,
);
void build(String chatId);
}
/// See also [ChatMessageRepository].
@@ -49,21 +47,15 @@ class ChatMessageRepositoryFamily extends Family<void> {
const ChatMessageRepositoryFamily();
/// See also [ChatMessageRepository].
ChatMessageRepositoryProvider call(
String chatId,
) {
return ChatMessageRepositoryProvider(
chatId,
);
ChatMessageRepositoryProvider call(String chatId) {
return ChatMessageRepositoryProvider(chatId);
}
@override
ChatMessageRepositoryProvider getProviderOverride(
covariant ChatMessageRepositoryProvider provider,
) {
return call(
provider.chatId,
);
return call(provider.chatId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -85,21 +77,20 @@ class ChatMessageRepositoryFamily extends Family<void> {
class ChatMessageRepositoryProvider
extends AutoDisposeNotifierProviderImpl<ChatMessageRepository, void> {
/// See also [ChatMessageRepository].
ChatMessageRepositoryProvider(
String chatId,
) : this._internal(
() => ChatMessageRepository()..chatId = chatId,
from: chatMessageRepositoryProvider,
name: r'chatMessageRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatMessageRepositoryHash,
dependencies: ChatMessageRepositoryFamily._dependencies,
allTransitiveDependencies:
ChatMessageRepositoryFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatMessageRepositoryProvider(String chatId)
: this._internal(
() => ChatMessageRepository()..chatId = chatId,
from: chatMessageRepositoryProvider,
name: r'chatMessageRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatMessageRepositoryHash,
dependencies: ChatMessageRepositoryFamily._dependencies,
allTransitiveDependencies:
ChatMessageRepositoryFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatMessageRepositoryProvider._internal(
super._createNotifier, {
@@ -114,12 +105,8 @@ class ChatMessageRepositoryProvider
final String chatId;
@override
void runNotifierBuild(
covariant ChatMessageRepository notifier,
) {
return notifier.build(
chatId,
);
void runNotifierBuild(covariant ChatMessageRepository notifier) {
return notifier.build(chatId);
}
@override
@@ -140,7 +127,7 @@ class ChatMessageRepositoryProvider
@override
AutoDisposeNotifierProviderElement<ChatMessageRepository, void>
createElement() {
createElement() {
return _ChatMessageRepositoryProviderElement(this);
}
@@ -173,5 +160,6 @@ class _ChatMessageRepositoryProviderElement
@override
String get chatId => (origin as ChatMessageRepositoryProvider).chatId;
}
// 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
@@ -34,9 +34,7 @@ abstract class _$ChatMetadataRepository
extends BuildlessAutoDisposeNotifier<void> {
late final String chatId;
void build(
String chatId,
);
void build(String chatId);
}
/// See also [ChatMetadataRepository].
@@ -49,21 +47,15 @@ class ChatMetadataRepositoryFamily extends Family<void> {
const ChatMetadataRepositoryFamily();
/// See also [ChatMetadataRepository].
ChatMetadataRepositoryProvider call(
String chatId,
) {
return ChatMetadataRepositoryProvider(
chatId,
);
ChatMetadataRepositoryProvider call(String chatId) {
return ChatMetadataRepositoryProvider(chatId);
}
@override
ChatMetadataRepositoryProvider getProviderOverride(
covariant ChatMetadataRepositoryProvider provider,
) {
return call(
provider.chatId,
);
return call(provider.chatId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -85,21 +77,20 @@ class ChatMetadataRepositoryFamily extends Family<void> {
class ChatMetadataRepositoryProvider
extends AutoDisposeNotifierProviderImpl<ChatMetadataRepository, void> {
/// See also [ChatMetadataRepository].
ChatMetadataRepositoryProvider(
String chatId,
) : this._internal(
() => ChatMetadataRepository()..chatId = chatId,
from: chatMetadataRepositoryProvider,
name: r'chatMetadataRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatMetadataRepositoryHash,
dependencies: ChatMetadataRepositoryFamily._dependencies,
allTransitiveDependencies:
ChatMetadataRepositoryFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatMetadataRepositoryProvider(String chatId)
: this._internal(
() => ChatMetadataRepository()..chatId = chatId,
from: chatMetadataRepositoryProvider,
name: r'chatMetadataRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatMetadataRepositoryHash,
dependencies: ChatMetadataRepositoryFamily._dependencies,
allTransitiveDependencies:
ChatMetadataRepositoryFamily._allTransitiveDependencies,
chatId: chatId,
);
ChatMetadataRepositoryProvider._internal(
super._createNotifier, {
@@ -114,12 +105,8 @@ class ChatMetadataRepositoryProvider
final String chatId;
@override
void runNotifierBuild(
covariant ChatMetadataRepository notifier,
) {
return notifier.build(
chatId,
);
void runNotifierBuild(covariant ChatMetadataRepository notifier) {
return notifier.build(chatId);
}
@override
@@ -140,7 +127,7 @@ class ChatMetadataRepositoryProvider
@override
AutoDisposeNotifierProviderElement<ChatMetadataRepository, void>
createElement() {
createElement() {
return _ChatMetadataRepositoryProviderElement(this);
}
@@ -173,5 +160,6 @@ class _ChatMetadataRepositoryProviderElement
@override
String get chatId => (origin as ChatMetadataRepositoryProvider).chatId;
}
// 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
@@ -24,9 +24,7 @@ class SearchDao extends DatabaseAccessor<ChatSearchDatabase>
return db.chat.insertOne(
chat,
onConflict: DoUpdate(
(old) => ChatCompanion.custom(
content: Variable(chat.content.value),
),
(old) => ChatCompanion.custom(content: Variable(chat.content.value)),
),
);
}
@@ -4,10 +4,7 @@ import 'package:lensai/features/search/domain/fts_tokenizer.dart';
part 'database.g.dart';
@DriftDatabase(
include: {'database.drift'},
daos: [SearchDao],
)
@DriftDatabase(include: {'database.drift'}, daos: [SearchDao])
class ChatSearchDatabase extends _$ChatSearchDatabase
with TrigramQueryBuilderMixin {
@override
@@ -9,20 +9,29 @@ class Chat extends Table with TableInfo<Chat, ChatData> {
final String? _alias;
Chat(this.attachedDatabase, [this._alias]);
late final GeneratedColumn<String> fileName = GeneratedColumn<String>(
'file_name', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL');
'file_name',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'PRIMARY KEY NOT NULL',
);
late final GeneratedColumn<String> title = GeneratedColumn<String>(
'title', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
'title',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL',
);
late final GeneratedColumn<String> content = GeneratedColumn<String>(
'content', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL');
'content',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: 'NOT NULL',
);
@override
List<GeneratedColumn> get $columns => [fileName, title, content];
@override
@@ -36,12 +45,21 @@ class Chat extends Table with TableInfo<Chat, ChatData> {
ChatData map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
return ChatData(
fileName: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}file_name'])!,
title: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}title'])!,
content: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}content'])!,
fileName:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}file_name'],
)!,
title:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}title'],
)!,
content:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}content'],
)!,
);
}
@@ -58,8 +76,11 @@ class ChatData extends DataClass implements Insertable<ChatData> {
final String fileName;
final String title;
final String content;
const ChatData(
{required this.fileName, required this.title, required this.content});
const ChatData({
required this.fileName,
required this.title,
required this.content,
});
@override
Map<String, Expression> toColumns(bool nullToAbsent) {
final map = <String, Expression>{};
@@ -69,8 +90,10 @@ class ChatData extends DataClass implements Insertable<ChatData> {
return map;
}
factory ChatData.fromJson(Map<String, dynamic> json,
{ValueSerializer? serializer}) {
factory ChatData.fromJson(
Map<String, dynamic> json, {
ValueSerializer? serializer,
}) {
serializer ??= driftRuntimeOptions.defaultSerializer;
return ChatData(
fileName: serializer.fromJson<String>(json['file_name']),
@@ -139,9 +162,9 @@ class ChatCompanion extends UpdateCompanion<ChatData> {
required String title,
required String content,
this.rowid = const Value.absent(),
}) : fileName = Value(fileName),
title = Value(title),
content = Value(content);
}) : fileName = Value(fileName),
title = Value(title),
content = Value(content);
static Insertable<ChatData> custom({
Expression<String>? fileName,
Expression<String>? title,
@@ -156,11 +179,12 @@ class ChatCompanion extends UpdateCompanion<ChatData> {
});
}
ChatCompanion copyWith(
{Value<String>? fileName,
Value<String>? title,
Value<String>? content,
Value<int>? rowid}) {
ChatCompanion copyWith({
Value<String>? fileName,
Value<String>? title,
Value<String>? content,
Value<int>? rowid,
}) {
return ChatCompanion(
fileName: fileName ?? this.fileName,
title: title ?? this.title,
@@ -206,15 +230,21 @@ class ChatFts extends Table
final String? _alias;
ChatFts(this.attachedDatabase, [this._alias]);
late final GeneratedColumn<String> title = GeneratedColumn<String>(
'title', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: '');
'title',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: '',
);
late final GeneratedColumn<String> content = GeneratedColumn<String>(
'content', aliasedName, false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: '');
'content',
aliasedName,
false,
type: DriftSqlType.string,
requiredDuringInsert: true,
$customConstraints: '',
);
@override
List<GeneratedColumn> get $columns => [title, content];
@override
@@ -228,10 +258,16 @@ class ChatFts extends Table
ChatFt map(Map<String, dynamic> data, {String? tablePrefix}) {
final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : '';
return ChatFt(
title: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}title'])!,
content: attachedDatabase.typeMapping
.read(DriftSqlType.string, data['${effectivePrefix}content'])!,
title:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}title'],
)!,
content:
attachedDatabase.typeMapping.read(
DriftSqlType.string,
data['${effectivePrefix}content'],
)!,
);
}
@@ -259,8 +295,10 @@ class ChatFt extends DataClass implements Insertable<ChatFt> {
return map;
}
factory ChatFt.fromJson(Map<String, dynamic> json,
{ValueSerializer? serializer}) {
factory ChatFt.fromJson(
Map<String, dynamic> json, {
ValueSerializer? serializer,
}) {
serializer ??= driftRuntimeOptions.defaultSerializer;
return ChatFt(
title: serializer.fromJson<String>(json['title']),
@@ -276,10 +314,8 @@ class ChatFt extends DataClass implements Insertable<ChatFt> {
};
}
ChatFt copyWith({String? title, String? content}) => ChatFt(
title: title ?? this.title,
content: content ?? this.content,
);
ChatFt copyWith({String? title, String? content}) =>
ChatFt(title: title ?? this.title, content: content ?? this.content);
ChatFt copyWithCompanion(ChatFtsCompanion data) {
return ChatFt(
title: data.title.present ? data.title.value : this.title,
@@ -319,8 +355,8 @@ class ChatFtsCompanion extends UpdateCompanion<ChatFt> {
required String title,
required String content,
this.rowid = const Value.absent(),
}) : title = Value(title),
content = Value(content);
}) : title = Value(title),
content = Value(content);
static Insertable<ChatFt> custom({
Expression<String>? title,
Expression<String>? content,
@@ -333,8 +369,11 @@ class ChatFtsCompanion extends UpdateCompanion<ChatFt> {
});
}
ChatFtsCompanion copyWith(
{Value<String>? title, Value<String>? content, Value<int>? rowid}) {
ChatFtsCompanion copyWith({
Value<String>? title,
Value<String>? content,
Value<int>? rowid,
}) {
return ChatFtsCompanion(
title: title ?? this.title,
content: content ?? this.content,
@@ -374,86 +413,95 @@ abstract class _$ChatSearchDatabase extends GeneratedDatabase {
late final Chat chat = Chat(this);
late final ChatFts chatFts = ChatFts(this);
late final Trigger chatAfterInsert = Trigger(
'CREATE TRIGGER chat_after_insert AFTER INSERT ON chat BEGIN INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
'chat_after_insert');
'CREATE TRIGGER chat_after_insert AFTER INSERT ON chat BEGIN INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
'chat_after_insert',
);
late final Trigger chatAfterDelete = Trigger(
'CREATE TRIGGER chat_after_delete AFTER DELETE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);END',
'chat_after_delete');
'CREATE TRIGGER chat_after_delete AFTER DELETE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);END',
'chat_after_delete',
);
late final Trigger chatAfterUpdate = Trigger(
'CREATE TRIGGER chat_after_update AFTER UPDATE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
'chat_after_update');
'CREATE TRIGGER chat_after_update AFTER UPDATE ON chat BEGIN INSERT INTO chat_fts (chat_fts, "rowid", title, content) VALUES (\'delete\', old."rowid", old.title, old.content);INSERT INTO chat_fts ("rowid", title, content) VALUES (new."rowid", new.title, new.content);END',
'chat_after_update',
);
late final SearchDao searchDao = SearchDao(this as ChatSearchDatabase);
Selectable<ChatQueryResult> chatQuery(
{required String beforeMatch,
required String afterMatch,
required String ellipsis,
required int snippetLength,
required String query}) {
Selectable<ChatQueryResult> chatQuery({
required String beforeMatch,
required String afterMatch,
required String ellipsis,
required int snippetLength,
required String query,
}) {
return customSelect(
'SELECT c.file_name, highlight(chat_fts, 0, ?1, ?2) AS title, snippet(chat_fts, 1, ?1, ?2, ?3, ?4) AS content_snippet FROM chat_fts(?5)AS fts INNER JOIN chat AS c ON c."rowid" = fts."rowid" ORDER BY RANK',
variables: [
Variable<String>(beforeMatch),
Variable<String>(afterMatch),
Variable<String>(ellipsis),
Variable<int>(snippetLength),
Variable<String>(query)
],
readsFrom: {
chat,
chatFts,
}).map((QueryRow row) => ChatQueryResult(
fileName: row.read<String>('file_name'),
title: row.readNullable<String>('title'),
contentSnippet: row.readNullable<String>('content_snippet'),
));
'SELECT c.file_name, highlight(chat_fts, 0, ?1, ?2) AS title, snippet(chat_fts, 1, ?1, ?2, ?3, ?4) AS content_snippet FROM chat_fts(?5)AS fts INNER JOIN chat AS c ON c."rowid" = fts."rowid" ORDER BY RANK',
variables: [
Variable<String>(beforeMatch),
Variable<String>(afterMatch),
Variable<String>(ellipsis),
Variable<int>(snippetLength),
Variable<String>(query),
],
readsFrom: {chat, chatFts},
).map(
(QueryRow row) => ChatQueryResult(
fileName: row.read<String>('file_name'),
title: row.readNullable<String>('title'),
contentSnippet: row.readNullable<String>('content_snippet'),
),
);
}
@override
Iterable<TableInfo<Table, Object?>> get allTables =>
allSchemaEntities.whereType<TableInfo<Table, Object?>>();
@override
List<DatabaseSchemaEntity> get allSchemaEntities =>
[chat, chatFts, chatAfterInsert, chatAfterDelete, chatAfterUpdate];
List<DatabaseSchemaEntity> get allSchemaEntities => [
chat,
chatFts,
chatAfterInsert,
chatAfterDelete,
chatAfterUpdate,
];
@override
StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules(
[
WritePropagation(
on: TableUpdateQuery.onTableName('chat',
limitUpdateKind: UpdateKind.insert),
result: [
TableUpdate('chat_fts', kind: UpdateKind.insert),
],
),
WritePropagation(
on: TableUpdateQuery.onTableName('chat',
limitUpdateKind: UpdateKind.delete),
result: [
TableUpdate('chat_fts', kind: UpdateKind.insert),
],
),
WritePropagation(
on: TableUpdateQuery.onTableName('chat',
limitUpdateKind: UpdateKind.update),
result: [
TableUpdate('chat_fts', kind: UpdateKind.insert),
],
),
],
);
StreamQueryUpdateRules get streamUpdateRules => const StreamQueryUpdateRules([
WritePropagation(
on: TableUpdateQuery.onTableName(
'chat',
limitUpdateKind: UpdateKind.insert,
),
result: [TableUpdate('chat_fts', kind: UpdateKind.insert)],
),
WritePropagation(
on: TableUpdateQuery.onTableName(
'chat',
limitUpdateKind: UpdateKind.delete,
),
result: [TableUpdate('chat_fts', kind: UpdateKind.insert)],
),
WritePropagation(
on: TableUpdateQuery.onTableName(
'chat',
limitUpdateKind: UpdateKind.update,
),
result: [TableUpdate('chat_fts', kind: UpdateKind.insert)],
),
]);
}
typedef $ChatCreateCompanionBuilder = ChatCompanion Function({
required String fileName,
required String title,
required String content,
Value<int> rowid,
});
typedef $ChatUpdateCompanionBuilder = ChatCompanion Function({
Value<String> fileName,
Value<String> title,
Value<String> content,
Value<int> rowid,
});
typedef $ChatCreateCompanionBuilder =
ChatCompanion Function({
required String fileName,
required String title,
required String content,
Value<int> rowid,
});
typedef $ChatUpdateCompanionBuilder =
ChatCompanion Function({
Value<String> fileName,
Value<String> title,
Value<String> content,
Value<int> rowid,
});
class $ChatFilterComposer extends Composer<_$ChatSearchDatabase, Chat> {
$ChatFilterComposer({
@@ -464,13 +512,19 @@ class $ChatFilterComposer extends Composer<_$ChatSearchDatabase, Chat> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnFilters<String> get fileName => $composableBuilder(
column: $table.fileName, builder: (column) => ColumnFilters(column));
column: $table.fileName,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get title => $composableBuilder(
column: $table.title, builder: (column) => ColumnFilters(column));
column: $table.title,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get content => $composableBuilder(
column: $table.content, builder: (column) => ColumnFilters(column));
column: $table.content,
builder: (column) => ColumnFilters(column),
);
}
class $ChatOrderingComposer extends Composer<_$ChatSearchDatabase, Chat> {
@@ -482,13 +536,19 @@ class $ChatOrderingComposer extends Composer<_$ChatSearchDatabase, Chat> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnOrderings<String> get fileName => $composableBuilder(
column: $table.fileName, builder: (column) => ColumnOrderings(column));
column: $table.fileName,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get title => $composableBuilder(
column: $table.title, builder: (column) => ColumnOrderings(column));
column: $table.title,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get content => $composableBuilder(
column: $table.content, builder: (column) => ColumnOrderings(column));
column: $table.content,
builder: (column) => ColumnOrderings(column),
);
}
class $ChatAnnotationComposer extends Composer<_$ChatSearchDatabase, Chat> {
@@ -509,81 +569,97 @@ class $ChatAnnotationComposer extends Composer<_$ChatSearchDatabase, Chat> {
$composableBuilder(column: $table.content, builder: (column) => column);
}
class $ChatTableManager extends RootTableManager<
_$ChatSearchDatabase,
Chat,
ChatData,
$ChatFilterComposer,
$ChatOrderingComposer,
$ChatAnnotationComposer,
$ChatCreateCompanionBuilder,
$ChatUpdateCompanionBuilder,
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
ChatData,
PrefetchHooks Function()> {
class $ChatTableManager
extends
RootTableManager<
_$ChatSearchDatabase,
Chat,
ChatData,
$ChatFilterComposer,
$ChatOrderingComposer,
$ChatAnnotationComposer,
$ChatCreateCompanionBuilder,
$ChatUpdateCompanionBuilder,
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
ChatData,
PrefetchHooks Function()
> {
$ChatTableManager(_$ChatSearchDatabase db, Chat table)
: super(TableManagerState(
: super(
TableManagerState(
db: db,
table: table,
createFilteringComposer: () =>
$ChatFilterComposer($db: db, $table: table),
createOrderingComposer: () =>
$ChatOrderingComposer($db: db, $table: table),
createComputedFieldComposer: () =>
$ChatAnnotationComposer($db: db, $table: table),
updateCompanionCallback: ({
Value<String> fileName = const Value.absent(),
Value<String> title = const Value.absent(),
Value<String> content = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) =>
ChatCompanion(
fileName: fileName,
title: title,
content: content,
rowid: rowid,
),
createCompanionCallback: ({
required String fileName,
required String title,
required String content,
Value<int> rowid = const Value.absent(),
}) =>
ChatCompanion.insert(
fileName: fileName,
title: title,
content: content,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
.toList(),
createFilteringComposer:
() => $ChatFilterComposer($db: db, $table: table),
createOrderingComposer:
() => $ChatOrderingComposer($db: db, $table: table),
createComputedFieldComposer:
() => $ChatAnnotationComposer($db: db, $table: table),
updateCompanionCallback:
({
Value<String> fileName = const Value.absent(),
Value<String> title = const Value.absent(),
Value<String> content = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => ChatCompanion(
fileName: fileName,
title: title,
content: content,
rowid: rowid,
),
createCompanionCallback:
({
required String fileName,
required String title,
required String content,
Value<int> rowid = const Value.absent(),
}) => ChatCompanion.insert(
fileName: fileName,
title: title,
content: content,
rowid: rowid,
),
withReferenceMapper:
(p0) =>
p0
.map(
(e) => (
e.readTable(table),
BaseReferences(db, table, e),
),
)
.toList(),
prefetchHooksCallback: null,
));
),
);
}
typedef $ChatProcessedTableManager = ProcessedTableManager<
_$ChatSearchDatabase,
Chat,
ChatData,
$ChatFilterComposer,
$ChatOrderingComposer,
$ChatAnnotationComposer,
$ChatCreateCompanionBuilder,
$ChatUpdateCompanionBuilder,
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
ChatData,
PrefetchHooks Function()>;
typedef $ChatFtsCreateCompanionBuilder = ChatFtsCompanion Function({
required String title,
required String content,
Value<int> rowid,
});
typedef $ChatFtsUpdateCompanionBuilder = ChatFtsCompanion Function({
Value<String> title,
Value<String> content,
Value<int> rowid,
});
typedef $ChatProcessedTableManager =
ProcessedTableManager<
_$ChatSearchDatabase,
Chat,
ChatData,
$ChatFilterComposer,
$ChatOrderingComposer,
$ChatAnnotationComposer,
$ChatCreateCompanionBuilder,
$ChatUpdateCompanionBuilder,
(ChatData, BaseReferences<_$ChatSearchDatabase, Chat, ChatData>),
ChatData,
PrefetchHooks Function()
>;
typedef $ChatFtsCreateCompanionBuilder =
ChatFtsCompanion Function({
required String title,
required String content,
Value<int> rowid,
});
typedef $ChatFtsUpdateCompanionBuilder =
ChatFtsCompanion Function({
Value<String> title,
Value<String> content,
Value<int> rowid,
});
class $ChatFtsFilterComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
$ChatFtsFilterComposer({
@@ -594,10 +670,14 @@ class $ChatFtsFilterComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnFilters<String> get title => $composableBuilder(
column: $table.title, builder: (column) => ColumnFilters(column));
column: $table.title,
builder: (column) => ColumnFilters(column),
);
ColumnFilters<String> get content => $composableBuilder(
column: $table.content, builder: (column) => ColumnFilters(column));
column: $table.content,
builder: (column) => ColumnFilters(column),
);
}
class $ChatFtsOrderingComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
@@ -609,10 +689,14 @@ class $ChatFtsOrderingComposer extends Composer<_$ChatSearchDatabase, ChatFts> {
super.$removeJoinBuilderFromRootComposer,
});
ColumnOrderings<String> get title => $composableBuilder(
column: $table.title, builder: (column) => ColumnOrderings(column));
column: $table.title,
builder: (column) => ColumnOrderings(column),
);
ColumnOrderings<String> get content => $composableBuilder(
column: $table.content, builder: (column) => ColumnOrderings(column));
column: $table.content,
builder: (column) => ColumnOrderings(column),
);
}
class $ChatFtsAnnotationComposer
@@ -631,67 +715,81 @@ class $ChatFtsAnnotationComposer
$composableBuilder(column: $table.content, builder: (column) => column);
}
class $ChatFtsTableManager extends RootTableManager<
_$ChatSearchDatabase,
ChatFts,
ChatFt,
$ChatFtsFilterComposer,
$ChatFtsOrderingComposer,
$ChatFtsAnnotationComposer,
$ChatFtsCreateCompanionBuilder,
$ChatFtsUpdateCompanionBuilder,
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
ChatFt,
PrefetchHooks Function()> {
class $ChatFtsTableManager
extends
RootTableManager<
_$ChatSearchDatabase,
ChatFts,
ChatFt,
$ChatFtsFilterComposer,
$ChatFtsOrderingComposer,
$ChatFtsAnnotationComposer,
$ChatFtsCreateCompanionBuilder,
$ChatFtsUpdateCompanionBuilder,
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
ChatFt,
PrefetchHooks Function()
> {
$ChatFtsTableManager(_$ChatSearchDatabase db, ChatFts table)
: super(TableManagerState(
: super(
TableManagerState(
db: db,
table: table,
createFilteringComposer: () =>
$ChatFtsFilterComposer($db: db, $table: table),
createOrderingComposer: () =>
$ChatFtsOrderingComposer($db: db, $table: table),
createComputedFieldComposer: () =>
$ChatFtsAnnotationComposer($db: db, $table: table),
updateCompanionCallback: ({
Value<String> title = const Value.absent(),
Value<String> content = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) =>
ChatFtsCompanion(
title: title,
content: content,
rowid: rowid,
),
createCompanionCallback: ({
required String title,
required String content,
Value<int> rowid = const Value.absent(),
}) =>
ChatFtsCompanion.insert(
title: title,
content: content,
rowid: rowid,
),
withReferenceMapper: (p0) => p0
.map((e) => (e.readTable(table), BaseReferences(db, table, e)))
.toList(),
createFilteringComposer:
() => $ChatFtsFilterComposer($db: db, $table: table),
createOrderingComposer:
() => $ChatFtsOrderingComposer($db: db, $table: table),
createComputedFieldComposer:
() => $ChatFtsAnnotationComposer($db: db, $table: table),
updateCompanionCallback:
({
Value<String> title = const Value.absent(),
Value<String> content = const Value.absent(),
Value<int> rowid = const Value.absent(),
}) => ChatFtsCompanion(
title: title,
content: content,
rowid: rowid,
),
createCompanionCallback:
({
required String title,
required String content,
Value<int> rowid = const Value.absent(),
}) => ChatFtsCompanion.insert(
title: title,
content: content,
rowid: rowid,
),
withReferenceMapper:
(p0) =>
p0
.map(
(e) => (
e.readTable(table),
BaseReferences(db, table, e),
),
)
.toList(),
prefetchHooksCallback: null,
));
),
);
}
typedef $ChatFtsProcessedTableManager = ProcessedTableManager<
_$ChatSearchDatabase,
ChatFts,
ChatFt,
$ChatFtsFilterComposer,
$ChatFtsOrderingComposer,
$ChatFtsAnnotationComposer,
$ChatFtsCreateCompanionBuilder,
$ChatFtsUpdateCompanionBuilder,
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
ChatFt,
PrefetchHooks Function()>;
typedef $ChatFtsProcessedTableManager =
ProcessedTableManager<
_$ChatSearchDatabase,
ChatFts,
ChatFt,
$ChatFtsFilterComposer,
$ChatFtsOrderingComposer,
$ChatFtsAnnotationComposer,
$ChatFtsCreateCompanionBuilder,
$ChatFtsUpdateCompanionBuilder,
(ChatFt, BaseReferences<_$ChatSearchDatabase, ChatFts, ChatFt>),
ChatFt,
PrefetchHooks Function()
>;
class $ChatSearchDatabaseManager {
final _$ChatSearchDatabase _db;
@@ -704,9 +802,5 @@ class ChatQueryResult {
final String fileName;
final String? title;
final String? contentSnippet;
ChatQueryResult({
required this.fileName,
this.title,
this.contentSnippet,
});
ChatQueryResult({required this.fileName, this.title, this.contentSnippet});
}
@@ -13,14 +13,15 @@ String _$chatSearchDatabaseHash() =>
@ProviderFor(chatSearchDatabase)
final chatSearchDatabaseProvider =
AutoDisposeProvider<ChatSearchDatabase>.internal(
chatSearchDatabase,
name: r'chatSearchDatabaseProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$chatSearchDatabaseHash,
dependencies: null,
allTransitiveDependencies: null,
);
chatSearchDatabase,
name: r'chatSearchDatabaseProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatSearchDatabaseHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
@@ -11,19 +11,21 @@ class ChatArchiveFileService extends _$ChatArchiveFileService {
final Future<Directory> _archiveDirectoryFuture;
ChatArchiveFileService()
: _archiveDirectoryFuture =
path_provider.getApplicationDocumentsDirectory().then(
(documentDirectory) => Directory(
path.join(documentDirectory.path, 'archive', 'chat'),
).create(recursive: true),
);
: _archiveDirectoryFuture = path_provider
.getApplicationDocumentsDirectory()
.then(
(documentDirectory) => Directory(
path.join(documentDirectory.path, 'archive', 'chat'),
).create(recursive: true),
);
Future<List<FileSystemEntity>> list() {
return _archiveDirectoryFuture.then(
(value) => value
.list()
.where((file) => path.extension(file.path) == '.md')
.toList(),
(value) =>
value
.list()
.where((file) => path.extension(file.path) == '.md')
.toList(),
);
}
@@ -56,8 +58,9 @@ class ChatArchiveFileService extends _$ChatArchiveFileService {
Stream<WatchEvent> _directoryStream() async* {
final watcher = DirectoryWatcher(
await _archiveDirectoryFuture
.then((archiveDirectory) => archiveDirectory.absolute.path),
await _archiveDirectoryFuture.then(
(archiveDirectory) => archiveDirectory.absolute.path,
),
);
yield* watcher.events.where((event) => path.extension(event.path) == '.md');
@@ -12,12 +12,15 @@ String _$chatArchiveFileServiceHash() =>
/// See also [ChatArchiveFileService].
@ProviderFor(ChatArchiveFileService)
final chatArchiveFileServiceProvider = AutoDisposeNotifierProvider<
ChatArchiveFileService, Raw<Stream<WatchEvent>>>.internal(
ChatArchiveFileService,
Raw<Stream<WatchEvent>>
>.internal(
ChatArchiveFileService.new,
name: r'chatArchiveFileServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$chatArchiveFileServiceHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatArchiveFileServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -21,8 +21,9 @@ class ChatArchiveRepository extends _$ChatArchiveRepository {
}
Future<Result<void>> archiveChat(String fileName, Uri url) async {
final contentsResult =
await ref.read(kagiChatServiceProvider.notifier).downloadChat(url);
final contentsResult = await ref
.read(kagiChatServiceProvider.notifier)
.downloadChat(url);
return contentsResult.flatMapAsync(
(contents) => ref
@@ -37,14 +38,15 @@ class ChatArchiveRepository extends _$ChatArchiveRepository {
);
return contentsResult.fold(
(value) => (value == null)
? Result.failure(
ErrorMessage(
source: 'Chat Archive',
message: 'Chat $fileName not found',
),
)
: Result.success(value),
(value) =>
(value == null)
? Result.failure(
ErrorMessage(
source: 'Chat Archive',
message: 'Chat $fileName not found',
),
)
: Result.success(value),
onFailure: Result.failure,
);
}
@@ -55,17 +57,16 @@ class ChatArchiveRepository extends _$ChatArchiveRepository {
yield* ConcatStream([
listArchivedChats().asStream(),
fileRepository.asyncMap(
(_) => listArchivedChats(),
),
fileRepository.asyncMap((_) => listArchivedChats()),
]);
}
}
@Riverpod()
Future<String> readArchivedChat(Ref ref, String fileName) async {
final result =
await ref.read(chatArchiveRepositoryProvider.notifier).readChat(fileName);
final result = await ref
.read(chatArchiveRepositoryProvider.notifier)
.readChat(fileName);
return result.value;
}
@@ -39,21 +39,15 @@ class ReadArchivedChatFamily extends Family<AsyncValue<String>> {
const ReadArchivedChatFamily();
/// See also [readArchivedChat].
ReadArchivedChatProvider call(
String fileName,
) {
return ReadArchivedChatProvider(
fileName,
);
ReadArchivedChatProvider call(String fileName) {
return ReadArchivedChatProvider(fileName);
}
@override
ReadArchivedChatProvider getProviderOverride(
covariant ReadArchivedChatProvider provider,
) {
return call(
provider.fileName,
);
return call(provider.fileName);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -74,24 +68,20 @@ class ReadArchivedChatFamily extends Family<AsyncValue<String>> {
/// See also [readArchivedChat].
class ReadArchivedChatProvider extends AutoDisposeFutureProvider<String> {
/// See also [readArchivedChat].
ReadArchivedChatProvider(
String fileName,
) : this._internal(
(ref) => readArchivedChat(
ref as ReadArchivedChatRef,
fileName,
),
from: readArchivedChatProvider,
name: r'readArchivedChatProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$readArchivedChatHash,
dependencies: ReadArchivedChatFamily._dependencies,
allTransitiveDependencies:
ReadArchivedChatFamily._allTransitiveDependencies,
fileName: fileName,
);
ReadArchivedChatProvider(String fileName)
: this._internal(
(ref) => readArchivedChat(ref as ReadArchivedChatRef, fileName),
from: readArchivedChatProvider,
name: r'readArchivedChatProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$readArchivedChatHash,
dependencies: ReadArchivedChatFamily._dependencies,
allTransitiveDependencies:
ReadArchivedChatFamily._allTransitiveDependencies,
fileName: fileName,
);
ReadArchivedChatProvider._internal(
super._createNotifier, {
@@ -150,7 +140,8 @@ mixin ReadArchivedChatRef on AutoDisposeFutureProviderRef<String> {
}
class _ReadArchivedChatProviderElement
extends AutoDisposeFutureProviderElement<String> with ReadArchivedChatRef {
extends AutoDisposeFutureProviderElement<String>
with ReadArchivedChatRef {
_ReadArchivedChatProviderElement(super.provider);
@override
@@ -163,12 +154,15 @@ String _$chatArchiveRepositoryHash() =>
/// See also [ChatArchiveRepository].
@ProviderFor(ChatArchiveRepository)
final chatArchiveRepositoryProvider = AutoDisposeStreamNotifierProvider<
ChatArchiveRepository, List<ChatEntity>>.internal(
ChatArchiveRepository,
List<ChatEntity>
>.internal(
ChatArchiveRepository.new,
name: r'chatArchiveRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$chatArchiveRepositoryHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatArchiveRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -74,13 +74,11 @@ class ChatArchiveSearchRepository extends _$ChatArchiveSearchRepository {
ellipsis: ellipsis,
)
.get()
.then(
(value) {
if (!_streamController.isClosed) {
_streamController.add(value);
}
},
);
.then((value) {
if (!_streamController.isClosed) {
_streamController.add(value);
}
});
}
}
@@ -96,23 +94,24 @@ class ChatArchiveSearchRepository extends _$ChatArchiveSearchRepository {
await searchDatabase.searchDao.indexChats(await _availableChats());
_populatedCompleter.complete();
final changeStreamSubscription =
ref.watch(chatArchiveFileServiceProvider).listen((event) async {
final chat = ChatEntity.fromFileName(path.basename(event.path));
final changeStreamSubscription = ref
.watch(chatArchiveFileServiceProvider)
.listen((event) async {
final chat = ChatEntity.fromFileName(path.basename(event.path));
switch (event.type) {
case ChangeType.ADD:
case ChangeType.MODIFY:
if (chat.name != null) {
final companion = await _readChat(chat);
if (companion != null) {
await searchDatabase.searchDao.upsertChat(companion);
}
switch (event.type) {
case ChangeType.ADD:
case ChangeType.MODIFY:
if (chat.name != null) {
final companion = await _readChat(chat);
if (companion != null) {
await searchDatabase.searchDao.upsertChat(companion);
}
}
case ChangeType.REMOVE:
await searchDatabase.searchDao.deleteChat(chat.fileName);
}
case ChangeType.REMOVE:
await searchDatabase.searchDao.deleteChat(chat.fileName);
}
});
});
ref.onDispose(() async {
await changeStreamSubscription.cancel();
@@ -12,17 +12,20 @@ String _$chatArchiveSearchRepositoryHash() =>
/// See also [ChatArchiveSearchRepository].
@ProviderFor(ChatArchiveSearchRepository)
final chatArchiveSearchRepositoryProvider = AutoDisposeStreamNotifierProvider<
ChatArchiveSearchRepository, List<ChatQueryResult>>.internal(
ChatArchiveSearchRepository,
List<ChatQueryResult>
>.internal(
ChatArchiveSearchRepository.new,
name: r'chatArchiveSearchRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$chatArchiveSearchRepositoryHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$chatArchiveSearchRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ChatArchiveSearchRepository
= AutoDisposeStreamNotifier<List<ChatQueryResult>>;
typedef _$ChatArchiveSearchRepository =
AutoDisposeStreamNotifier<List<ChatQueryResult>>;
// 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
@@ -62,9 +62,7 @@ class ChatArchiveDetailScreen extends HookConsumerWidget {
onPressed: () async {
if (chatAsync.valueOrNull != null) {
await Clipboard.setData(
ClipboardData(
text: chatAsync.valueOrNull!,
),
ClipboardData(text: chatAsync.valueOrNull!),
);
}
},
@@ -94,23 +92,24 @@ class ChatArchiveDetailScreen extends HookConsumerWidget {
enabled: chatAsync.isLoading,
justifyMultiLineText: false,
child: chatAsync.when(
data: (data) => Markdown(
data: data,
selectable: true,
onTapLink: (text, href, title) async {
if (href != null) {
if (Uri.parse(href) case final Uri url) {
await ref
.read(tabRepositoryProvider.notifier)
.addTab(url: url);
data:
(data) => Markdown(
data: data,
selectable: true,
onTapLink: (text, href, title) async {
if (href != null) {
if (Uri.parse(href) case final Uri url) {
await ref
.read(tabRepositoryProvider.notifier)
.addTab(url: url);
if (context.mounted) {
context.go(BrowserRoute().location);
if (context.mounted) {
context.go(BrowserRoute().location);
}
}
}
}
}
},
),
},
),
error: (error, stackTrace) {
return FailureWidget(
title: 'Could not load chat',
@@ -118,9 +117,7 @@ class ChatArchiveDetailScreen extends HookConsumerWidget {
onRetry: () => ref.refresh(readArchivedChatProvider(fileName)),
);
},
loading: () => const Bone.multiText(
lines: 15,
),
loading: () => const Bone.multiText(lines: 15),
),
),
);
@@ -48,8 +48,9 @@ class ChatArchiveListScreen extends HookConsumerWidget {
),
onTap: () async {
await context.push(
ChatArchiveDetailRoute(fileName: chat.fileName)
.location,
ChatArchiveDetailRoute(
fileName: chat.fileName,
).location,
);
},
);
@@ -65,13 +66,15 @@ class ChatArchiveListScreen extends HookConsumerWidget {
onRetry: () => ref.refresh(chatArchiveRepositoryProvider),
);
},
loading: () => ListView.builder(
itemCount: 3,
itemBuilder: (context, index) => const ListTile(
title: Bone.text(),
subtitle: Bone.text(),
),
),
loading:
() => ListView.builder(
itemCount: 3,
itemBuilder:
(context, index) => const ListTile(
title: Bone.text(),
subtitle: Bone.text(),
),
),
),
),
);
@@ -56,58 +56,58 @@ class ChatArchiveSearchScreen extends HookConsumerWidget {
),
body: resultsAsync.when(
skipLoadingOnReload: true,
data: (chats) => FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return ListView.builder(
controller: controller,
itemCount: chats.length,
itemBuilder: (context, index) {
final chat = chats[index];
final chatEntity = ChatEntity.fromFileName(chat.fileName);
data:
(chats) => FadingScroll(
fadingSize: 25,
builder: (context, controller) {
return ListView.builder(
controller: controller,
itemCount: chats.length,
itemBuilder: (context, index) {
final chat = chats[index];
final chatEntity = ChatEntity.fromFileName(chat.fileName);
return Card(
clipBehavior: Clip.antiAlias,
child: InkWell(
onTap: () async {
await context.push(
ChatArchiveDetailRoute(fileName: chat.fileName)
.location,
);
},
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MarkdownBody(
data: '## ${chat.title}',
return Card(
clipBehavior: Clip.antiAlias,
child: InkWell(
onTap: () async {
await context.push(
ChatArchiveDetailRoute(
fileName: chat.fileName,
).location,
);
},
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
MarkdownBody(data: '## ${chat.title}'),
if (chatEntity.dateTime != null)
Text(
chatEntity.dateTime!
.formatWithMinutePrecision(),
),
const SizedBox(height: 8.0),
if (chat.contentSnippet != null)
MarkdownBody(data: chat.contentSnippet!),
],
),
if (chatEntity.dateTime != null)
Text(
chatEntity.dateTime!.formatWithMinutePrecision(),
),
const SizedBox(height: 8.0),
if (chat.contentSnippet != null)
MarkdownBody(
data: chat.contentSnippet!,
),
],
),
),
),
),
);
},
);
},
);
},
),
error: (error, stackTrace) => Center(
child: FailureWidget(
title: 'Chat Search failed',
exception: error,
),
),
),
error:
(error, stackTrace) => Center(
child: FailureWidget(
title: 'Chat Search failed',
exception: error,
),
),
loading: () => const SizedBox.shrink(),
),
);
@@ -42,7 +42,8 @@ class BottomSheetExtend extends _$BottomSheetExtend {
await _extentStreamController.close();
});
return _extentStreamController.stream
.sampleTime(const Duration(milliseconds: 50));
return _extentStreamController.stream.sampleTime(
const Duration(milliseconds: 50),
);
}
}
@@ -13,14 +13,15 @@ String _$bottomSheetControllerHash() =>
@ProviderFor(BottomSheetController)
final bottomSheetControllerProvider =
AutoDisposeNotifierProvider<BottomSheetController, Sheet?>.internal(
BottomSheetController.new,
name: r'bottomSheetControllerProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bottomSheetControllerHash,
dependencies: null,
allTransitiveDependencies: null,
);
BottomSheetController.new,
name: r'bottomSheetControllerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bottomSheetControllerHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BottomSheetController = AutoDisposeNotifier<Sheet?>;
String _$bottomSheetExtendHash() => r'7e11b9047c15bdeb4dfcb488a8573daadb64e25c';
@@ -29,14 +30,15 @@ String _$bottomSheetExtendHash() => r'7e11b9047c15bdeb4dfcb488a8573daadb64e25c';
@ProviderFor(BottomSheetExtend)
final bottomSheetExtendProvider =
StreamNotifierProvider<BottomSheetExtend, double>.internal(
BottomSheetExtend.new,
name: r'bottomSheetExtendProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$bottomSheetExtendHash,
dependencies: null,
allTransitiveDependencies: null,
);
BottomSheetExtend.new,
name: r'bottomSheetExtendProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$bottomSheetExtendHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$BottomSheetExtend = StreamNotifier<double>;
// ignore_for_file: type=lint
@@ -13,14 +13,15 @@ String _$overlayDialogControllerHash() =>
@ProviderFor(OverlayDialogController)
final overlayDialogControllerProvider =
AutoDisposeNotifierProvider<OverlayDialogController, Widget?>.internal(
OverlayDialogController.new,
name: r'overlayDialogControllerProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$overlayDialogControllerHash,
dependencies: null,
allTransitiveDependencies: null,
);
OverlayDialogController.new,
name: r'overlayDialogControllerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$overlayDialogControllerHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$OverlayDialogController = AutoDisposeNotifier<Widget?>;
// ignore_for_file: type=lint
@@ -18,8 +18,9 @@ class BrowserIcon with FastEquatable {
required Color? dominantColor,
required IconSource source,
}) async {
final image =
await tryDecodeImage(bytes).then((image) => image!.toEquatable());
final image = await tryDecodeImage(
bytes,
).then((image) => image!.toEquatable());
return BrowserIcon(
image: image,
@@ -38,9 +39,5 @@ class BrowserIcon with FastEquatable {
bool get cacheHash => true;
@override
List<Object?> get hashParameters => [
image,
dominantColor,
source,
];
List<Object?> get hashParameters => [image, dominantColor, source];
}
@@ -12,17 +12,17 @@ class FindResultState with FastEquatable {
});
factory FindResultState.$default() => FindResultState(
activeMatchOrdinal: -1,
numberOfMatches: 0,
isDoneCounting: false,
);
activeMatchOrdinal: -1,
numberOfMatches: 0,
isDoneCounting: false,
);
@override
List<Object?> get hashParameters => [
activeMatchOrdinal,
numberOfMatches,
isDoneCounting,
];
activeMatchOrdinal,
numberOfMatches,
isDoneCounting,
];
@override
bool get cacheHash => true;
@@ -28,16 +28,20 @@ class HistoryState with FastEquatable {
});
factory HistoryState.$default() => HistoryState(
items: const [],
currentIndex: 0,
canGoBack: false,
canGoForward: false,
);
items: const [],
currentIndex: 0,
canGoBack: false,
canGoForward: false,
);
@override
bool get cacheHash => true;
@override
List<Object?> get hashParameters =>
[items, currentIndex, canGoBack, canGoForward];
List<Object?> get hashParameters => [
items,
currentIndex,
canGoBack,
canGoForward,
];
}
@@ -5,15 +5,10 @@ class ReaderableState with FastEquatable {
final bool active;
ReaderableState({
required this.readerable,
required this.active,
});
ReaderableState({required this.readerable, required this.active});
factory ReaderableState.$default() => ReaderableState(
readerable: false,
active: false,
);
factory ReaderableState.$default() =>
ReaderableState(readerable: false, active: false);
@override
bool get cacheHash => true;
@@ -11,11 +11,8 @@ class SecurityState with FastEquatable {
required this.issuer,
});
factory SecurityState.$default() => SecurityState(
secure: false,
host: "",
issuer: "",
);
factory SecurityState.$default() =>
SecurityState(secure: false, host: "", issuer: "");
@override
bool get cacheHash => true;
@@ -26,12 +26,12 @@ class TabState extends WebPageInfo with FastEquatable {
@override
BrowserIcon? get favicon => icon.mapNotNull(
(icon) => BrowserIcon(
image: icon,
dominantColor: null,
source: IconSource.memory,
),
);
(icon) => BrowserIcon(
image: icon,
dominantColor: null,
source: IconSource.memory,
),
);
final EquatableImage? thumbnail;
@@ -64,40 +64,40 @@ class TabState extends WebPageInfo with FastEquatable {
}) : super(title: title);
factory TabState.$default(String tabId) => TabState(
id: tabId,
contextId: null,
url: Uri.parse('about:blank'),
title: "",
icon: null,
thumbnail: null,
progress: 0,
isPrivate: false,
isFullScreen: false,
isLoading: false,
securityInfoState: SecurityState.$default(),
historyState: HistoryState.$default(),
readerableState: ReaderableState.$default(),
findResultState: FindResultState.$default(),
);
id: tabId,
contextId: null,
url: Uri.parse('about:blank'),
title: "",
icon: null,
thumbnail: null,
progress: 0,
isPrivate: false,
isFullScreen: false,
isLoading: false,
securityInfoState: SecurityState.$default(),
historyState: HistoryState.$default(),
readerableState: ReaderableState.$default(),
findResultState: FindResultState.$default(),
);
@override
bool get cacheHash => true;
@override
List<Object?> get hashParameters => [
id,
contextId,
url,
title,
icon,
thumbnail,
progress,
isPrivate,
isFullScreen,
isLoading,
securityInfoState,
historyState,
readerableState,
findResultState,
];
id,
contextId,
url,
title,
icon,
thumbnail,
progress,
isPrivate,
isFullScreen,
isLoading,
securityInfoState,
historyState,
readerableState,
findResultState,
];
}
@@ -106,7 +106,6 @@ class _$TabStateCWProxyImpl implements _$TabStateCWProxy {
this(findResultState: findResultState);
@override
/// This function **does support** nullification of nullable fields. All `null` values passed to `non-nullable` fields will be ignored. You can also use `TabState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
///
/// Usage
@@ -130,58 +129,71 @@ class _$TabStateCWProxyImpl implements _$TabStateCWProxy {
}) {
return TabState(
id: _value.id,
contextId: contextId == const $CopyWithPlaceholder()
? _value.contextId
// ignore: cast_nullable_to_non_nullable
: contextId as String?,
url: url == const $CopyWithPlaceholder()
? _value.url
// ignore: cast_nullable_to_non_nullable
: url as Uri,
title: title == const $CopyWithPlaceholder()
? _value.title
// ignore: cast_nullable_to_non_nullable
: title as String,
icon: icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as EquatableImage?,
thumbnail: thumbnail == const $CopyWithPlaceholder()
? _value.thumbnail
// ignore: cast_nullable_to_non_nullable
: thumbnail as EquatableImage?,
progress: progress == const $CopyWithPlaceholder()
? _value.progress
// ignore: cast_nullable_to_non_nullable
: progress as int,
isPrivate: isPrivate == const $CopyWithPlaceholder()
? _value.isPrivate
// ignore: cast_nullable_to_non_nullable
: isPrivate as bool,
isFullScreen: isFullScreen == const $CopyWithPlaceholder()
? _value.isFullScreen
// ignore: cast_nullable_to_non_nullable
: isFullScreen as bool,
isLoading: isLoading == const $CopyWithPlaceholder()
? _value.isLoading
// ignore: cast_nullable_to_non_nullable
: isLoading as bool,
securityInfoState: securityInfoState == const $CopyWithPlaceholder()
? _value.securityInfoState
// ignore: cast_nullable_to_non_nullable
: securityInfoState as SecurityState,
historyState: historyState == const $CopyWithPlaceholder()
? _value.historyState
// ignore: cast_nullable_to_non_nullable
: historyState as HistoryState,
readerableState: readerableState == const $CopyWithPlaceholder()
? _value.readerableState
// ignore: cast_nullable_to_non_nullable
: readerableState as ReaderableState,
findResultState: findResultState == const $CopyWithPlaceholder()
? _value.findResultState
// ignore: cast_nullable_to_non_nullable
: findResultState as FindResultState,
contextId:
contextId == const $CopyWithPlaceholder()
? _value.contextId
// ignore: cast_nullable_to_non_nullable
: contextId as String?,
url:
url == const $CopyWithPlaceholder()
? _value.url
// ignore: cast_nullable_to_non_nullable
: url as Uri,
title:
title == const $CopyWithPlaceholder()
? _value.title
// ignore: cast_nullable_to_non_nullable
: title as String,
icon:
icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as EquatableImage?,
thumbnail:
thumbnail == const $CopyWithPlaceholder()
? _value.thumbnail
// ignore: cast_nullable_to_non_nullable
: thumbnail as EquatableImage?,
progress:
progress == const $CopyWithPlaceholder()
? _value.progress
// ignore: cast_nullable_to_non_nullable
: progress as int,
isPrivate:
isPrivate == const $CopyWithPlaceholder()
? _value.isPrivate
// ignore: cast_nullable_to_non_nullable
: isPrivate as bool,
isFullScreen:
isFullScreen == const $CopyWithPlaceholder()
? _value.isFullScreen
// ignore: cast_nullable_to_non_nullable
: isFullScreen as bool,
isLoading:
isLoading == const $CopyWithPlaceholder()
? _value.isLoading
// ignore: cast_nullable_to_non_nullable
: isLoading as bool,
securityInfoState:
securityInfoState == const $CopyWithPlaceholder()
? _value.securityInfoState
// ignore: cast_nullable_to_non_nullable
: securityInfoState as SecurityState,
historyState:
historyState == const $CopyWithPlaceholder()
? _value.historyState
// ignore: cast_nullable_to_non_nullable
: historyState as HistoryState,
readerableState:
readerableState == const $CopyWithPlaceholder()
? _value.readerableState
// ignore: cast_nullable_to_non_nullable
: readerableState as ReaderableState,
findResultState:
findResultState == const $CopyWithPlaceholder()
? _value.findResultState
// ignore: cast_nullable_to_non_nullable
: findResultState as FindResultState,
);
}
}
@@ -33,12 +33,12 @@ class WebExtensionState with FastEquatable {
@override
List<Object?> get hashParameters => [
extensionId,
title,
enabled,
badgeText,
badgeTextColor,
badgeBackgroundColor,
icon,
];
extensionId,
title,
enabled,
badgeText,
badgeTextColor,
badgeBackgroundColor,
icon,
];
}
@@ -69,7 +69,6 @@ class _$WebExtensionStateCWProxyImpl implements _$WebExtensionStateCWProxy {
WebExtensionState icon(EquatableImage? 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 `WebExtensionState(...).copyWith.fieldName(...)` to override fields one at a time with nullification support.
///
/// Usage
@@ -86,34 +85,41 @@ class _$WebExtensionStateCWProxyImpl implements _$WebExtensionStateCWProxy {
Object? icon = const $CopyWithPlaceholder(),
}) {
return WebExtensionState(
extensionId: extensionId == const $CopyWithPlaceholder()
? _value.extensionId
// ignore: cast_nullable_to_non_nullable
: extensionId as String,
enabled: enabled == const $CopyWithPlaceholder()
? _value.enabled
// ignore: cast_nullable_to_non_nullable
: enabled as bool,
title: title == const $CopyWithPlaceholder()
? _value.title
// ignore: cast_nullable_to_non_nullable
: title as String?,
badgeText: badgeText == const $CopyWithPlaceholder()
? _value.badgeText
// ignore: cast_nullable_to_non_nullable
: badgeText as String?,
badgeTextColor: badgeTextColor == const $CopyWithPlaceholder()
? _value.badgeTextColor
// ignore: cast_nullable_to_non_nullable
: badgeTextColor as Color?,
badgeBackgroundColor: badgeBackgroundColor == const $CopyWithPlaceholder()
? _value.badgeBackgroundColor
// ignore: cast_nullable_to_non_nullable
: badgeBackgroundColor as Color?,
icon: icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as EquatableImage?,
extensionId:
extensionId == const $CopyWithPlaceholder()
? _value.extensionId
// ignore: cast_nullable_to_non_nullable
: extensionId as String,
enabled:
enabled == const $CopyWithPlaceholder()
? _value.enabled
// ignore: cast_nullable_to_non_nullable
: enabled as bool,
title:
title == const $CopyWithPlaceholder()
? _value.title
// ignore: cast_nullable_to_non_nullable
: title as String?,
badgeText:
badgeText == const $CopyWithPlaceholder()
? _value.badgeText
// ignore: cast_nullable_to_non_nullable
: badgeText as String?,
badgeTextColor:
badgeTextColor == const $CopyWithPlaceholder()
? _value.badgeTextColor
// ignore: cast_nullable_to_non_nullable
: badgeTextColor as Color?,
badgeBackgroundColor:
badgeBackgroundColor == const $CopyWithPlaceholder()
? _value.badgeBackgroundColor
// ignore: cast_nullable_to_non_nullable
: badgeBackgroundColor as Color?,
icon:
icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: icon as EquatableImage?,
);
}
}
@@ -13,16 +13,15 @@ import 'package:url_launcher/url_launcher.dart';
part 'providers.g.dart';
@Riverpod(keepAlive: true)
GeckoSelectionActionService selectionActionService(
Ref ref,
) {
GeckoSelectionActionService selectionActionService(Ref ref) {
final service = GeckoSelectionActionService.setUp();
unawaited(
service.setActions([
SearchAction((text) async {
final defaultSearchBang =
await ref.read(defaultSearchBangDataProvider.future);
final defaultSearchBang = await ref.read(
defaultSearchBangDataProvider.future,
);
if (defaultSearchBang != null) {
await ref
@@ -33,14 +32,14 @@ GeckoSelectionActionService selectionActionService(
}
}),
PrivateSearchAction((text) async {
final defaultSearchBang =
await ref.read(defaultSearchBangDataProvider.future);
final defaultSearchBang = await ref.read(
defaultSearchBangDataProvider.future,
);
if (defaultSearchBang != null) {
await ref.read(tabRepositoryProvider.notifier).addTab(
url: defaultSearchBang.getUrl(text),
private: true,
);
await ref
.read(tabRepositoryProvider.notifier)
.addTab(url: defaultSearchBang.getUrl(text), private: true);
} else {
logger.e('No default search bang found');
}
@@ -132,12 +131,13 @@ class EngineReadyState extends _$EngineReadyState {
eventService.engineReadyStateEvents
.firstWhere((value) => value == true)
.timeout(
const Duration(seconds: 5),
onTimeout: () {
logger.w('Waiting for engine ready state timed out');
return true;
},
).whenComplete(() => state = true),
const Duration(seconds: 5),
onTimeout: () {
logger.w('Waiting for engine ready state timed out');
return true;
},
)
.whenComplete(() => state = true),
);
}
@@ -13,14 +13,15 @@ String _$selectionActionServiceHash() =>
@ProviderFor(selectionActionService)
final selectionActionServiceProvider =
Provider<GeckoSelectionActionService>.internal(
selectionActionService,
name: r'selectionActionServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$selectionActionServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
selectionActionService,
name: r'selectionActionServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectionActionServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
@@ -64,9 +65,10 @@ String _$tabContentServiceHash() => r'd9a991add907ecc138c62790883e59d8e9aa9266';
final tabContentServiceProvider = Provider<GeckoTabContentService>.internal(
tabContentService,
name: r'tabContentServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$tabContentServiceHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabContentServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -81,14 +83,15 @@ String _$engineSuggestionsServiceHash() =>
@ProviderFor(engineSuggestionsService)
final engineSuggestionsServiceProvider =
Provider<GeckoSuggestionsService>.internal(
engineSuggestionsService,
name: r'engineSuggestionsServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$engineSuggestionsServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
engineSuggestionsService,
name: r'engineSuggestionsServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$engineSuggestionsServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
@@ -100,14 +103,15 @@ String _$selectedTabSessionNotifierHash() =>
@ProviderFor(selectedTabSessionNotifier)
final selectedTabSessionNotifierProvider =
AutoDisposeProvider<Raw<TabSession>>.internal(
selectedTabSessionNotifier,
name: r'selectedTabSessionNotifierProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedTabSessionNotifierHash,
dependencies: null,
allTransitiveDependencies: null,
);
selectedTabSessionNotifier,
name: r'selectedTabSessionNotifierProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedTabSessionNotifierHash,
dependencies: null,
allTransitiveDependencies: null,
);
@Deprecated('Will be removed in 3.0. Use Ref instead')
// ignore: unused_element
@@ -118,14 +122,15 @@ String _$engineReadyStateHash() => r'c682333e2e07cf0635aa7ae793a2088ca648c950';
@ProviderFor(EngineReadyState)
final engineReadyStateProvider =
NotifierProvider<EngineReadyState, bool>.internal(
EngineReadyState.new,
name: r'engineReadyStateProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$engineReadyStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
EngineReadyState.new,
name: r'engineReadyStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$engineReadyStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$EngineReadyState = Notifier<bool>;
// ignore_for_file: type=lint
@@ -12,21 +12,18 @@ class SelectedTab extends _$SelectedTab {
String? build() {
final eventSerivce = ref.watch(eventServiceProvider);
ref.listen(
fireImmediately: true,
engineReadyStateProvider,
(previous, next) async {
if (next) {
await GeckoTabService().syncEvents(onSelectedTabChange: true);
}
},
);
ref.listen(fireImmediately: true, engineReadyStateProvider, (
previous,
next,
) async {
if (next) {
await GeckoTabService().syncEvents(onSelectedTabChange: true);
}
});
final selectedTabSub = eventSerivce.selectedTabEvents.listen(
(tabId) async {
state = tabId;
},
);
final selectedTabSub = eventSerivce.selectedTabEvents.listen((tabId) async {
state = tabId;
});
ref.onDispose(() {
unawaited(selectedTabSub.cancel());
@@ -13,23 +13,20 @@ class TabList extends _$TabList {
List<String> build() {
final eventService = ref.watch(eventServiceProvider);
ref.listen(
fireImmediately: true,
engineReadyStateProvider,
(previous, next) async {
if (next) {
await GeckoTabService().syncEvents(onTabListChange: true);
}
},
);
ref.listen(fireImmediately: true, engineReadyStateProvider, (
previous,
next,
) async {
if (next) {
await GeckoTabService().syncEvents(onTabListChange: true);
}
});
final tabListSub = eventService.tabListEvents.listen(
(tabs) async {
if (!const DeepCollectionEquality().equals(state, tabs)) {
state = tabs;
}
},
);
final tabListSub = eventService.tabListEvents.listen((tabs) async {
if (!const DeepCollectionEquality().equals(state, tabs)) {
state = tabs;
}
});
ref.onDispose(() {
unawaited(tabListSub.cancel());
@@ -43,8 +43,9 @@ class TabSession extends _$TabSession {
@override
void build({required String? tabId}) {
_sessionService = (tabId != null)
? GeckoSessionService(tabId: tabId)
: GeckoSessionService.forActiveTab();
_sessionService =
(tabId != null)
? GeckoSessionService(tabId: tabId)
: GeckoSessionService.forActiveTab();
}
}
@@ -32,9 +32,7 @@ class _SystemHash {
abstract class _$TabSession extends BuildlessAutoDisposeNotifier<void> {
late final String? tabId;
void build({
required String? tabId,
});
void build({required String? tabId});
}
/// See also [TabSession].
@@ -47,21 +45,15 @@ class TabSessionFamily extends Family<void> {
const TabSessionFamily();
/// See also [TabSession].
TabSessionProvider call({
required String? tabId,
}) {
return TabSessionProvider(
tabId: tabId,
);
TabSessionProvider call({required String? tabId}) {
return TabSessionProvider(tabId: tabId);
}
@override
TabSessionProvider getProviderOverride(
covariant TabSessionProvider provider,
) {
return call(
tabId: provider.tabId,
);
return call(tabId: provider.tabId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -83,21 +75,19 @@ class TabSessionFamily extends Family<void> {
class TabSessionProvider
extends AutoDisposeNotifierProviderImpl<TabSession, void> {
/// See also [TabSession].
TabSessionProvider({
required String? tabId,
}) : this._internal(
() => TabSession()..tabId = tabId,
from: tabSessionProvider,
name: r'tabSessionProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabSessionHash,
dependencies: TabSessionFamily._dependencies,
allTransitiveDependencies:
TabSessionFamily._allTransitiveDependencies,
tabId: tabId,
);
TabSessionProvider({required String? tabId})
: this._internal(
() => TabSession()..tabId = tabId,
from: tabSessionProvider,
name: r'tabSessionProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabSessionHash,
dependencies: TabSessionFamily._dependencies,
allTransitiveDependencies: TabSessionFamily._allTransitiveDependencies,
tabId: tabId,
);
TabSessionProvider._internal(
super._createNotifier, {
@@ -112,12 +102,8 @@ class TabSessionProvider
final String? tabId;
@override
void runNotifierBuild(
covariant TabSession notifier,
) {
return notifier.build(
tabId: tabId,
);
void runNotifierBuild(covariant TabSession notifier) {
return notifier.build(tabId: tabId);
}
@override
@@ -170,5 +156,6 @@ class _TabSessionProviderElement
@override
String? get tabId => (origin as TabSessionProvider).tabId;
}
// 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
@@ -24,12 +24,14 @@ class TabStates extends _$TabStates {
void _onTabContentStateChange(TabContentState contentState) {
final current =
state[contentState.id] ?? TabState.$default(contentState.id);
state = {...state}..[contentState.id] = current.copyWith(
state = {...state}
..[contentState.id] = current.copyWith(
contextId: contentState.contextId,
url: Uri.parse(contentState.url),
title: (contentState.title.isNotEmpty)
? contentState.title
: current.title,
title:
(contentState.title.isNotEmpty)
? contentState.title
: current.title,
progress: contentState.progress,
isPrivate: contentState.isPrivate,
isFullScreen: contentState.isFullScreen,
@@ -65,7 +67,8 @@ class TabStates extends _$TabStates {
final SecurityInfoEvent(:tabId, :securityInfo) = event;
final current = state[tabId] ?? TabState.$default(tabId);
state = {...state}..[tabId] = current.copyWith.securityInfoState(
state = {...state}
..[tabId] = current.copyWith.securityInfoState(
SecurityState(
secure: securityInfo.secure,
host: securityInfo.host,
@@ -78,14 +81,18 @@ class TabStates extends _$TabStates {
final HistoryEvent(:tabId, :history) = event;
final current = state[tabId] ?? TabState.$default(tabId);
state = {...state}..[tabId] = current.copyWith.historyState(
state = {...state}
..[tabId] = current.copyWith.historyState(
HistoryState(
items: history.items.nonNulls
.map(
(item) =>
HistoryItem(url: Uri.parse(item.url), title: item.title),
)
.toList(),
items:
history.items.nonNulls
.map(
(item) => HistoryItem(
url: Uri.parse(item.url),
title: item.title,
),
)
.toList(),
currentIndex: history.currentIndex,
canGoBack: history.canGoBack,
canGoForward: history.canGoForward,
@@ -97,7 +104,8 @@ class TabStates extends _$TabStates {
final ReaderableEvent(:tabId, :readerable) = event;
final current = state[tabId] ?? TabState.$default(tabId);
state = {...state}..[tabId] = current.copyWith.readerableState(
state = {...state}
..[tabId] = current.copyWith.readerableState(
ReaderableState(
readerable: readerable.readerable,
active: readerable.active,
@@ -112,7 +120,8 @@ class TabStates extends _$TabStates {
final result = results.last;
final current = state[tabId] ?? TabState.$default(tabId);
state = {...state}..[tabId] = current.copyWith.findResultState(
state = {...state}
..[tabId] = current.copyWith.findResultState(
FindResultState(
activeMatchOrdinal: result.activeMatchOrdinal,
numberOfMatches: result.numberOfMatches,
@@ -127,59 +136,44 @@ class TabStates extends _$TabStates {
final eventService = ref.watch(eventServiceProvider);
final subscriptions = [
eventService.tabContentEvents.listen(
(event) async {
await _lock.synchronized(() => _onTabContentStateChange(event));
},
),
eventService.iconChangeEvents.listen(
(event) async {
await _lock.synchronized(() => _onIconChange(event));
},
),
eventService.thumbnailEvents.listen(
(event) async {
await _lock.synchronized(() => _onThumbnailChange(event));
},
),
eventService.securityInfoEvents.listen(
(event) async {
await _lock.synchronized(() => _onSecurityInfoStateChange(event));
},
),
eventService.historyEvents.listen(
(event) async {
await _lock.synchronized(() => _onHistoryStateChange(event));
},
),
eventService.readerableEvents.listen(
(event) async {
await _lock.synchronized(() => _onReaderableStateChange(event));
},
),
eventService.findResultsEvent.listen(
(event) async {
await _lock.synchronized(() => _onFindResultsChange(event));
},
),
eventService.tabContentEvents.listen((event) async {
await _lock.synchronized(() => _onTabContentStateChange(event));
}),
eventService.iconChangeEvents.listen((event) async {
await _lock.synchronized(() => _onIconChange(event));
}),
eventService.thumbnailEvents.listen((event) async {
await _lock.synchronized(() => _onThumbnailChange(event));
}),
eventService.securityInfoEvents.listen((event) async {
await _lock.synchronized(() => _onSecurityInfoStateChange(event));
}),
eventService.historyEvents.listen((event) async {
await _lock.synchronized(() => _onHistoryStateChange(event));
}),
eventService.readerableEvents.listen((event) async {
await _lock.synchronized(() => _onReaderableStateChange(event));
}),
eventService.findResultsEvent.listen((event) async {
await _lock.synchronized(() => _onFindResultsChange(event));
}),
];
ref.listen(
fireImmediately: true,
engineReadyStateProvider,
(previous, next) async {
if (next) {
await GeckoTabService().syncEvents(
onTabContentStateChange: true,
onIconChange: true,
onThumbnailChange: true,
onSecurityInfoStateChange: true,
onHistoryStateChange: true,
onFindResults: true,
);
}
},
);
ref.listen(fireImmediately: true, engineReadyStateProvider, (
previous,
next,
) async {
if (next) {
await GeckoTabService().syncEvents(
onTabContentStateChange: true,
onIconChange: true,
onThumbnailChange: true,
onSecurityInfoStateChange: true,
onHistoryStateChange: true,
onFindResults: true,
);
}
});
ref.onDispose(() {
for (final sub in subscriptions) {
@@ -197,9 +191,7 @@ TabState? tabState(Ref ref, String? tabId) {
return null;
}
return ref.watch(
tabStatesProvider.select((tabs) => tabs[tabId]),
);
return ref.watch(tabStatesProvider.select((tabs) => tabs[tabId]));
}
@Riverpod()
@@ -39,21 +39,13 @@ class TabStateFamily extends Family<TabState?> {
const TabStateFamily();
/// See also [tabState].
TabStateProvider call(
String? tabId,
) {
return TabStateProvider(
tabId,
);
TabStateProvider call(String? tabId) {
return TabStateProvider(tabId);
}
@override
TabStateProvider getProviderOverride(
covariant TabStateProvider provider,
) {
return call(
provider.tabId,
);
TabStateProvider getProviderOverride(covariant TabStateProvider provider) {
return call(provider.tabId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -74,23 +66,19 @@ class TabStateFamily extends Family<TabState?> {
/// See also [tabState].
class TabStateProvider extends AutoDisposeProvider<TabState?> {
/// See also [tabState].
TabStateProvider(
String? tabId,
) : this._internal(
(ref) => tabState(
ref as TabStateRef,
tabId,
),
from: tabStateProvider,
name: r'tabStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabStateHash,
dependencies: TabStateFamily._dependencies,
allTransitiveDependencies: TabStateFamily._allTransitiveDependencies,
tabId: tabId,
);
TabStateProvider(String? tabId)
: this._internal(
(ref) => tabState(ref as TabStateRef, tabId),
from: tabStateProvider,
name: r'tabStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabStateHash,
dependencies: TabStateFamily._dependencies,
allTransitiveDependencies: TabStateFamily._allTransitiveDependencies,
tabId: tabId,
);
TabStateProvider._internal(
super._createNotifier, {
@@ -105,9 +93,7 @@ class TabStateProvider extends AutoDisposeProvider<TabState?> {
final String? tabId;
@override
Override overrideWith(
TabState? Function(TabStateRef provider) create,
) {
Override overrideWith(TabState? Function(TabStateRef provider) create) {
return ProviderOverride(
origin: this,
override: TabStateProvider._internal(
@@ -163,9 +149,10 @@ String _$selectedTabStateHash() => r'dbd36af7af286bd9d079f30e8e11bbda23bf7728';
final selectedTabStateProvider = AutoDisposeProvider<TabState?>.internal(
selectedTabState,
name: r'selectedTabStateProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedTabStateHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedTabStateHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -179,13 +166,15 @@ String _$tabStatesHash() => r'296d85ec016b22236b5830fce6b01cda81fbc02d';
@ProviderFor(TabStates)
final tabStatesProvider =
NotifierProvider<TabStates, Map<String, TabState>>.internal(
TabStates.new,
name: r'tabStatesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$tabStatesHash,
dependencies: null,
allTransitiveDependencies: null,
);
TabStates.new,
name: r'tabStatesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabStatesHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$TabStates = Notifier<Map<String, TabState>>;
// ignore_for_file: type=lint
@@ -23,21 +23,25 @@ class WebExtensionsState extends _$WebExtensionsState {
final ExtensionDataEvent(:extensionId, :data) = event;
if (data != null) {
final current = state[extensionId] ??
final current =
state[extensionId] ??
WebExtensionState(
extensionId: extensionId,
icon: _imageCache[extensionId],
enabled: false,
);
state = {...state}..[extensionId] = current.copyWith(
state = {...state}
..[extensionId] = current.copyWith(
title: data.title,
enabled: data.enabled ?? current.enabled,
badgeText: data.badgeText,
badgeTextColor:
data.badgeTextColor.mapNotNull((color) => Color(color)),
badgeBackgroundColor:
data.badgeBackgroundColor.mapNotNull((color) => Color(color)),
badgeTextColor: data.badgeTextColor.mapNotNull(
(color) => Color(color),
),
badgeBackgroundColor: data.badgeBackgroundColor.mapNotNull(
(color) => Color(color),
),
);
} else {
if (state.containsKey(extensionId)) {
@@ -49,16 +53,17 @@ class WebExtensionsState extends _$WebExtensionsState {
Future<void> _onIconChange(ExtensionIconEvent event) async {
final ExtensionIconEvent(:extensionId, :bytes) = event;
final image =
await tryDecodeImage(bytes).then((image) async => image?.toEquatable());
final image = await tryDecodeImage(
bytes,
).then((image) async => image?.toEquatable());
if (image != null) {
if (_imageCache[extensionId] != image) {
_imageCache[extensionId] = image;
if (state.containsKey(extensionId)) {
state = {...state}..[extensionId] =
state[extensionId]!.copyWith.icon(image);
state = {...state}
..[extensionId] = state[extensionId]!.copyWith.icon(image);
}
}
}
@@ -70,29 +75,21 @@ class WebExtensionsState extends _$WebExtensionsState {
final subscriptions = switch (actionType) {
WebExtensionActionType.browser => [
addonService.browserExtensionStream.listen(
(event) async {
await _lock.synchronized(() => _onExtensionUpdate(event));
},
),
addonService.browserIconStream.listen(
(event) async {
await _lock.synchronized(() => _onIconChange(event));
},
),
],
addonService.browserExtensionStream.listen((event) async {
await _lock.synchronized(() => _onExtensionUpdate(event));
}),
addonService.browserIconStream.listen((event) async {
await _lock.synchronized(() => _onIconChange(event));
}),
],
WebExtensionActionType.page => [
addonService.pageExtensionStream.listen(
(event) async {
await _lock.synchronized(() => _onExtensionUpdate(event));
},
),
addonService.pageIconStream.listen(
(event) async {
await _lock.synchronized(() => _onIconChange(event));
},
),
],
addonService.pageExtensionStream.listen((event) async {
await _lock.synchronized(() => _onExtensionUpdate(event));
}),
addonService.pageIconStream.listen((event) async {
await _lock.synchronized(() => _onIconChange(event));
}),
],
};
ref.onDispose(() {
@@ -34,9 +34,7 @@ abstract class _$WebExtensionsState
extends BuildlessNotifier<Map<String, WebExtensionState>> {
late final WebExtensionActionType actionType;
Map<String, WebExtensionState> build(
WebExtensionActionType actionType,
);
Map<String, WebExtensionState> build(WebExtensionActionType actionType);
}
/// See also [WebExtensionsState].
@@ -49,21 +47,15 @@ class WebExtensionsStateFamily extends Family<Map<String, WebExtensionState>> {
const WebExtensionsStateFamily();
/// See also [WebExtensionsState].
WebExtensionsStateProvider call(
WebExtensionActionType actionType,
) {
return WebExtensionsStateProvider(
actionType,
);
WebExtensionsStateProvider call(WebExtensionActionType actionType) {
return WebExtensionsStateProvider(actionType);
}
@override
WebExtensionsStateProvider getProviderOverride(
covariant WebExtensionsStateProvider provider,
) {
return call(
provider.actionType,
);
return call(provider.actionType);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -82,24 +74,27 @@ class WebExtensionsStateFamily extends Family<Map<String, WebExtensionState>> {
}
/// See also [WebExtensionsState].
class WebExtensionsStateProvider extends NotifierProviderImpl<
WebExtensionsState, Map<String, WebExtensionState>> {
class WebExtensionsStateProvider
extends
NotifierProviderImpl<
WebExtensionsState,
Map<String, WebExtensionState>
> {
/// See also [WebExtensionsState].
WebExtensionsStateProvider(
WebExtensionActionType actionType,
) : this._internal(
() => WebExtensionsState()..actionType = actionType,
from: webExtensionsStateProvider,
name: r'webExtensionsStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$webExtensionsStateHash,
dependencies: WebExtensionsStateFamily._dependencies,
allTransitiveDependencies:
WebExtensionsStateFamily._allTransitiveDependencies,
actionType: actionType,
);
WebExtensionsStateProvider(WebExtensionActionType actionType)
: this._internal(
() => WebExtensionsState()..actionType = actionType,
from: webExtensionsStateProvider,
name: r'webExtensionsStateProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$webExtensionsStateHash,
dependencies: WebExtensionsStateFamily._dependencies,
allTransitiveDependencies:
WebExtensionsStateFamily._allTransitiveDependencies,
actionType: actionType,
);
WebExtensionsStateProvider._internal(
super._createNotifier, {
@@ -117,9 +112,7 @@ class WebExtensionsStateProvider extends NotifierProviderImpl<
Map<String, WebExtensionState> runNotifierBuild(
covariant WebExtensionsState notifier,
) {
return notifier.build(
actionType,
);
return notifier.build(actionType);
}
@override
@@ -140,7 +133,7 @@ class WebExtensionsStateProvider extends NotifierProviderImpl<
@override
NotifierProviderElement<WebExtensionsState, Map<String, WebExtensionState>>
createElement() {
createElement() {
return _WebExtensionsStateProviderElement(this);
}
@@ -167,14 +160,19 @@ mixin WebExtensionsStateRef
WebExtensionActionType get actionType;
}
class _WebExtensionsStateProviderElement extends NotifierProviderElement<
WebExtensionsState,
Map<String, WebExtensionState>> with WebExtensionsStateRef {
class _WebExtensionsStateProviderElement
extends
NotifierProviderElement<
WebExtensionsState,
Map<String, WebExtensionState>
>
with WebExtensionsStateRef {
_WebExtensionsStateProviderElement(super.provider);
@override
WebExtensionActionType get actionType =>
(origin as WebExtensionsStateProvider).actionType;
}
// 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
@@ -98,16 +98,17 @@ class TabRepository extends _$TabRepository {
final db = ref.watch(tabDatabaseProvider);
final tabAddedSub = eventSerivce.tabAddedStream.listen(
(tabId) async {
final containerId = ref.read(selectedContainerProvider);
await db.tabDao
.upsertUnassignedTab(tabId, containerId: Value(containerId));
},
);
final tabAddedSub = eventSerivce.tabAddedStream.listen((tabId) async {
final containerId = ref.read(selectedContainerProvider);
await db.tabDao.upsertUnassignedTab(
tabId,
containerId: Value(containerId),
);
});
final tabContentSub =
tabContentService.tabContentStream.listen((content) async {
final tabContentSub = tabContentService.tabContentStream.listen((
content,
) async {
await db.tabDao.updateTabContent(
content.tabId,
isProbablyReaderable: content.isProbablyReaderable,
@@ -118,42 +119,33 @@ class TabRepository extends _$TabRepository {
);
});
ref.listen(
selectedTabProvider,
(previous, tabId) async {
if (tabId != null) {
await db.tabDao.touchTab(tabId, timestamp: DateTime.now());
}
},
);
ref.listen(selectedTabProvider, (previous, tabId) async {
if (tabId != null) {
await db.tabDao.touchTab(tabId, timestamp: DateTime.now());
}
});
ref.listen(
tabListProvider,
(previous, next) async {
//Only sync tabs if there has been a previous value or is not empty
final syncTabs = next.isNotEmpty || (previous?.isNotEmpty ?? false);
ref.listen(tabListProvider, (previous, next) async {
//Only sync tabs if there has been a previous value or is not empty
final syncTabs = next.isNotEmpty || (previous?.isNotEmpty ?? false);
if (syncTabs) {
await db.tabDao.syncTabs(retainTabIds: next);
}
},
);
if (syncTabs) {
await db.tabDao.syncTabs(retainTabIds: next);
}
});
ref.listen(
tabStatesProvider,
(previous, next) async {
//Since state changes occure pretty often and our map always contains
//the latest state, we cache the value before starting debouncing and
//later diff to that, to avoid frequent database writes
if (!tabStateDebouncer.isDebouncing) {
debounceStartValue = previous;
}
ref.listen(tabStatesProvider, (previous, next) async {
//Since state changes occure pretty often and our map always contains
//the latest state, we cache the value before starting debouncing and
//later diff to that, to avoid frequent database writes
if (!tabStateDebouncer.isDebouncing) {
debounceStartValue = previous;
}
tabStateDebouncer.eventOccured(() async {
await db.tabDao.updateTabs(debounceStartValue, next);
});
},
);
tabStateDebouncer.eventOccured(() async {
await db.tabDao.updateTabs(debounceStartValue, next);
});
});
ref.onDispose(() {
tabStateDebouncer.dispose();
@@ -13,9 +13,10 @@ String _$tabRepositoryHash() => r'85af29fa18ea5a4a67fbffbb9478c801dafddac2';
final tabRepositoryProvider = NotifierProvider<TabRepository, void>.internal(
TabRepository.new,
name: r'tabRepositoryProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$tabRepositoryHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$tabRepositoryHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -40,15 +40,16 @@ class SelectedBangData extends _$SelectedBangData {
@override
BangData? build({String? domain}) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
final selectedBangTrigger =
ref.watch(selectedBangTriggerProvider(domain: domain));
final subscription = repository.watchBang(selectedBangTrigger).listen(
(value) {
state = value;
},
final selectedBangTrigger = ref.watch(
selectedBangTriggerProvider(domain: domain),
);
final subscription = repository.watchBang(selectedBangTrigger).listen((
value,
) {
state = value;
});
ref.onDispose(() {
unawaited(subscription.cancel());
});
@@ -111,8 +112,9 @@ EquatableCollection<List<String>> availableTabIds(
ContainerFilter containerFilter,
) {
final containerTabs = ref.watch(
containerTabIdsProvider(containerFilter)
.select((value) => value.valueOrNull),
containerTabIdsProvider(
containerFilter,
).select((value) => value.valueOrNull),
);
final tabList = ref.watch(tabListProvider);
@@ -130,13 +132,10 @@ EquatableCollection<Map<String, TabState>> availableTabStates(
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
final tabStates = ref.watch(tabStatesProvider);
return EquatableCollection(
{
for (final tabId in availableTabs.collection)
if (tabStates.containsKey(tabId)) tabId: tabStates[tabId]!,
},
immutable: true,
);
return EquatableCollection({
for (final tabId in availableTabs.collection)
if (tabStates.containsKey(tabId)) tabId: tabStates[tabId]!,
}, immutable: true);
}
@Riverpod()
@@ -145,16 +144,17 @@ EquatableCollection<List<String>> seamlessFilteredTabIds(
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
final tabSearchResults = ref
.watch(
tabSearchRepositoryProvider(searchPartition).select(
(value) => EquatableCollection(
value.valueOrNull?.map((tab) => tab.id).toList(),
immutable: true,
),
),
)
.collection;
final tabSearchResults =
ref
.watch(
tabSearchRepositoryProvider(searchPartition).select(
(value) => EquatableCollection(
value.valueOrNull?.map((tab) => tab.id).toList(),
immutable: true,
),
),
)
.collection;
final availableTabs = ref.watch(availableTabIdsProvider(containerFilter));
@@ -176,19 +176,19 @@ EquatableCollection<List<TabPreview>> seamlessFilteredTabPreviews(
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
final tabSearchResults = ref
.watch(
tabSearchRepositoryProvider(searchPartition).select(
(value) => EquatableCollection(
value.valueOrNull,
immutable: true,
),
),
)
.collection;
final tabSearchResults =
ref
.watch(
tabSearchRepositoryProvider(searchPartition).select(
(value) =>
EquatableCollection(value.valueOrNull, immutable: true),
),
)
.collection;
final availableTabStates =
ref.watch(availableTabStatesProvider(containerFilter));
final availableTabStates = ref.watch(
availableTabStatesProvider(containerFilter),
);
if (tabSearchResults == null) {
return EquatableCollection(
@@ -216,7 +216,8 @@ EquatableCollection<List<TabPreview>> seamlessFilteredTabPreviews(
id: tab.id,
title: tab.title ?? availableTabStates.collection[tab.id]!.title,
icon: null,
url: tab.cleanUrl.mapNotNull(Uri.tryParse) ??
url:
tab.cleanUrl.mapNotNull(Uri.tryParse) ??
availableTabStates.collection[tab.id]!.url,
highlightedUrl: tab.url,
content: tab.extractedContent ?? tab.fullContent,
@@ -39,21 +39,15 @@ class AvailableTabIdsFamily extends Family<EquatableCollection<List<String>>> {
const AvailableTabIdsFamily();
/// See also [availableTabIds].
AvailableTabIdsProvider call(
ContainerFilter containerFilter,
) {
return AvailableTabIdsProvider(
containerFilter,
);
AvailableTabIdsProvider call(ContainerFilter containerFilter) {
return AvailableTabIdsProvider(containerFilter);
}
@override
AvailableTabIdsProvider getProviderOverride(
covariant AvailableTabIdsProvider provider,
) {
return call(
provider.containerFilter,
);
return call(provider.containerFilter);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -75,24 +69,20 @@ class AvailableTabIdsFamily extends Family<EquatableCollection<List<String>>> {
class AvailableTabIdsProvider
extends AutoDisposeProvider<EquatableCollection<List<String>>> {
/// See also [availableTabIds].
AvailableTabIdsProvider(
ContainerFilter containerFilter,
) : this._internal(
(ref) => availableTabIds(
ref as AvailableTabIdsRef,
containerFilter,
),
from: availableTabIdsProvider,
name: r'availableTabIdsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$availableTabIdsHash,
dependencies: AvailableTabIdsFamily._dependencies,
allTransitiveDependencies:
AvailableTabIdsFamily._allTransitiveDependencies,
containerFilter: containerFilter,
);
AvailableTabIdsProvider(ContainerFilter containerFilter)
: this._internal(
(ref) => availableTabIds(ref as AvailableTabIdsRef, containerFilter),
from: availableTabIdsProvider,
name: r'availableTabIdsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$availableTabIdsHash,
dependencies: AvailableTabIdsFamily._dependencies,
allTransitiveDependencies:
AvailableTabIdsFamily._allTransitiveDependencies,
containerFilter: containerFilter,
);
AvailableTabIdsProvider._internal(
super._createNotifier, {
@@ -109,7 +99,7 @@ class AvailableTabIdsProvider
@override
Override overrideWith(
EquatableCollection<List<String>> Function(AvailableTabIdsRef provider)
create,
create,
) {
return ProviderOverride(
origin: this,
@@ -127,7 +117,7 @@ class AvailableTabIdsProvider
@override
AutoDisposeProviderElement<EquatableCollection<List<String>>>
createElement() {
createElement() {
return _AvailableTabIdsProviderElement(this);
}
@@ -178,21 +168,15 @@ class AvailableTabStatesFamily
const AvailableTabStatesFamily();
/// See also [availableTabStates].
AvailableTabStatesProvider call(
ContainerFilter containerFilter,
) {
return AvailableTabStatesProvider(
containerFilter,
);
AvailableTabStatesProvider call(ContainerFilter containerFilter) {
return AvailableTabStatesProvider(containerFilter);
}
@override
AvailableTabStatesProvider getProviderOverride(
covariant AvailableTabStatesProvider provider,
) {
return call(
provider.containerFilter,
);
return call(provider.containerFilter);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -214,24 +198,21 @@ class AvailableTabStatesFamily
class AvailableTabStatesProvider
extends AutoDisposeProvider<EquatableCollection<Map<String, TabState>>> {
/// See also [availableTabStates].
AvailableTabStatesProvider(
ContainerFilter containerFilter,
) : this._internal(
(ref) => availableTabStates(
ref as AvailableTabStatesRef,
containerFilter,
),
from: availableTabStatesProvider,
name: r'availableTabStatesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$availableTabStatesHash,
dependencies: AvailableTabStatesFamily._dependencies,
allTransitiveDependencies:
AvailableTabStatesFamily._allTransitiveDependencies,
containerFilter: containerFilter,
);
AvailableTabStatesProvider(ContainerFilter containerFilter)
: this._internal(
(ref) =>
availableTabStates(ref as AvailableTabStatesRef, containerFilter),
from: availableTabStatesProvider,
name: r'availableTabStatesProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$availableTabStatesHash,
dependencies: AvailableTabStatesFamily._dependencies,
allTransitiveDependencies:
AvailableTabStatesFamily._allTransitiveDependencies,
containerFilter: containerFilter,
);
AvailableTabStatesProvider._internal(
super._createNotifier, {
@@ -248,8 +229,9 @@ class AvailableTabStatesProvider
@override
Override overrideWith(
EquatableCollection<Map<String, TabState>> Function(
AvailableTabStatesRef provider)
create,
AvailableTabStatesRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
@@ -267,7 +249,7 @@ class AvailableTabStatesProvider
@override
AutoDisposeProviderElement<EquatableCollection<Map<String, TabState>>>
createElement() {
createElement() {
return _AvailableTabStatesProviderElement(this);
}
@@ -294,8 +276,10 @@ mixin AvailableTabStatesRef
ContainerFilter get containerFilter;
}
class _AvailableTabStatesProviderElement extends AutoDisposeProviderElement<
EquatableCollection<Map<String, TabState>>> with AvailableTabStatesRef {
class _AvailableTabStatesProviderElement
extends
AutoDisposeProviderElement<EquatableCollection<Map<String, TabState>>>
with AvailableTabStatesRef {
_AvailableTabStatesProviderElement(super.provider);
@override
@@ -321,20 +305,14 @@ class SeamlessFilteredTabIdsFamily
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) {
return SeamlessFilteredTabIdsProvider(
searchPartition,
containerFilter,
);
return SeamlessFilteredTabIdsProvider(searchPartition, containerFilter);
}
@override
SeamlessFilteredTabIdsProvider getProviderOverride(
covariant SeamlessFilteredTabIdsProvider provider,
) {
return call(
provider.searchPartition,
provider.containerFilter,
);
return call(provider.searchPartition, provider.containerFilter);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -360,23 +338,23 @@ class SeamlessFilteredTabIdsProvider
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) : this._internal(
(ref) => seamlessFilteredTabIds(
ref as SeamlessFilteredTabIdsRef,
searchPartition,
containerFilter,
),
from: seamlessFilteredTabIdsProvider,
name: r'seamlessFilteredTabIdsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabIdsHash,
dependencies: SeamlessFilteredTabIdsFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabIdsFamily._allTransitiveDependencies,
searchPartition: searchPartition,
containerFilter: containerFilter,
);
(ref) => seamlessFilteredTabIds(
ref as SeamlessFilteredTabIdsRef,
searchPartition,
containerFilter,
),
from: seamlessFilteredTabIdsProvider,
name: r'seamlessFilteredTabIdsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabIdsHash,
dependencies: SeamlessFilteredTabIdsFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabIdsFamily._allTransitiveDependencies,
searchPartition: searchPartition,
containerFilter: containerFilter,
);
SeamlessFilteredTabIdsProvider._internal(
super._createNotifier, {
@@ -395,8 +373,9 @@ class SeamlessFilteredTabIdsProvider
@override
Override overrideWith(
EquatableCollection<List<String>> Function(
SeamlessFilteredTabIdsRef provider)
create,
SeamlessFilteredTabIdsRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
@@ -415,7 +394,7 @@ class SeamlessFilteredTabIdsProvider
@override
AutoDisposeProviderElement<EquatableCollection<List<String>>>
createElement() {
createElement() {
return _SeamlessFilteredTabIdsProviderElement(this);
}
@@ -488,10 +467,7 @@ class SeamlessFilteredTabPreviewsFamily
SeamlessFilteredTabPreviewsProvider getProviderOverride(
covariant SeamlessFilteredTabPreviewsProvider provider,
) {
return call(
provider.searchPartition,
provider.containerFilter,
);
return call(provider.searchPartition, provider.containerFilter);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -517,23 +493,23 @@ class SeamlessFilteredTabPreviewsProvider
TabSearchPartition searchPartition,
ContainerFilter containerFilter,
) : this._internal(
(ref) => seamlessFilteredTabPreviews(
ref as SeamlessFilteredTabPreviewsRef,
searchPartition,
containerFilter,
),
from: seamlessFilteredTabPreviewsProvider,
name: r'seamlessFilteredTabPreviewsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabPreviewsHash,
dependencies: SeamlessFilteredTabPreviewsFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabPreviewsFamily._allTransitiveDependencies,
searchPartition: searchPartition,
containerFilter: containerFilter,
);
(ref) => seamlessFilteredTabPreviews(
ref as SeamlessFilteredTabPreviewsRef,
searchPartition,
containerFilter,
),
from: seamlessFilteredTabPreviewsProvider,
name: r'seamlessFilteredTabPreviewsProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$seamlessFilteredTabPreviewsHash,
dependencies: SeamlessFilteredTabPreviewsFamily._dependencies,
allTransitiveDependencies:
SeamlessFilteredTabPreviewsFamily._allTransitiveDependencies,
searchPartition: searchPartition,
containerFilter: containerFilter,
);
SeamlessFilteredTabPreviewsProvider._internal(
super._createNotifier, {
@@ -552,8 +528,9 @@ class SeamlessFilteredTabPreviewsProvider
@override
Override overrideWith(
EquatableCollection<List<TabPreview>> Function(
SeamlessFilteredTabPreviewsRef provider)
create,
SeamlessFilteredTabPreviewsRef provider,
)
create,
) {
return ProviderOverride(
origin: this,
@@ -572,7 +549,7 @@ class SeamlessFilteredTabPreviewsProvider
@override
AutoDisposeProviderElement<EquatableCollection<List<TabPreview>>>
createElement() {
createElement() {
return _SeamlessFilteredTabPreviewsProviderElement(this);
}
@@ -623,9 +600,7 @@ String _$selectedBangTriggerHash() =>
abstract class _$SelectedBangTrigger extends BuildlessNotifier<String?> {
late final String? domain;
String? build({
String? domain,
});
String? build({String? domain});
}
/// See also [SelectedBangTrigger].
@@ -638,21 +613,15 @@ class SelectedBangTriggerFamily extends Family<String?> {
const SelectedBangTriggerFamily();
/// See also [SelectedBangTrigger].
SelectedBangTriggerProvider call({
String? domain,
}) {
return SelectedBangTriggerProvider(
domain: domain,
);
SelectedBangTriggerProvider call({String? domain}) {
return SelectedBangTriggerProvider(domain: domain);
}
@override
SelectedBangTriggerProvider getProviderOverride(
covariant SelectedBangTriggerProvider provider,
) {
return call(
domain: provider.domain,
);
return call(domain: provider.domain);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -674,21 +643,20 @@ class SelectedBangTriggerFamily extends Family<String?> {
class SelectedBangTriggerProvider
extends NotifierProviderImpl<SelectedBangTrigger, String?> {
/// See also [SelectedBangTrigger].
SelectedBangTriggerProvider({
String? domain,
}) : this._internal(
() => SelectedBangTrigger()..domain = domain,
from: selectedBangTriggerProvider,
name: r'selectedBangTriggerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedBangTriggerHash,
dependencies: SelectedBangTriggerFamily._dependencies,
allTransitiveDependencies:
SelectedBangTriggerFamily._allTransitiveDependencies,
domain: domain,
);
SelectedBangTriggerProvider({String? domain})
: this._internal(
() => SelectedBangTrigger()..domain = domain,
from: selectedBangTriggerProvider,
name: r'selectedBangTriggerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedBangTriggerHash,
dependencies: SelectedBangTriggerFamily._dependencies,
allTransitiveDependencies:
SelectedBangTriggerFamily._allTransitiveDependencies,
domain: domain,
);
SelectedBangTriggerProvider._internal(
super._createNotifier, {
@@ -703,12 +671,8 @@ class SelectedBangTriggerProvider
final String? domain;
@override
String? runNotifierBuild(
covariant SelectedBangTrigger notifier,
) {
return notifier.build(
domain: domain,
);
String? runNotifierBuild(covariant SelectedBangTrigger notifier) {
return notifier.build(domain: domain);
}
@override
@@ -768,9 +732,7 @@ abstract class _$SelectedBangData
extends BuildlessAutoDisposeNotifier<BangData?> {
late final String? domain;
BangData? build({
String? domain,
});
BangData? build({String? domain});
}
/// See also [SelectedBangData].
@@ -783,21 +745,15 @@ class SelectedBangDataFamily extends Family<BangData?> {
const SelectedBangDataFamily();
/// See also [SelectedBangData].
SelectedBangDataProvider call({
String? domain,
}) {
return SelectedBangDataProvider(
domain: domain,
);
SelectedBangDataProvider call({String? domain}) {
return SelectedBangDataProvider(domain: domain);
}
@override
SelectedBangDataProvider getProviderOverride(
covariant SelectedBangDataProvider provider,
) {
return call(
domain: provider.domain,
);
return call(domain: provider.domain);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -819,21 +775,20 @@ class SelectedBangDataFamily extends Family<BangData?> {
class SelectedBangDataProvider
extends AutoDisposeNotifierProviderImpl<SelectedBangData, BangData?> {
/// See also [SelectedBangData].
SelectedBangDataProvider({
String? domain,
}) : this._internal(
() => SelectedBangData()..domain = domain,
from: selectedBangDataProvider,
name: r'selectedBangDataProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedBangDataHash,
dependencies: SelectedBangDataFamily._dependencies,
allTransitiveDependencies:
SelectedBangDataFamily._allTransitiveDependencies,
domain: domain,
);
SelectedBangDataProvider({String? domain})
: this._internal(
() => SelectedBangData()..domain = domain,
from: selectedBangDataProvider,
name: r'selectedBangDataProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$selectedBangDataHash,
dependencies: SelectedBangDataFamily._dependencies,
allTransitiveDependencies:
SelectedBangDataFamily._allTransitiveDependencies,
domain: domain,
);
SelectedBangDataProvider._internal(
super._createNotifier, {
@@ -848,12 +803,8 @@ class SelectedBangDataProvider
final String? domain;
@override
BangData? runNotifierBuild(
covariant SelectedBangData notifier,
) {
return notifier.build(
domain: domain,
);
BangData? runNotifierBuild(covariant SelectedBangData notifier) {
return notifier.build(domain: domain);
}
@override
@@ -874,7 +825,7 @@ class SelectedBangDataProvider
@override
AutoDisposeNotifierProviderElement<SelectedBangData, BangData?>
createElement() {
createElement() {
return _SelectedBangDataProviderElement(this);
}
@@ -915,14 +866,15 @@ String _$lastUsedAssistantModeHash() =>
@ProviderFor(LastUsedAssistantMode)
final lastUsedAssistantModeProvider =
NotifierProvider<LastUsedAssistantMode, AssistantMode>.internal(
LastUsedAssistantMode.new,
name: r'lastUsedAssistantModeProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$lastUsedAssistantModeHash,
dependencies: null,
allTransitiveDependencies: null,
);
LastUsedAssistantMode.new,
name: r'lastUsedAssistantModeProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$lastUsedAssistantModeHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$LastUsedAssistantMode = Notifier<AssistantMode>;
String _$activeResearchVariantHash() =>
@@ -932,14 +884,15 @@ String _$activeResearchVariantHash() =>
@ProviderFor(ActiveResearchVariant)
final activeResearchVariantProvider =
NotifierProvider<ActiveResearchVariant, ResearchVariant>.internal(
ActiveResearchVariant.new,
name: r'activeResearchVariantProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$activeResearchVariantHash,
dependencies: null,
allTransitiveDependencies: null,
);
ActiveResearchVariant.new,
name: r'activeResearchVariantProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$activeResearchVariantHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ActiveResearchVariant = Notifier<ResearchVariant>;
String _$activeChatModelHash() => r'675f406af8b4aa92699d59e37b5805a81d03a799';
@@ -948,14 +901,15 @@ String _$activeChatModelHash() => r'675f406af8b4aa92699d59e37b5805a81d03a799';
@ProviderFor(ActiveChatModel)
final activeChatModelProvider =
NotifierProvider<ActiveChatModel, ChatModel>.internal(
ActiveChatModel.new,
name: r'activeChatModelProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$activeChatModelHash,
dependencies: null,
allTransitiveDependencies: null,
);
ActiveChatModel.new,
name: r'activeChatModelProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$activeChatModelHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ActiveChatModel = Notifier<ChatModel>;
String _$showFindInPageHash() => r'7ee5703f7d0c7e8a8dd6b0849d7b1e0a41fe24d9';
@@ -965,9 +919,10 @@ String _$showFindInPageHash() => r'7ee5703f7d0c7e8a8dd6b0849d7b1e0a41fe24d9';
final showFindInPageProvider = NotifierProvider<ShowFindInPage, bool>.internal(
ShowFindInPage.new,
name: r'showFindInPageProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$showFindInPageHash,
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$showFindInPageHash,
dependencies: null,
allTransitiveDependencies: null,
);
@@ -13,18 +13,19 @@ part 'create_tab.g.dart';
final _parameterToCreateTabSheetTransformer =
StreamTransformer<ReceivedParameter, CreateTabSheet>.fromHandlers(
handleData: (parameter, sink) {
final createTab = CreateTabSheet(
preferredTool: KagiTool.values
.firstWhereOrNull((tool) => tool.name == parameter.tool),
content: parameter.content,
);
handleData: (parameter, sink) {
final createTab = CreateTabSheet(
preferredTool: KagiTool.values.firstWhereOrNull(
(tool) => tool.name == parameter.tool,
),
content: parameter.content,
);
if (createTab.hasParameters) {
sink.add(createTab);
}
},
);
if (createTab.hasParameters) {
sink.add(createTab);
}
},
);
@Riverpod()
class CreateTabStream extends _$CreateTabStream {
@@ -12,14 +12,15 @@ String _$createTabStreamHash() => r'2e802a10ecaf1862074f32b76e89c26997bdd7b2';
@ProviderFor(CreateTabStream)
final createTabStreamProvider =
AutoDisposeStreamNotifierProvider<CreateTabStream, CreateTabSheet>.internal(
CreateTabStream.new,
name: r'createTabStreamProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$createTabStreamHash,
dependencies: null,
allTransitiveDependencies: null,
);
CreateTabStream.new,
name: r'createTabStreamProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$createTabStreamHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$CreateTabStream = AutoDisposeStreamNotifier<CreateTabSheet>;
// ignore_for_file: type=lint
@@ -13,14 +13,15 @@ String _$deleteBrowserDataServiceHash() =>
@ProviderFor(DeleteBrowserDataService)
final deleteBrowserDataServiceProvider =
AutoDisposeNotifierProvider<DeleteBrowserDataService, void>.internal(
DeleteBrowserDataService.new,
name: r'deleteBrowserDataServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$deleteBrowserDataServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
DeleteBrowserDataService.new,
name: r'deleteBrowserDataServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$deleteBrowserDataServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$DeleteBrowserDataService = AutoDisposeNotifier<void>;
// ignore_for_file: type=lint
@@ -16,8 +16,9 @@ class EngineSettingsReplicationService
var initialSettingsSent = false;
ref.listen(
generalSettingsRepositoryProvider
.select((settings) => settings.themeMode),
generalSettingsRepositoryProvider.select(
(settings) => settings.themeMode,
),
(previous, next) async {
final theme = switch (next) {
ThemeMode.system => ColorScheme.system,
@@ -29,62 +30,63 @@ class EngineSettingsReplicationService
},
);
ref.listen(
engineSettingsRepositoryProvider,
(previous, next) async {
if (initialSettingsSent && previous != null) {
if (previous.javascriptEnabled != next.javascriptEnabled) {
await _service.javascriptEnabled(next.javascriptEnabled);
}
if (previous.trackingProtectionPolicy !=
next.trackingProtectionPolicy) {
await _service
.trackingProtectionPolicy(next.trackingProtectionPolicy);
}
if (previous.httpsOnlyMode != next.httpsOnlyMode) {
await _service.httpsOnlyMode(next.httpsOnlyMode);
}
if (previous.globalPrivacyControlEnabled !=
next.globalPrivacyControlEnabled) {
await _service
.globalPrivacyControlEnabled(next.globalPrivacyControlEnabled);
}
if (previous.preferredColorScheme != next.preferredColorScheme) {
await _service.preferredColorScheme(next.preferredColorScheme);
}
if (previous.cookieBannerHandlingMode !=
next.cookieBannerHandlingMode) {
await _service
.cookieBannerHandlingMode(next.cookieBannerHandlingMode);
}
if (previous.cookieBannerHandlingModePrivateBrowsing !=
next.cookieBannerHandlingModePrivateBrowsing) {
await _service.cookieBannerHandlingModePrivateBrowsing(
next.cookieBannerHandlingModePrivateBrowsing,
);
}
if (previous.cookieBannerHandlingGlobalRules !=
next.cookieBannerHandlingGlobalRules) {
await _service.cookieBannerHandlingGlobalRules(
next.cookieBannerHandlingGlobalRules,
);
}
if (previous.cookieBannerHandlingGlobalRulesSubFrames !=
next.cookieBannerHandlingGlobalRulesSubFrames) {
await _service.cookieBannerHandlingGlobalRulesSubFrames(
next.cookieBannerHandlingGlobalRulesSubFrames,
);
}
if (previous.webContentIsolationStrategy !=
next.webContentIsolationStrategy) {
await _service
.webContentIsolationStrategy(next.webContentIsolationStrategy);
}
} else {
await _service.setDefaultSettings(next);
initialSettingsSent = true;
ref.listen(engineSettingsRepositoryProvider, (previous, next) async {
if (initialSettingsSent && previous != null) {
if (previous.javascriptEnabled != next.javascriptEnabled) {
await _service.javascriptEnabled(next.javascriptEnabled);
}
},
);
if (previous.trackingProtectionPolicy !=
next.trackingProtectionPolicy) {
await _service.trackingProtectionPolicy(
next.trackingProtectionPolicy,
);
}
if (previous.httpsOnlyMode != next.httpsOnlyMode) {
await _service.httpsOnlyMode(next.httpsOnlyMode);
}
if (previous.globalPrivacyControlEnabled !=
next.globalPrivacyControlEnabled) {
await _service.globalPrivacyControlEnabled(
next.globalPrivacyControlEnabled,
);
}
if (previous.preferredColorScheme != next.preferredColorScheme) {
await _service.preferredColorScheme(next.preferredColorScheme);
}
if (previous.cookieBannerHandlingMode !=
next.cookieBannerHandlingMode) {
await _service.cookieBannerHandlingMode(
next.cookieBannerHandlingMode,
);
}
if (previous.cookieBannerHandlingModePrivateBrowsing !=
next.cookieBannerHandlingModePrivateBrowsing) {
await _service.cookieBannerHandlingModePrivateBrowsing(
next.cookieBannerHandlingModePrivateBrowsing,
);
}
if (previous.cookieBannerHandlingGlobalRules !=
next.cookieBannerHandlingGlobalRules) {
await _service.cookieBannerHandlingGlobalRules(
next.cookieBannerHandlingGlobalRules,
);
}
if (previous.cookieBannerHandlingGlobalRulesSubFrames !=
next.cookieBannerHandlingGlobalRulesSubFrames) {
await _service.cookieBannerHandlingGlobalRulesSubFrames(
next.cookieBannerHandlingGlobalRulesSubFrames,
);
}
if (previous.webContentIsolationStrategy !=
next.webContentIsolationStrategy) {
await _service.webContentIsolationStrategy(
next.webContentIsolationStrategy,
);
}
} else {
await _service.setDefaultSettings(next);
initialSettingsSent = true;
}
});
}
}
@@ -13,14 +13,15 @@ String _$engineSettingsReplicationServiceHash() =>
@ProviderFor(EngineSettingsReplicationService)
final engineSettingsReplicationServiceProvider =
NotifierProvider<EngineSettingsReplicationService, void>.internal(
EngineSettingsReplicationService.new,
name: r'engineSettingsReplicationServiceProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$engineSettingsReplicationServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
EngineSettingsReplicationService.new,
name: r'engineSettingsReplicationServiceProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$engineSettingsReplicationServiceHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$EngineSettingsReplicationService = Notifier<void>;
// ignore_for_file: type=lint
@@ -12,14 +12,14 @@ class ProxySettingsReplucation extends _$ProxySettingsReplucation {
@override
void build() {
ref.listen(
torProxyServiceProvider.select((data) => data.valueOrNull),
(previous, next) async {
if (next != null) {
await _service.setProxyPort(next);
}
},
);
ref.listen(torProxyServiceProvider.select((data) => data.valueOrNull), (
previous,
next,
) async {
if (next != null) {
await _service.setProxyPort(next);
}
});
ref.listen(
containersWithCountProvider.select(
@@ -13,14 +13,15 @@ String _$proxySettingsReplucationHash() =>
@ProviderFor(ProxySettingsReplucation)
final proxySettingsReplucationProvider =
NotifierProvider<ProxySettingsReplucation, void>.internal(
ProxySettingsReplucation.new,
name: r'proxySettingsReplucationProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$proxySettingsReplucationHash,
dependencies: null,
allTransitiveDependencies: null,
);
ProxySettingsReplucation.new,
name: r'proxySettingsReplucationProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$proxySettingsReplucationHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$ProxySettingsReplucation = Notifier<void>;
// ignore_for_file: type=lint
@@ -36,11 +36,7 @@ class WebPageDialog extends HookConsumerWidget {
final Uri url;
final WebPageInfo? precachedInfo;
const WebPageDialog({
required this.url,
this.precachedInfo,
super.key,
});
const WebPageDialog({required this.url, this.precachedInfo, super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
@@ -63,8 +59,10 @@ class WebPageDialog extends HookConsumerWidget {
context: context,
removeBottom: true,
child: Dialog(
insetPadding:
const EdgeInsets.symmetric(horizontal: 16.0, vertical: 64.0),
insetPadding: const EdgeInsets.symmetric(
horizontal: 16.0,
vertical: 64.0,
),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -79,26 +77,24 @@ class WebPageDialog extends HookConsumerWidget {
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: HookConsumer(
builder: (context, ref, child) {
final addressTextController =
useTextEditingController(text: url.toString());
final addressTextController = useTextEditingController(
text: url.toString(),
);
final addressTextFocusNode = useFocusNode();
final suggestion = useState<String?>(null);
useListenableCallback(
addressTextController,
() async {
if (addressTextController.text.isNotEmpty) {
final result = await ref
.read(engineSuggestionsProvider.notifier)
.getAutocompleteSuggestion(
addressTextController.text,
);
useListenableCallback(addressTextController, () async {
if (addressTextController.text.isNotEmpty) {
final result = await ref
.read(engineSuggestionsProvider.notifier)
.getAutocompleteSuggestion(
addressTextController.text,
);
suggestion.value = result;
}
},
);
suggestion.value = result;
}
});
return AutoSuggestTextField(
controller: addressTextController,
@@ -121,12 +117,15 @@ class WebPageDialog extends HookConsumerWidget {
},
onSubmitted: (value) async {
if (value.isNotEmpty) {
var newUrl =
uri_parser.tryParseUrl(value, eagerParsing: true);
var newUrl = uri_parser.tryParseUrl(
value,
eagerParsing: true,
);
if (newUrl == null) {
final defaultSearchBang = await ref
.read(defaultSearchBangDataProvider.future);
final defaultSearchBang = await ref.read(
defaultSearchBangDataProvider.future,
);
newUrl = defaultSearchBang?.getUrl(value);
}
@@ -147,9 +146,7 @@ class WebPageDialog extends HookConsumerWidget {
),
),
),
const SizedBox(
height: 4,
),
const SizedBox(height: 4),
const Divider(),
Flexible(
child: FadingScroll(
@@ -173,21 +170,23 @@ class WebPageDialog extends HookConsumerWidget {
availableBangs: availableBangs,
);
},
error: (error, stackTrace) => FailureWidget(
title: 'Could not load bangs',
exception: error,
),
loading: () => SiteSearch(
domain: url.host,
availableBangs: [
BangData(
websiteName: 'websiteName',
domain: 'domain',
trigger: 'trigger',
urlTemplate: 'urlTemplate',
error:
(error, stackTrace) => FailureWidget(
title: 'Could not load bangs',
exception: error,
),
loading:
() => SiteSearch(
domain: url.host,
availableBangs: [
BangData(
websiteName: 'websiteName',
domain: 'domain',
trigger: 'trigger',
urlTemplate: 'urlTemplate',
),
],
),
],
),
),
),
if (availableBangsAsync.isLoading ||
@@ -241,31 +240,30 @@ class WebPageDialog extends HookConsumerWidget {
leading: const Icon(Icons.mobile_screen_share),
title: const Text('Share screenshot'),
onTap: () async {
final screenshot = await ref
.read(selectedTabSessionNotifierProvider)
.requestScreenshot();
final screenshot =
await ref
.read(selectedTabSessionNotifierProvider)
.requestScreenshot();
if (screenshot != null) {
ui.decodeImageFromList(
screenshot,
(result) async {
final png = await result.toByteData(
format: ui.ImageByteFormat.png,
ui.decodeImageFromList(screenshot, (
result,
) async {
final png = await result.toByteData(
format: ui.ImageByteFormat.png,
);
if (png != null) {
final file = XFile.fromData(
png.buffer.asUint8List(),
mimeType: 'image/png',
);
if (png != null) {
final file = XFile.fromData(
png.buffer.asUint8List(),
mimeType: 'image/png',
);
await Share.shareXFiles(
[file],
subject: precachedInfo?.title,
);
}
},
);
await Share.shareXFiles([
file,
], subject: precachedInfo?.title);
}
});
}
if (context.mounted) {
@@ -53,8 +53,9 @@ class BrowserScreen extends HookConsumerWidget {
final displayedSheet = ref.watch(bottomSheetControllerProvider);
final displayedOverlayDialog = ref.watch(overlayDialogControllerProvider);
final selectedTabId =
ref.watch(selectedTabStateProvider.select((value) => value?.id));
final selectedTabId = ref.watch(
selectedTabStateProvider.select((value) => value?.id),
);
final trippleDotMenuController = useMenuController();
final tabMenuController = useMenuController();
@@ -65,16 +66,13 @@ class BrowserScreen extends HookConsumerWidget {
final activeKagiTool = useValueNotifier<KagiTool?>(null, [displayedSheet]);
ref.listen(
overlayDialogControllerProvider,
(previous, next) {
if (next != null) {
overlayController.show();
} else {
overlayController.hide();
}
},
);
ref.listen(overlayDialogControllerProvider, (previous, next) {
if (next != null) {
overlayController.show();
} else {
overlayController.hide();
}
});
// ref.listen(
// generalSettingsRepositoryProvider
@@ -96,8 +94,9 @@ class BrowserScreen extends HookConsumerWidget {
bottomNavigationBar: Consumer(
builder: (context, ref, child) {
final tabInFullScreen = ref.watch(
selectedTabStateProvider
.select((value) => value?.isFullScreen ?? false),
selectedTabStateProvider.select(
(value) => value?.isFullScreen ?? false,
),
);
return Visibility(
@@ -108,15 +107,17 @@ class BrowserScreen extends HookConsumerWidget {
child: AppBar(
automaticallyImplyLeading: false,
titleSpacing: 8.0,
title: (selectedTabId != null &&
displayedSheet is! ViewTabsSheet)
? Consumer(
builder: (context, ref, child) {
final tabState =
ref.watch(tabStateProvider(selectedTabId));
title:
(selectedTabId != null &&
displayedSheet is! ViewTabsSheet)
? Consumer(
builder: (context, ref, child) {
final tabState = ref.watch(
tabStateProvider(selectedTabId),
);
return (tabState != null)
? AppBarTitle(
return (tabState != null)
? AppBarTitle(
tab: tabState,
onTap: () async {
await context.push(
@@ -129,93 +130,95 @@ class BrowserScreen extends HookConsumerWidget {
onDoubleTap: () async {
final newUrl = await showDialog<Uri?>(
context: context,
builder: (context) => EditUrlDialog(
initialUrl: tabState.url,
),
builder:
(context) => EditUrlDialog(
initialUrl: tabState.url,
),
);
if (newUrl != null) {
await ref
.read(
tabSessionProvider(tabId: null)
.notifier,
tabSessionProvider(
tabId: null,
).notifier,
)
.loadUrl(url: newUrl);
}
},
)
: const SizedBox.shrink();
},
)
: HookBuilder(
builder: (context) {
// final activeTool = useListenableSelector(
// activeKagiTool,
// () {
// if (displayedSheet is CreateTabSheetWidget) {
// return null;
// }
: const SizedBox.shrink();
},
)
: HookBuilder(
builder: (context) {
// final activeTool = useListenableSelector(
// activeKagiTool,
// () {
// if (displayedSheet is CreateTabSheetWidget) {
// return null;
// }
// return activeKagiTool.value;
// },
// );
// return activeKagiTool.value;
// },
// );
return Row(
children: [
// IconButton(
// color: (activeTool == KagiTool.search)
// ? Theme.of(context).colorScheme.primary
// : null,
// onPressed: () async {
// // ref
// // .read(createTabStreamProvider.notifier)
// // .createTab(
// // CreateTabSheet(
// // preferredTool: KagiTool.search,
// // ),
// // );
// await context
// .push(const SearchRoute().location);
// },
// icon: Icon(KagiTool.search.icon),
// ),
// IconButton(
// color: (activeTool == KagiTool.summarizer)
// ? Theme.of(context).colorScheme.primary
// : null,
// onPressed: () {
// ref
// .read(createTabStreamProvider.notifier)
// .createTab(
// CreateTabSheet(
// preferredTool: KagiTool.summarizer,
// ),
// );
// },
// icon: Icon(KagiTool.summarizer.icon),
// ),
// if (showEarlyAccessFeatures)
// IconButton(
// color: (activeTool == KagiTool.assistant)
// ? Theme.of(context).colorScheme.primary
// : null,
// onPressed: () {
// ref
// .read(
// createTabStreamProvider.notifier,
// )
// .createTab(
// CreateTabSheet(
// preferredTool: KagiTool.assistant,
// ),
// );
// },
// icon: Icon(KagiTool.assistant.icon),
// ),
],
);
},
),
return Row(
children: [
// IconButton(
// color: (activeTool == KagiTool.search)
// ? Theme.of(context).colorScheme.primary
// : null,
// onPressed: () async {
// // ref
// // .read(createTabStreamProvider.notifier)
// // .createTab(
// // CreateTabSheet(
// // preferredTool: KagiTool.search,
// // ),
// // );
// await context
// .push(const SearchRoute().location);
// },
// icon: Icon(KagiTool.search.icon),
// ),
// IconButton(
// color: (activeTool == KagiTool.summarizer)
// ? Theme.of(context).colorScheme.primary
// : null,
// onPressed: () {
// ref
// .read(createTabStreamProvider.notifier)
// .createTab(
// CreateTabSheet(
// preferredTool: KagiTool.summarizer,
// ),
// );
// },
// icon: Icon(KagiTool.summarizer.icon),
// ),
// if (showEarlyAccessFeatures)
// IconButton(
// color: (activeTool == KagiTool.assistant)
// ? Theme.of(context).colorScheme.primary
// : null,
// onPressed: () {
// ref
// .read(
// createTabStreamProvider.notifier,
// )
// .createTab(
// CreateTabSheet(
// preferredTool: KagiTool.assistant,
// ),
// );
// },
// icon: Icon(KagiTool.assistant.icon),
// ),
],
);
},
),
actions: [
if (selectedTabId != null &&
displayedSheet is! ViewTabsSheet)
@@ -278,9 +281,7 @@ class BrowserScreen extends HookConsumerWidget {
MenuItemButton(
onPressed: () async {
await ref
.read(
tabRepositoryProvider.notifier,
)
.read(tabRepositoryProvider.notifier)
.closeTab(selectedTabId);
},
leadingIcon: const Icon(Icons.close),
@@ -488,8 +489,9 @@ class BrowserScreen extends HookConsumerWidget {
if (selectedTabId != null)
MenuItemButton(
onPressed: () async {
final tabState =
ref.read(tabStateProvider(selectedTabId));
final tabState = ref.read(
tabStateProvider(selectedTabId),
);
if (tabState?.url case final Uri url) {
await ui_helper.launchUrlFeedback(context, url);
@@ -501,8 +503,9 @@ class BrowserScreen extends HookConsumerWidget {
if (selectedTabId != null)
MenuItemButton(
onPressed: () async {
final tabState =
ref.read(tabStateProvider(selectedTabId));
final tabState = ref.read(
tabStateProvider(selectedTabId),
);
if (tabState?.url case final Uri url) {
await Share.shareUri(url);
@@ -530,8 +533,9 @@ class BrowserScreen extends HookConsumerWidget {
MenuItemButton(
onPressed: () async {
final controller = ref.read(
tabSessionProvider(tabId: selectedTabId)
.notifier,
tabSessionProvider(
tabId: selectedTabId,
).notifier,
);
await controller.reload();
@@ -545,39 +549,45 @@ class BrowserScreen extends HookConsumerWidget {
Consumer(
builder: (context, ref, child) {
final history = ref.watch(
tabStateProvider(selectedTabId)
.select((value) => value?.historyState),
tabStateProvider(
selectedTabId,
).select((value) => value?.historyState),
);
return Row(
children: [
Expanded(
child: (history?.canGoBack == true)
? IconButton(
onPressed: () async {
final controller = ref.read(
tabSessionProvider(
tabId: selectedTabId,
).notifier,
);
child:
(history?.canGoBack == true)
? IconButton(
onPressed: () async {
final controller = ref.read(
tabSessionProvider(
tabId: selectedTabId,
).notifier,
);
await controller.goBack();
trippleDotMenuController.close();
},
icon: const Icon(Icons.arrow_back),
)
: IconButton(
onPressed: () async {
await ref
.read(
tabRepositoryProvider
.notifier,
)
.closeTab(selectedTabId);
trippleDotMenuController.close();
},
icon: const Icon(Icons.close),
),
await controller.goBack();
trippleDotMenuController
.close();
},
icon: const Icon(
Icons.arrow_back,
),
)
: IconButton(
onPressed: () async {
await ref
.read(
tabRepositoryProvider
.notifier,
)
.closeTab(selectedTabId);
trippleDotMenuController
.close();
},
icon: const Icon(Icons.close),
),
),
const SizedBox(
height: 48,
@@ -585,18 +595,20 @@ class BrowserScreen extends HookConsumerWidget {
),
Expanded(
child: IconButton(
onPressed: (history?.canGoForward == true)
? () async {
final controller = ref.read(
tabSessionProvider(
tabId: selectedTabId,
).notifier,
);
onPressed:
(history?.canGoForward == true)
? () async {
final controller = ref.read(
tabSessionProvider(
tabId: selectedTabId,
).notifier,
);
await controller.goForward();
trippleDotMenuController.close();
}
: null,
await controller.goForward();
trippleDotMenuController
.close();
}
: null,
icon: const Icon(Icons.arrow_forward),
),
),
@@ -640,20 +652,22 @@ class BrowserScreen extends HookConsumerWidget {
return displayedOverlayDialog!;
},
child: Listener(
onPointerDown: (displayedSheet != null)
? (_) {
ref
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}
: null,
onPointerDown:
(displayedSheet != null)
? (_) {
ref
.read(bottomSheetControllerProvider.notifier)
.dismiss();
}
: null,
child: HookConsumer(
builder: (context, ref, child) {
return BackButtonListener(
onBackButtonPressed: () async {
final tabState = (selectedTabId != null)
? ref.read(tabStateProvider(selectedTabId))
: null;
final tabState =
(selectedTabId != null)
? ref.read(tabStateProvider(selectedTabId))
: null;
final tabCount = ref.read(
tabListProvider.select((tabs) => tabs.length),
@@ -698,8 +712,9 @@ class BrowserScreen extends HookConsumerWidget {
}
if (lastBackButtonPress.value != null &&
DateTime.now()
.difference(lastBackButtonPress.value!) <
DateTime.now().difference(
lastBackButtonPress.value!,
) <
const Duration(seconds: 2)) {
lastBackButtonPress.value = null;
@@ -718,13 +733,14 @@ class BrowserScreen extends HookConsumerWidget {
..clearSnackBars()
..showSnackBar(
SnackBar(
content: (tabCount > 1)
? const Text(
'Please click BACK again to close current tab',
)
: const Text(
'Please click BACK again to exit app',
),
content:
(tabCount > 1)
? const Text(
'Please click BACK again to close current tab',
)
: const Text(
'Please click BACK again to exit app',
),
),
);
@@ -744,16 +760,16 @@ class BrowserScreen extends HookConsumerWidget {
child: Consumer(
builder: (context, ref, child) {
final value = ref.watch(
selectedTabStateProvider.select(
(state) {
if (state?.isLoading == true) {
return state?.progress ?? 100;
}
selectedTabStateProvider.select((
state,
) {
if (state?.isLoading == true) {
return state?.progress ?? 100;
}
//When not loading we assumed finished
return 100;
},
),
//When not loading we assumed finished
return 100;
}),
);
return Visibility(
@@ -774,11 +790,13 @@ class BrowserScreen extends HookConsumerWidget {
final value = ref.watch(
selectedTabStateProvider.select(
(state) => EdgeInsets.only(
bottom: (state?.isLoading == true &&
state?.progress != null &&
state!.progress < 100)
? 4.0
: 0.0,
bottom:
(state?.isLoading == true &&
state?.progress !=
null &&
state!.progress < 100)
? 4.0
: 0.0,
),
),
);
@@ -794,7 +812,7 @@ class BrowserScreen extends HookConsumerWidget {
ModalBarrier(
color:
Theme.of(context).dialogTheme.barrierColor ??
Colors.black54,
Colors.black54,
),
],
),
@@ -806,22 +824,25 @@ class BrowserScreen extends HookConsumerWidget {
},
),
floatingActionButton: ReaderAppearanceButton(),
bottomSheet: (displayedSheet != null)
? NotificationListener<DraggableScrollableNotification>(
onNotification: (notification) {
if (notification.extent <= 0.1) {
ref.read(bottomSheetControllerProvider.notifier).dismiss();
return true;
} else {
ref
.read(bottomSheetExtendProvider.notifier)
.add(notification.extent);
}
bottomSheet:
(displayedSheet != null)
? NotificationListener<DraggableScrollableNotification>(
onNotification: (notification) {
if (notification.extent <= 0.1) {
ref
.read(bottomSheetControllerProvider.notifier)
.dismiss();
return true;
} else {
ref
.read(bottomSheetExtendProvider.notifier)
.add(notification.extent);
}
return false;
},
child: switch (displayedSheet) {
ViewTabsSheet() => HookBuilder(
return false;
},
child: switch (displayedSheet) {
ViewTabsSheet() => HookBuilder(
builder: (localContext) {
final draggableScrollableController =
useDraggableScrollableController();
@@ -855,7 +876,7 @@ class BrowserScreen extends HookConsumerWidget {
);
},
),
final CreateTabSheet parameter => DraggableScrollableSheet(
final CreateTabSheet parameter => DraggableScrollableSheet(
key: ValueKey(displayedSheet),
expand: false,
initialChildSize: 0.8,
@@ -883,7 +904,7 @@ class BrowserScreen extends HookConsumerWidget {
);
},
),
final TabQaChatSheet parameter => HookBuilder(
final TabQaChatSheet parameter => HookBuilder(
builder: (localContext) {
final draggableScrollableController =
useDraggableScrollableController();
@@ -937,9 +958,9 @@ class BrowserScreen extends HookConsumerWidget {
);
},
),
},
)
: null,
},
)
: null,
),
);
}
@@ -31,15 +31,9 @@ class AppBarTitle extends StatelessWidget {
size: 14,
);
} else if (!tab.isLoading) {
return const Icon(
MdiIcons.lock,
size: 14,
);
return const Icon(MdiIcons.lock, size: 14);
} else {
return const Icon(
MdiIcons.timerSand,
size: 14,
);
return const Icon(MdiIcons.timerSand, size: 14);
}
}
@@ -54,19 +48,11 @@ class AppBarTitle extends StatelessWidget {
Skeletonizer(
enabled: tab.icon == null,
child: Skeleton.replace(
replacement: const Bone.icon(
size: 16,
),
child: RawImage(
image: tab.icon?.value,
height: 16,
width: 16,
),
replacement: const Bone.icon(size: 16),
child: RawImage(image: tab.icon?.value, height: 16, width: 16),
),
),
const SizedBox(
width: 8,
),
const SizedBox(width: 8),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
@@ -82,8 +68,9 @@ class AppBarTitle extends StatelessWidget {
child: TextScroll(
key: ValueKey(tab.title),
tab.title,
style: theme.textTheme.bodyLarge
?.copyWith(color: theme.colorScheme.onSurface),
style: theme.textTheme.bodyLarge?.copyWith(
color: theme.colorScheme.onSurface,
),
// mode: TextScrollMode.bouncing,
velocity: const Velocity(pixelsPerSecond: Offset(75, 0)),
delayBefore: const Duration(milliseconds: 500),
@@ -99,14 +86,13 @@ class AppBarTitle extends StatelessWidget {
Row(
children: [
_securityStatusIcon(context),
const SizedBox(
width: 4,
),
const SizedBox(width: 4),
Expanded(
child: Text(
tab.url.authority,
style: theme.textTheme.bodyMedium
?.copyWith(color: theme.colorScheme.onSurface),
style: theme.textTheme.bodyMedium?.copyWith(
color: theme.colorScheme.onSurface,
),
),
),
],
@@ -42,17 +42,18 @@ class _BrowserViewState extends ConsumerState<BrowserView>
.read(selectedTabSessionNotifierProvider)
.requestScreenshot(requireImageResult: false)
.onError((error, stackTrace) {
logger.e(error, stackTrace: stackTrace);
timer.cancel();
logger.e(error, stackTrace: stackTrace);
timer.cancel();
return null;
});
return null;
});
}
@override
Widget build(BuildContext context) {
final hasTab =
ref.watch(selectedTabProvider.select((value) => value != null));
final hasTab = ref.watch(
selectedTabProvider.select((value) => value != null),
);
ref.listen(
selectedTabStateProvider.select(
@@ -68,43 +69,41 @@ class _BrowserViewState extends ConsumerState<BrowserView>
if (next.isLoading == false &&
(_periodicScreenshotUpdate?.isActive ?? false) == false) {
_timerPaused = false;
_periodicScreenshotUpdate =
Timer.periodic(widget.screenshotPeriod, _timerTick);
_periodicScreenshotUpdate = Timer.periodic(
widget.screenshotPeriod,
_timerTick,
);
}
},
);
return Visibility(
visible: hasTab,
replacement: SizedBox.expand(
child: Container(
color: Colors.grey[800],
),
),
replacement: SizedBox.expand(child: Container(color: Colors.grey[800])),
child: GeckoView(
preInitializationStep: () async {
await ref
.read(generalSettingsRepositoryProvider.notifier)
.fetch()
.then((settings) {
ref
.read(deleteBrowserDataServiceProvider.notifier)
.deleteData(settings.deleteBrowsingDataOnQuit);
});
ref
.read(deleteBrowserDataServiceProvider.notifier)
.deleteData(settings.deleteBrowsingDataOnQuit);
});
await ref
.read(eventServiceProvider)
.viewReadyStateEvents
.firstWhere((state) => state == true)
.timeout(
const Duration(seconds: 3),
onTimeout: () {
logger.e(
'Browser fragement not reported ready, trying to intitialize anyways',
const Duration(seconds: 3),
onTimeout: () {
logger.e(
'Browser fragement not reported ready, trying to intitialize anyways',
);
return true;
},
);
return true;
},
);
},
postInitializationStep: () async {
await widget.postInitializationStep?.call();
@@ -123,10 +122,7 @@ class _BrowserViewState extends ConsumerState<BrowserView>
ref.listenManual(tabRepositoryProvider, (previous, next) {});
ref.listenManual(documentRepositoryProvider, (previous, next) {});
ref.listenManual(
selectionActionServiceProvider,
(previous, next) {},
);
ref.listenManual(selectionActionServiceProvider, (previous, next) {});
ref.listenManual(
webExtensionsStateProvider(WebExtensionActionType.browser),
@@ -138,20 +134,14 @@ class _BrowserViewState extends ConsumerState<BrowserView>
(previous, next) {},
);
ref.listenManual(
cacheRepositoryProvider,
(previous, next) {},
);
ref.listenManual(cacheRepositoryProvider, (previous, next) {});
ref.listenManual(
engineSettingsReplicationServiceProvider,
(previous, next) {},
);
ref.listenManual(
proxySettingsReplucationProvider,
(previous, next) {},
);
ref.listenManual(proxySettingsReplucationProvider, (previous, next) {});
}
@override
@@ -173,8 +163,10 @@ class _BrowserViewState extends ConsumerState<BrowserView>
.evictCacheOnBackground();
case AppLifecycleState.resumed:
if (_timerPaused) {
_periodicScreenshotUpdate =
Timer.periodic(widget.screenshotPeriod, _timerTick);
_periodicScreenshotUpdate = Timer.periodic(
widget.screenshotPeriod,
_timerTick,
);
_timerPaused = false;
}
}
@@ -18,12 +18,7 @@ class DraggableScrollableHeader extends StatelessWidget {
onVerticalDragUpdate: (details) {
// Use the DraggableScrollableSheet's controller
controller.jumpTo(
min(
1,
controller.pixelsToSize(
controller.pixels - details.delta.dy,
),
),
min(1, controller.pixelsToSize(controller.pixels - details.delta.dy)),
);
},
child: child,
@@ -20,9 +20,7 @@ class EditUrlDialog extends HookWidget {
controller: urlController,
maxLines: null,
keyboardType: TextInputType.url,
decoration: const InputDecoration(
hintText: 'Enter URL',
),
decoration: const InputDecoration(hintText: 'Enter URL'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter a URL';
@@ -25,9 +25,7 @@ class ErrorContainer extends StatelessWidget {
color: theme.colorScheme.onErrorContainer,
),
),
Expanded(
child: content,
),
Expanded(child: content),
],
),
);
@@ -15,11 +15,7 @@ class ExtensionBadgeIcon extends StatelessWidget {
label: hasBadge ? Text(state.badgeText!) : null,
textColor: state.badgeTextColor,
backgroundColor: state.badgeBackgroundColor,
child: RawImage(
image: state.icon?.value,
width: 24,
height: 24,
),
child: RawImage(image: state.icon?.value, width: 24, height: 24),
);
}
}
@@ -28,7 +28,8 @@ class LandingAction extends HookConsumerWidget {
await context.push(SettingsRoute().location);
}
},
data: '## No Kagi Session Provided\n'
data:
'## No Kagi Session Provided\n'
'Please navigate to [Settings](settings) and enter your Kagi Session Token.\n'
"You must provide a valid session in order to use Kagi's features.",
),
@@ -33,8 +33,9 @@ class LandingContent extends HookConsumerWidget {
children: [
Text(
'Lensai',
style:
textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold),
style: textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
Padding(
@@ -52,16 +53,17 @@ class LandingContent extends HookConsumerWidget {
const LandingAction(),
Consumer(
builder: (context, ref, child) {
final errors = ref
.watch(
appInitializationServiceProvider.select(
(result) => EquatableCollection(
result.valueOrNull?.errors,
immutable: false,
),
),
)
.collection;
final errors =
ref
.watch(
appInitializationServiceProvider.select(
(result) => EquatableCollection(
result.valueOrNull?.errors,
immutable: false,
),
),
)
.collection;
if (errors == null || errors.isEmpty) {
return const SizedBox.shrink();
@@ -70,35 +72,31 @@ class LandingContent extends HookConsumerWidget {
return Column(
mainAxisSize: MainAxisSize.min,
children: [
...errors.map(
(error) {
final theme = Theme.of(context);
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: ErrorContainer(
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Error during App Initialization!',
style: theme.textTheme.titleMedium,
),
Text(
error.message,
style: theme.textTheme.titleSmall,
),
if (error.details != null)
Text(error.details.toString()),
],
),
...errors.map((error) {
final theme = Theme.of(context);
return Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: ErrorContainer(
content: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Error during App Initialization!',
style: theme.textTheme.titleMedium,
),
Text(
error.message,
style: theme.textTheme.titleSmall,
),
if (error.details != null)
Text(error.details.toString()),
],
),
);
},
),
const SizedBox(
height: 8,
),
),
);
}),
const SizedBox(height: 8),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 16.0),
child: SizedBox(
@@ -138,14 +136,12 @@ class LandingContent extends HookConsumerWidget {
),
Text(
'Changelog',
style:
textTheme.titleLarge?.copyWith(fontWeight: FontWeight.bold),
style: textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
),
textAlign: TextAlign.center,
),
MarkdownBody(
data: changelogAsset.data ?? '',
selectable: true,
),
MarkdownBody(data: changelogAsset.data ?? '', selectable: true),
],
),
);
@@ -25,8 +25,9 @@ class CreateTabSheetWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final sharedContent = useMemoized(
() => parameter.content
.mapNotNull((content) => SharedContent.parse(content)),
() => parameter.content.mapNotNull(
(content) => SharedContent.parse(content),
),
[parameter],
);
@@ -34,13 +35,12 @@ class CreateTabSheetWidget extends HookConsumerWidget {
() =>
parameter.preferredTool?.index ??
switch (sharedContent) {
SharedText(text: final _) => KagiTool.search.index
SharedText(text: final _) => KagiTool.search.index,
// (showEarlyAccessFeatures && text.length > 25)
// ? KagiTool.assistant.index
// : KagiTool.search.index,
,
SharedUrl() => KagiTool.summarizer.index,
null => KagiTool.search.index
null => KagiTool.search.index,
// showEarlyAccessFeatures
// ? KagiTool.assistant.index
// : KagiTool.search.index,
@@ -62,15 +62,12 @@ class CreateTabSheetWidget extends HookConsumerWidget {
},
);
useEffect(
() {
WidgetsBinding.instance.addPostFrameCallback((_) {
onActiveToolChanged?.call(KagiTool.values[initialIndex]);
});
return null;
},
[initialIndex],
);
useEffect(() {
WidgetsBinding.instance.addPostFrameCallback((_) {
onActiveToolChanged?.call(KagiTool.values[initialIndex]);
});
return null;
}, [initialIndex]);
return Column(
mainAxisSize: MainAxisSize.min,
@@ -82,10 +79,7 @@ class CreateTabSheetWidget extends HookConsumerWidget {
// icon: Icon(KagiTool.search.icon),
// text: 'Search',
// ),
Tab(
icon: Icon(KagiTool.summarizer.icon),
text: 'Summarize',
),
Tab(icon: Icon(KagiTool.summarizer.icon), text: 'Summarize'),
// if (showEarlyAccessFeatures)
// Tab(
// icon: Icon(KagiTool.assistant.icon),
@@ -102,10 +96,7 @@ class CreateTabSheetWidget extends HookConsumerWidget {
// sharedContent: sharedContent,
// onSubmit: onSubmit,
// ),
SummarizeTab(
sharedContent: sharedContent,
onSubmit: onSubmit,
),
SummarizeTab(sharedContent: sharedContent, onSubmit: onSubmit),
// if (showEarlyAccessFeatures)
// AssistantTab(
// sharedContent: sharedContent,
@@ -91,26 +91,19 @@ class _Tab extends HookConsumerWidget {
() => searchTextController.text.isNotEmpty,
);
useListenableCallback(
searchTextController,
() async {
await ref
.read(
tabSearchRepositoryProvider(TabSearchPartition.preview).notifier,
)
.addQuery(searchTextController.text);
},
);
useListenableCallback(searchTextController, () async {
await ref
.read(
tabSearchRepositoryProvider(TabSearchPartition.preview).notifier,
)
.addQuery(searchTextController.text);
});
return Material(
//Fix layout issue https://github.com/flutter/flutter/issues/78748#issuecomment-1194680555
child: Align(
child: Padding(
padding: const EdgeInsets.only(
right: 8.0,
left: 8.0,
top: 8.0,
),
padding: const EdgeInsets.only(right: 8.0, left: 8.0, top: 8.0),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -175,8 +168,9 @@ class _Tab extends HookConsumerWidget {
child: Consumer(
builder: (context, ref, child) {
final selectedContainer = ref.watch(
selectedContainerDataProvider
.select((value) => value.valueOrNull),
selectedContainerDataProvider.select(
(value) => value.valueOrNull,
),
);
return ContainerChips(
@@ -280,89 +274,79 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
[MediaQuery.of(context).size.width],
);
useEffect(
() {
final index = filteredTabIds.collection
.indexWhere((webView) => webView == activeTab);
useEffect(() {
final index = filteredTabIds.collection.indexWhere(
(webView) => webView == activeTab,
);
if (index > -1) {
final offset = (index ~/ 2) * itemHeight;
if (index > -1) {
final offset = (index ~/ 2) * itemHeight;
if (offset != sheetScrollController.offset) {
unawaited(
sheetScrollController.animateTo(
offset,
duration: const Duration(milliseconds: 200),
curve: Curves.easeInOut,
),
);
}
if (offset != sheetScrollController.offset) {
unawaited(
sheetScrollController.animateTo(
offset,
duration: const Duration(milliseconds: 200),
curve: Curves.easeInOut,
),
);
}
}
return null;
},
[filteredTabIds, activeTab],
);
return null;
}, [filteredTabIds, activeTab]);
final tabs = useMemoized(
() {
return filteredTabIds.collection
.mapIndexed(
(index, tabId) => CustomDraggable(
key: Key(tabId),
data: TabDragData(tabId),
child: Consumer(
child: _TabDraggable(
tabId: tabId,
activeTabId: activeTab,
onClose: onClose,
),
builder: (context, ref, child) {
final dragData = ref.watch(
willAcceptDropProvider.select((value) {
final dragTabId = switch (value) {
ContainerDropData() => value.tabId,
DeleteDropData() => value.tabId,
null => null,
};
return (dragTabId == tabId)
? value
: null;
}),
);
return switch (dragData) {
ContainerDropData() => Opacity(
opacity: 0.3,
child: Transform.scale(
scale: 0.9,
child: child,
),
),
DeleteDropData() => Opacity(
opacity: 0.3,
child: ColorFiltered(
colorFilter: const ColorFilter.mode(
Colors.red,
BlendMode.modulate,
),
child: child,
),
),
null => child!,
};
},
final tabs = useMemoized(() {
return filteredTabIds.collection
.mapIndexed(
(index, tabId) => CustomDraggable(
key: Key(tabId),
data: TabDragData(tabId),
child: Consumer(
child: _TabDraggable(
tabId: tabId,
activeTabId: activeTab,
onClose: onClose,
),
builder: (context, ref, child) {
final dragData = ref.watch(
willAcceptDropProvider.select((value) {
final dragTabId = switch (value) {
ContainerDropData() => value.tabId,
DeleteDropData() => value.tabId,
null => null,
};
return (dragTabId == tabId) ? value : null;
}),
);
return switch (dragData) {
ContainerDropData() => Opacity(
opacity: 0.3,
child: Transform.scale(
scale: 0.9,
child: child,
),
),
DeleteDropData() => Opacity(
opacity: 0.3,
child: ColorFiltered(
colorFilter: const ColorFilter.mode(
Colors.red,
BlendMode.modulate,
),
child: child,
),
),
null => child!,
};
},
),
)
.toList();
},
[
filteredTabIds,
activeTab,
],
);
),
)
.toList();
}, [filteredTabIds, activeTab]);
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 4.0),
@@ -381,8 +365,9 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
final oldIndex = positions.first.oldIndex;
final newIndex = positions.first.newIndex;
final containerRepository =
ref.read(containerRepositoryProvider.notifier);
final containerRepository = ref.read(
containerRepositoryProvider.notifier,
);
final tabId = filteredTabIds.collection[oldIndex];
final containerId = await ref
@@ -391,12 +376,14 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
final String key;
if (newIndex <= 0) {
key = await containerRepository
.getLeadingOrderKey(containerId);
key = await containerRepository.getLeadingOrderKey(
containerId,
);
} else if (newIndex >=
filteredTabIds.collection.length - 1) {
key = await containerRepository
.getTrailingOrderKey(containerId);
key = await containerRepository.getTrailingOrderKey(
containerId,
);
} else {
final orderAfterIndex = newIndex;
key = await containerRepository.getOrderKeyAfterTab(
@@ -414,12 +401,12 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
controller: sheetScrollController,
gridDelegate:
const SliverGridDelegateWithFixedCrossAxisCount(
//Sync values for itemHeight calculation _calculateItemHeight
childAspectRatio: 0.75,
mainAxisSpacing: 8.0,
crossAxisSpacing: 8.0,
crossAxisCount: 2,
),
//Sync values for itemHeight calculation _calculateItemHeight
childAspectRatio: 0.75,
mainAxisSpacing: 8.0,
crossAxisSpacing: 8.0,
crossAxisCount: 2,
),
itemCount: children.length,
itemBuilder: (context, index) => children[index],
);
@@ -432,10 +419,7 @@ class ViewTabsSheetWidget extends HookConsumerWidget {
],
),
Padding(
padding: const EdgeInsets.only(
top: _Tab.headerSize + 4,
right: 4,
),
padding: const EdgeInsets.only(top: _Tab.headerSize + 4, right: 4),
child: FloatingActionButton.small(
onPressed: () async {
await context.push(const SearchRoute().location);
@@ -51,8 +51,10 @@ class TabPreview extends StatelessWidget {
),
),
IconButton(
visualDensity:
const VisualDensity(horizontal: -4.0, vertical: -4.0),
visualDensity: const VisualDensity(
horizontal: -4.0,
vertical: -4.0,
),
onPressed: onDelete,
icon: const Icon(Icons.close),
),
@@ -60,17 +62,9 @@ class TabPreview extends StatelessWidget {
),
Row(
children: [
const SizedBox(
width: 6.0,
),
RawImage(
image: tab.icon?.value,
height: 16,
width: 16,
),
const SizedBox(
width: 6.0,
),
const SizedBox(width: 6.0),
RawImage(image: tab.icon?.value, height: 16, width: 16),
const SizedBox(width: 6.0),
Expanded(
child: Text(
tab.url.authority,
@@ -79,9 +73,7 @@ class TabPreview extends StatelessWidget {
),
],
),
const SizedBox(
height: 6,
),
const SizedBox(height: 6),
if (tab.thumbnail != null)
Expanded(
child: ClipRRect(
@@ -24,17 +24,15 @@ class TabsActionButton extends HookConsumerWidget {
onTap: onTap,
onLongPress: onLongPress,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 8.0,
vertical: 15.0,
),
padding: const EdgeInsets.symmetric(horizontal: 8.0, vertical: 15.0),
child: Container(
decoration: BoxDecoration(
border: Border.all(
width: 2.0,
color: isActive
? theme.colorScheme.primary
: DefaultTextStyle.of(context).style.color!,
color:
isActive
? theme.colorScheme.primary
: DefaultTextStyle.of(context).style.color!,
),
borderRadius: BorderRadius.circular(5.0),
),
@@ -9,9 +9,10 @@ class FindInPageRepository extends _$FindInPageRepository {
@override
void build(String? tabId) {
_service = (tabId != null)
? GeckoFindInPageService(tabId: tabId)
: GeckoFindInPageService.forActiveTab();
_service =
(tabId != null)
? GeckoFindInPageService(tabId: tabId)
: GeckoFindInPageService.forActiveTab();
}
Future<void> findAll({required String text}) {
@@ -34,9 +34,7 @@ abstract class _$FindInPageRepository
extends BuildlessAutoDisposeNotifier<void> {
late final String? tabId;
void build(
String? tabId,
);
void build(String? tabId);
}
/// See also [FindInPageRepository].
@@ -49,21 +47,15 @@ class FindInPageRepositoryFamily extends Family<void> {
const FindInPageRepositoryFamily();
/// See also [FindInPageRepository].
FindInPageRepositoryProvider call(
String? tabId,
) {
return FindInPageRepositoryProvider(
tabId,
);
FindInPageRepositoryProvider call(String? tabId) {
return FindInPageRepositoryProvider(tabId);
}
@override
FindInPageRepositoryProvider getProviderOverride(
covariant FindInPageRepositoryProvider provider,
) {
return call(
provider.tabId,
);
return call(provider.tabId);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -85,21 +77,20 @@ class FindInPageRepositoryFamily extends Family<void> {
class FindInPageRepositoryProvider
extends AutoDisposeNotifierProviderImpl<FindInPageRepository, void> {
/// See also [FindInPageRepository].
FindInPageRepositoryProvider(
String? tabId,
) : this._internal(
() => FindInPageRepository()..tabId = tabId,
from: findInPageRepositoryProvider,
name: r'findInPageRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$findInPageRepositoryHash,
dependencies: FindInPageRepositoryFamily._dependencies,
allTransitiveDependencies:
FindInPageRepositoryFamily._allTransitiveDependencies,
tabId: tabId,
);
FindInPageRepositoryProvider(String? tabId)
: this._internal(
() => FindInPageRepository()..tabId = tabId,
from: findInPageRepositoryProvider,
name: r'findInPageRepositoryProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$findInPageRepositoryHash,
dependencies: FindInPageRepositoryFamily._dependencies,
allTransitiveDependencies:
FindInPageRepositoryFamily._allTransitiveDependencies,
tabId: tabId,
);
FindInPageRepositoryProvider._internal(
super._createNotifier, {
@@ -114,12 +105,8 @@ class FindInPageRepositoryProvider
final String? tabId;
@override
void runNotifierBuild(
covariant FindInPageRepository notifier,
) {
return notifier.build(
tabId,
);
void runNotifierBuild(covariant FindInPageRepository notifier) {
return notifier.build(tabId);
}
@override
@@ -140,7 +127,7 @@ class FindInPageRepositoryProvider
@override
AutoDisposeNotifierProviderElement<FindInPageRepository, void>
createElement() {
createElement() {
return _FindInPageRepositoryProviderElement(this);
}
@@ -173,5 +160,6 @@ class _FindInPageRepositoryProviderElement
@override
String? get tabId => (origin as FindInPageRepositoryProvider).tabId;
}
// 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
@@ -13,14 +13,15 @@ String _$findInPageVisibilityControllerHash() =>
@ProviderFor(FindInPageVisibilityController)
final findInPageVisibilityControllerProvider =
AutoDisposeNotifierProvider<FindInPageVisibilityController, bool>.internal(
FindInPageVisibilityController.new,
name: r'findInPageVisibilityControllerProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$findInPageVisibilityControllerHash,
dependencies: null,
allTransitiveDependencies: null,
);
FindInPageVisibilityController.new,
name: r'findInPageVisibilityControllerProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product')
? null
: _$findInPageVisibilityControllerHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$FindInPageVisibilityController = AutoDisposeNotifier<bool>;
// ignore_for_file: type=lint
@@ -13,8 +13,9 @@ class FindInPageWidget extends HookConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final showFindInPage = ref.watch(findInPageVisibilityControllerProvider);
final findInteractionController =
ref.watch(findInPageRepositoryProvider(null).notifier);
final findInteractionController = ref.watch(
findInPageRepositoryProvider(null).notifier,
);
final textController = useTextEditingController();
@@ -47,8 +48,9 @@ class FindInPageWidget extends HookConsumerWidget {
HookConsumer(
builder: (context, ref, child) {
final searchResult = ref.watch(
selectedTabStateProvider
.select((state) => state?.findResultState),
selectedTabStateProvider.select(
(state) => state?.findResultState,
),
);
if (searchResult != null) {

Some files were not shown because too many files have changed in this diff Show More