diff --git a/app/android/app/src/main/AndroidManifest.xml b/app/android/app/src/main/AndroidManifest.xml
index fd9abd09..ef7a5d7d 100644
--- a/app/android/app/src/main/AndroidManifest.xml
+++ b/app/android/app/src/main/AndroidManifest.xml
@@ -41,7 +41,7 @@
android:icon="@mipmap/launcher_icon"
android:usesCleartextTraffic="true"
android:enableOnBackInvokedCallback="true">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -113,10 +149,10 @@
-
diff --git a/app/ios/Runner/GeneratedPluginRegistrant.m b/app/ios/Runner/GeneratedPluginRegistrant.m
index f8d2398b..5eeaf75d 100644
--- a/app/ios/Runner/GeneratedPluginRegistrant.m
+++ b/app/ios/Runner/GeneratedPluginRegistrant.m
@@ -12,12 +12,6 @@
@import file_picker;
#endif
-#if __has_include()
-#import
-#else
-@import flutter_inappwebview_ios;
-#endif
-
#if __has_include()
#import
#else
@@ -82,7 +76,6 @@
+ (void)registerWithRegistry:(NSObject*)registry {
[FilePickerPlugin registerWithRegistrar:[registry registrarForPlugin:@"FilePickerPlugin"]];
- [InAppWebViewFlutterPlugin registerWithRegistrar:[registry registrarForPlugin:@"InAppWebViewFlutterPlugin"]];
[PdfTextPlugin registerWithRegistrar:[registry registrarForPlugin:@"PdfTextPlugin"]];
[FlutterSecureStoragePlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterSecureStoragePlugin"]];
[FlutterSharingIntentPlugin registerWithRegistrar:[registry registrarForPlugin:@"FlutterSharingIntentPlugin"]];
diff --git a/app/lib/core/providers.dart b/app/lib/core/providers.dart
index 5df5c93b..8d389292 100644
--- a/app/lib/core/providers.dart
+++ b/app/lib/core/providers.dart
@@ -1,11 +1,12 @@
import 'package:go_router/go_router.dart';
import 'package:lensai/core/routing/routes.dart';
+import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'providers.g.dart';
@Riverpod(keepAlive: true)
-GoRouter router(RouterRef ref) => GoRouter(
+GoRouter router(Ref ref) => GoRouter(
debugLogDiagnostics: true,
routes: $appRoutes,
);
diff --git a/app/lib/core/providers.g.dart b/app/lib/core/providers.g.dart
index 5d5f133f..05734119 100644
--- a/app/lib/core/providers.g.dart
+++ b/app/lib/core/providers.g.dart
@@ -6,7 +6,7 @@ part of 'providers.dart';
// RiverpodGenerator
// **************************************************************************
-String _$routerHash() => r'4ad45f430b1f43e427e21122d16bd761ca04ae0e';
+String _$routerHash() => r'dcafae2924a2ad3d5d836c6756d2e4a4ead36b4e';
/// See also [router].
@ProviderFor(router)
@@ -19,6 +19,8 @@ final routerProvider = Provider.internal(
allTransitiveDependencies: null,
);
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
typedef RouterRef = ProviderRef;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/domain/entities/equatable_image.dart b/app/lib/domain/entities/equatable_image.dart
index 773a8ac4..ca85a5f9 100644
--- a/app/lib/domain/entities/equatable_image.dart
+++ b/app/lib/domain/entities/equatable_image.dart
@@ -4,11 +4,11 @@ import 'package:lensai/extensions/image.dart';
class EquatableImage {
final Image value;
- final String? _imageHash;
+ final int? _imageHash;
EquatableImage(
this.value, {
- required String? hash,
+ required int? hash,
}) : _imageHash = hash;
static Future calculate(Image image) async {
diff --git a/app/lib/domain/services/app_initialization.g.dart b/app/lib/domain/services/app_initialization.g.dart
index 91541cf3..7d593514 100644
--- a/app/lib/domain/services/app_initialization.g.dart
+++ b/app/lib/domain/services/app_initialization.g.dart
@@ -31,4 +31,4 @@ final appInitializationServiceProvider = NotifierProvider<
typedef _$AppInitializationService = Notifier<
Result<({bool initialized, String? stage, List errors})>>;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/domain/services/generic_website.g.dart b/app/lib/domain/services/generic_website.g.dart
index a3ad8894..1eb9bf70 100644
--- a/app/lib/domain/services/generic_website.g.dart
+++ b/app/lib/domain/services/generic_website.g.dart
@@ -24,4 +24,4 @@ final genericWebsiteServiceProvider =
typedef _$GenericWebsiteService = Notifier;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/extensions/image.dart b/app/lib/extensions/image.dart
index cf2db883..31ea2012 100644
--- a/app/lib/extensions/image.dart
+++ b/app/lib/extensions/image.dart
@@ -1,14 +1,14 @@
import 'dart:ui';
-import 'package:crypto/crypto.dart';
import 'package:lensai/domain/entities/equatable_image.dart';
+import 'package:xxh3/xxh3.dart';
extension ImageHash on Image {
- Future calculateHash() async {
+ Future calculateHash() async {
final bytes = await toByteData();
if (bytes != null) {
- final digest = sha1.convert(bytes.buffer.asUint8List());
- return digest.toString();
+ final digest = xxh3(bytes.buffer.asUint8List());
+ return digest;
}
return null;
diff --git a/app/lib/features/about/data/repositories/package_info_repository.dart b/app/lib/features/about/data/repositories/package_info_repository.dart
index 25341f62..519e240a 100644
--- a/app/lib/features/about/data/repositories/package_info_repository.dart
+++ b/app/lib/features/about/data/repositories/package_info_repository.dart
@@ -1,9 +1,10 @@
import 'package:package_info_plus/package_info_plus.dart';
+import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'package_info_repository.g.dart';
@Riverpod(keepAlive: true)
-Future packageInfo(PackageInfoRef ref) {
+Future packageInfo(Ref ref) {
return PackageInfo.fromPlatform();
}
diff --git a/app/lib/features/about/data/repositories/package_info_repository.g.dart b/app/lib/features/about/data/repositories/package_info_repository.g.dart
index d0b6c152..c9b08f86 100644
--- a/app/lib/features/about/data/repositories/package_info_repository.g.dart
+++ b/app/lib/features/about/data/repositories/package_info_repository.g.dart
@@ -6,7 +6,7 @@ part of 'package_info_repository.dart';
// RiverpodGenerator
// **************************************************************************
-String _$packageInfoHash() => r'f7bd90882137aac7a9f28e9d10eae6efeee8c9d0';
+String _$packageInfoHash() => r'cc57db7b4684ab0d5df0f050b8ea045a3658e89a';
/// See also [packageInfo].
@ProviderFor(packageInfo)
@@ -19,6 +19,8 @@ final packageInfoProvider = FutureProvider.internal(
allTransitiveDependencies: null,
);
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
typedef PackageInfoRef = FutureProviderRef;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/features/app_widget/domain/services/home_widget.dart b/app/lib/features/app_widget/domain/services/home_widget.dart
index 7a12820c..c72ab589 100644
--- a/app/lib/features/app_widget/domain/services/home_widget.dart
+++ b/app/lib/features/app_widget/domain/services/home_widget.dart
@@ -1,18 +1,19 @@
import 'package:home_widget/home_widget.dart';
import 'package:lensai/data/models/received_parameter.dart';
+import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:rxdart/rxdart.dart';
part 'home_widget.g.dart';
@Riverpod(keepAlive: true)
-FutureOr widgetPinnable(WidgetPinnableRef ref) async {
+FutureOr widgetPinnable(Ref ref) async {
return await HomeWidget.isRequestPinWidgetSupported() ?? false;
}
@Riverpod()
Raw> appWidgetLaunchStream(
- AppWidgetLaunchStreamRef ref,
+ Ref ref,
) {
// ignore: discarded_futures
final initialStream = HomeWidget.initiallyLaunchedFromHomeWidget().asStream();
diff --git a/app/lib/features/app_widget/domain/services/home_widget.g.dart b/app/lib/features/app_widget/domain/services/home_widget.g.dart
index 6b87905e..b01c11c3 100644
--- a/app/lib/features/app_widget/domain/services/home_widget.g.dart
+++ b/app/lib/features/app_widget/domain/services/home_widget.g.dart
@@ -6,7 +6,7 @@ part of 'home_widget.dart';
// RiverpodGenerator
// **************************************************************************
-String _$widgetPinnableHash() => r'c39a8b473a92ff81fa772d7c235b10736e4a49bd';
+String _$widgetPinnableHash() => r'f91041f0f051ad0f00dd765cafea5571ca8c8088';
/// See also [widgetPinnable].
@ProviderFor(widgetPinnable)
@@ -20,9 +20,11 @@ final widgetPinnableProvider = FutureProvider.internal(
allTransitiveDependencies: null,
);
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
typedef WidgetPinnableRef = FutureProviderRef;
String _$appWidgetLaunchStreamHash() =>
- r'8c5e21346d492f89f546b4e32135a283719e70e1';
+ r'8eb98d88e74cc4f7573968563c106b8e6beee289';
/// See also [appWidgetLaunchStream].
@ProviderFor(appWidgetLaunchStream)
@@ -37,7 +39,9 @@ final appWidgetLaunchStreamProvider =
allTransitiveDependencies: null,
);
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
typedef AppWidgetLaunchStreamRef
= AutoDisposeProviderRef>>;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/features/bangs/data/providers.dart b/app/lib/features/bangs/data/providers.dart
index 469c0265..57189c22 100644
--- a/app/lib/features/bangs/data/providers.dart
+++ b/app/lib/features/bangs/data/providers.dart
@@ -3,6 +3,7 @@ import 'package:drift/native.dart';
import 'package:lensai/features/bangs/data/database/database.dart';
import 'package:path/path.dart' as p;
import 'package:path_provider/path_provider.dart' as path_provider;
+import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:sqlite3/sqlite3.dart';
import 'package:sqlite3_flutter_libs/sqlite3_flutter_libs.dart';
@@ -11,7 +12,7 @@ import 'package:universal_io/io.dart';
part 'providers.g.dart';
@Riverpod(keepAlive: true)
-BangDatabase bangDatabase(BangDatabaseRef ref) {
+BangDatabase bangDatabase(Ref ref) {
return BangDatabase(
LazyDatabase(() async {
// put the database file, called db.sqlite here, into the documents folder
diff --git a/app/lib/features/bangs/data/providers.g.dart b/app/lib/features/bangs/data/providers.g.dart
index 3086995b..c469e88c 100644
--- a/app/lib/features/bangs/data/providers.g.dart
+++ b/app/lib/features/bangs/data/providers.g.dart
@@ -6,7 +6,7 @@ part of 'providers.dart';
// RiverpodGenerator
// **************************************************************************
-String _$bangDatabaseHash() => r'bbca2edf32faa378dcb6270b12019758d5156662';
+String _$bangDatabaseHash() => r'd7964e9cdbb6e60fb6d2a78f07bfd4fa34bcb236';
/// See also [bangDatabase].
@ProviderFor(bangDatabase)
@@ -19,6 +19,8 @@ final bangDatabaseProvider = Provider.internal(
allTransitiveDependencies: null,
);
+@Deprecated('Will be removed in 3.0. Use Ref instead')
+// ignore: unused_element
typedef BangDatabaseRef = ProviderRef;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/features/bangs/data/services/source.g.dart b/app/lib/features/bangs/data/services/source.g.dart
index 5e931684..2e60ab3e 100644
--- a/app/lib/features/bangs/data/services/source.g.dart
+++ b/app/lib/features/bangs/data/services/source.g.dart
@@ -23,4 +23,4 @@ final bangSourceServiceProvider =
typedef _$BangSourceService = AutoDisposeNotifier;
// ignore_for_file: type=lint
-// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member
+// 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
diff --git a/app/lib/features/bangs/domain/providers.dart b/app/lib/features/bangs/domain/providers.dart
index e869ef78..75b79622 100644
--- a/app/lib/features/bangs/domain/providers.dart
+++ b/app/lib/features/bangs/domain/providers.dart
@@ -2,31 +2,32 @@ import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/domain/repositories/data.dart';
import 'package:lensai/features/bangs/domain/repositories/sync.dart';
+import 'package:riverpod/riverpod.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'providers.g.dart';
@Riverpod()
-Stream bangData(BangDataRef ref, String? trigger) {
+Stream bangData(Ref ref, String? trigger) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchBang(trigger);
}
@Riverpod(keepAlive: true)
-Stream kagiSearchBangData(KagiSearchBangDataRef ref) {
+Stream kagiSearchBangData(Ref ref) {
final repository = ref.watch(bangDataRepositoryProvider.notifier);
return repository.watchBang('kagi');
}
@Riverpod()
-Stream