intermediate

This commit is contained in:
Fabian Freund
2024-09-13 09:11:06 +02:00
parent 3b047b5d8a
commit 37d2c84d7f
155 changed files with 5666 additions and 1816 deletions
@@ -1,4 +1,7 @@
import 'dart:ui';
import 'package:drift/drift.dart';
import 'package:flutter_mozilla_components/flutter_mozilla_components.dart';
import 'package:lensai/features/bangs/data/database/database.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
@@ -94,14 +97,17 @@ class BangDao extends DatabaseAccessor<BangDatabase> with _$BangDaoMixin {
return db.bangQuery(query: db.buildQuery(searchString));
}
Future<int> upsertBangIcon(String trigger, Uint8List iconData) {
return db.bangIcon.insertOne(
BangIconCompanion.insert(
trigger: trigger,
iconData: iconData,
fetchDate: DateTime.now(),
),
mode: InsertMode.insertOrReplace,
);
}
// Future<int> upsertBangIcon(String trigger, BrowserIcon icon) async {
// //TODO: swithc to WEBP in future, requires 3rd party
// final compressed = await icon.image.toByteData(format: ImageByteFormat.png);
// return db.bangIcon.insertOne(
// BangIconCompanion.insert(
// trigger: trigger,
// iconData: compressed!.buffer.asUint8List(),
// fetchDate: DateTime.now(),
// ),
// mode: InsertMode.insertOrReplace,
// );
// }
}
@@ -1021,8 +1021,6 @@ class BangDataView extends ViewInfo<BangDataView, BangData>
.read(DriftSqlType.int, data['${effectivePrefix}frequency']),
lastUsed: attachedDatabase.typeMapping
.read(DriftSqlType.dateTime, data['${effectivePrefix}last_used']),
iconData: attachedDatabase.typeMapping
.read(DriftSqlType.blob, data['${effectivePrefix}icon_data']),
);
}
@@ -1121,7 +1119,6 @@ abstract class _$BangDatabase extends GeneratedDatabase {
.fromSql(row.readNullable<String>('format')),
frequency: row.readNullable<int>('frequency'),
lastUsed: row.readNullable<DateTime>('last_used'),
iconData: row.readNullable<Uint8List>('icon_data'),
));
}
@@ -1,6 +1,6 @@
import 'package:copy_with_extension/copy_with_extension.dart';
import 'package:drift/drift.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/geckoview/domain/entities/browser_icon.dart';
part 'bang_data.g.dart';
@@ -9,7 +9,7 @@ class BangData extends Bang {
final int frequency;
final DateTime? lastUsed;
final Uint8List? iconData;
final BrowserIcon? icon;
BangData({
required super.websiteName,
@@ -21,7 +21,7 @@ class BangData extends Bang {
super.format,
int? frequency,
this.lastUsed,
this.iconData,
this.icon,
}) : frequency = frequency ?? 0;
@override
@@ -32,6 +32,6 @@ class BangData extends Bang {
...super.hashParameters,
frequency,
lastUsed,
iconData,
icon,
];
}
@@ -25,7 +25,7 @@ abstract class _$BangDataCWProxy {
BangData lastUsed(DateTime? lastUsed);
BangData iconData(Uint8List? iconData);
BangData icon(BrowserIcon? icon);
/// 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.
///
@@ -43,7 +43,7 @@ abstract class _$BangDataCWProxy {
Set<BangFormat>? format,
int? frequency,
DateTime? lastUsed,
Uint8List? iconData,
BrowserIcon? icon,
});
}
@@ -81,7 +81,7 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
BangData lastUsed(DateTime? lastUsed) => this(lastUsed: lastUsed);
@override
BangData iconData(Uint8List? iconData) => this(iconData: iconData);
BangData icon(BrowserIcon? icon) => this(icon: icon);
@override
@@ -101,7 +101,7 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
Object? format = const $CopyWithPlaceholder(),
Object? frequency = const $CopyWithPlaceholder(),
Object? lastUsed = const $CopyWithPlaceholder(),
Object? iconData = const $CopyWithPlaceholder(),
Object? icon = const $CopyWithPlaceholder(),
}) {
return BangData(
websiteName:
@@ -142,10 +142,10 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
? _value.lastUsed
// ignore: cast_nullable_to_non_nullable
: lastUsed as DateTime?,
iconData: iconData == const $CopyWithPlaceholder()
? _value.iconData
icon: icon == const $CopyWithPlaceholder()
? _value.icon
// ignore: cast_nullable_to_non_nullable
: iconData as Uint8List?,
: icon as BrowserIcon?,
);
}
}
@@ -8,7 +8,6 @@ import 'package:lensai/features/bangs/data/database/database.dart';
import 'package:lensai/features/bangs/data/models/bang.dart';
import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/data/providers.dart';
import 'package:lensai/utils/image_helper.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'data.g.dart';
@@ -69,24 +68,16 @@ class BangDataRepository extends _$BangDataRepository {
}
Future<Result<BangData>> ensureIconAvailable(BangData bang) async {
if (bang.iconData != null) {
if (bang.icon != null) {
return Result.success(bang);
}
final result = await ref
final icon = await ref
.read(genericWebsiteServiceProvider.notifier)
.getFaviconBytes(Uri.parse(bang.getUrl('').origin));
.getUrlFavicon(url: Uri.parse(bang.getUrl('').origin));
return result.flatMapAsync(
(faviconBytes) async {
if (faviconBytes != null && await isImageValid(faviconBytes)) {
await _db.bangDao.upsertBangIcon(bang.trigger, faviconBytes);
return bang.copyWith.iconData(faviconBytes);
}
return bang;
},
);
// await _db.bangDao.upsertBangIcon(bang.trigger, icon);
return Result.success(bang.copyWith.icon(icon));
}
Stream<double> watchIconCacheSize() {
@@ -7,7 +7,7 @@ part of 'data.dart';
// **************************************************************************
String _$bangDataRepositoryHash() =>
r'ef06babcaa07361e37f5cc62a268eb10aed0fc82';
r'abacc6db3a61958cae67a91cbfd312ae87c641b3';
/// See also [BangDataRepository].
@ProviderFor(BangDataRepository)
@@ -4,7 +4,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lensai/core/routing/routes.dart';
import 'package:lensai/features/bangs/domain/providers.dart';
import 'package:lensai/features/bangs/presentation/widgets/bang_details.dart';
import 'package:lensai/features/search_browser/domain/entities/modes.dart';
import 'package:lensai/features/kagi/data/entities/modes.dart';
import 'package:lensai/features/search_browser/domain/entities/sheet.dart';
import 'package:lensai/features/search_browser/domain/providers.dart';
import 'package:lensai/presentation/widgets/failure_widget.dart';
@@ -49,9 +49,9 @@ class BangListScreen extends HookConsumerWidget {
.read(selectedBangTriggerProvider().notifier)
.setTrigger(bang.trigger);
if (ref.read(bottomSheetProvider) is! CreateTab) {
if (ref.read(bottomSheetProvider) is! CreateTabSheet) {
ref.read(bottomSheetProvider.notifier).show(
CreateTab(
CreateTabSheet(
preferredTool: KagiTool.search,
),
);
@@ -8,7 +8,7 @@ import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lensai/core/routing/routes.dart';
import 'package:lensai/features/bangs/domain/repositories/search.dart';
import 'package:lensai/features/bangs/presentation/widgets/bang_details.dart';
import 'package:lensai/features/search_browser/domain/entities/modes.dart';
import 'package:lensai/features/kagi/data/entities/modes.dart';
import 'package:lensai/features/search_browser/domain/entities/sheet.dart';
import 'package:lensai/features/search_browser/domain/providers.dart';
import 'package:lensai/features/settings/data/models/settings.dart';
@@ -77,9 +77,9 @@ class BangSearchScreen extends HookConsumerWidget {
.read(selectedBangTriggerProvider().notifier)
.setTrigger(bang.trigger);
if (ref.read(bottomSheetProvider) is! CreateTab) {
if (ref.read(bottomSheetProvider) is! CreateTabSheet) {
ref.read(bottomSheetProvider.notifier).show(
CreateTab(preferredTool: KagiTool.search),
CreateTabSheet(preferredTool: KagiTool.search),
);
}
@@ -6,7 +6,6 @@ import 'package:lensai/features/bangs/data/models/bang_data.dart';
import 'package:lensai/features/bangs/presentation/widgets/bang_icon.dart';
import 'package:lensai/features/settings/data/models/settings.dart';
import 'package:lensai/features/settings/data/repositories/settings_repository.dart';
import 'package:lensai/features/web_view/presentation/controllers/switch_new_tab.dart';
import 'package:lensai/utils/ui_helper.dart' as ui_helper;
class BangDetails extends HookConsumerWidget {
@@ -20,18 +20,12 @@ class BangIcon extends HookConsumerWidget {
enabled: bangAsync.isLoading,
child: SizedBox.square(
dimension: iconSize,
child: (bang.iconData != null)
? Image.memory(
bang.iconData!,
child: (bang.icon != null)
? RawImage(
image: bang.icon?.image.value,
height: iconSize,
width: iconSize,
fit: BoxFit.fill,
errorBuilder: (context, error, stackTrace) {
return Icon(
MdiIcons.web,
size: iconSize,
);
},
)
: Icon(
MdiIcons.web,
@@ -7,7 +7,6 @@ import 'package:lensai/features/bangs/domain/repositories/data.dart';
import 'package:lensai/features/bangs/presentation/widgets/bang_icon.dart';
import 'package:lensai/features/bangs/presentation/widgets/search_field.dart';
import 'package:lensai/features/search_browser/domain/providers.dart';
import 'package:lensai/features/web_view/presentation/controllers/switch_new_tab.dart';
import 'package:lensai/presentation/widgets/selectable_chips.dart';
class SiteSearch extends HookConsumerWidget {