major update

This commit is contained in:
Fabian Freund
2025-03-03 15:15:05 +01:00
parent 200c82a442
commit 20bdc4df3e
103 changed files with 2664 additions and 783 deletions
@@ -6,10 +6,14 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'website_title.g.dart';
@Riverpod()
Future<WebPageInfo> pageInfo(Ref ref, Uri url) async {
Future<WebPageInfo> pageInfo(
Ref ref,
Uri url, {
required bool isImageRequest,
}) async {
final websiteService = ref.watch(genericWebsiteServiceProvider.notifier);
final result = await websiteService.fetchPageInfo(url);
final result = await websiteService.fetchPageInfo(url, isImageRequest);
if (result.isSuccess) {
ref.keepAlive();
@@ -6,7 +6,7 @@ part of 'website_title.dart';
// RiverpodGenerator
// **************************************************************************
String _$pageInfoHash() => r'bdb860ec904959d7aa561045b85b75b209fb38e1';
String _$pageInfoHash() => r'dd5644057e4ba7280275105de4788eb4046592d4';
/// Copied from Dart SDK
class _SystemHash {
@@ -39,13 +39,13 @@ class PageInfoFamily extends Family<AsyncValue<WebPageInfo>> {
const PageInfoFamily();
/// See also [pageInfo].
PageInfoProvider call(Uri url) {
return PageInfoProvider(url);
PageInfoProvider call(Uri url, {required bool isImageRequest}) {
return PageInfoProvider(url, isImageRequest: isImageRequest);
}
@override
PageInfoProvider getProviderOverride(covariant PageInfoProvider provider) {
return call(provider.url);
return call(provider.url, isImageRequest: provider.isImageRequest);
}
static const Iterable<ProviderOrFamily>? _dependencies = null;
@@ -66,9 +66,10 @@ class PageInfoFamily extends Family<AsyncValue<WebPageInfo>> {
/// See also [pageInfo].
class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
/// See also [pageInfo].
PageInfoProvider(Uri url)
PageInfoProvider(Uri url, {required bool isImageRequest})
: this._internal(
(ref) => pageInfo(ref as PageInfoRef, url),
(ref) =>
pageInfo(ref as PageInfoRef, url, isImageRequest: isImageRequest),
from: pageInfoProvider,
name: r'pageInfoProvider',
debugGetCreateSourceHash:
@@ -78,6 +79,7 @@ class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
dependencies: PageInfoFamily._dependencies,
allTransitiveDependencies: PageInfoFamily._allTransitiveDependencies,
url: url,
isImageRequest: isImageRequest,
);
PageInfoProvider._internal(
@@ -88,9 +90,11 @@ class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
required super.debugGetCreateSourceHash,
required super.from,
required this.url,
required this.isImageRequest,
}) : super.internal();
final Uri url;
final bool isImageRequest;
@override
Override overrideWith(
@@ -106,6 +110,7 @@ class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
allTransitiveDependencies: null,
debugGetCreateSourceHash: null,
url: url,
isImageRequest: isImageRequest,
),
);
}
@@ -117,13 +122,16 @@ class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
@override
bool operator ==(Object other) {
return other is PageInfoProvider && other.url == url;
return other is PageInfoProvider &&
other.url == url &&
other.isImageRequest == isImageRequest;
}
@override
int get hashCode {
var hash = _SystemHash.combine(0, runtimeType.hashCode);
hash = _SystemHash.combine(hash, url.hashCode);
hash = _SystemHash.combine(hash, isImageRequest.hashCode);
return _SystemHash.finish(hash);
}
@@ -134,6 +142,9 @@ class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
mixin PageInfoRef on AutoDisposeFutureProviderRef<WebPageInfo> {
/// The parameter `url` of this provider.
Uri get url;
/// The parameter `isImageRequest` of this provider.
bool get isImageRequest;
}
class _PageInfoProviderElement
@@ -143,6 +154,8 @@ class _PageInfoProviderElement
@override
Uri get url => (origin as PageInfoProvider).url;
@override
bool get isImageRequest => (origin as PageInfoProvider).isImageRequest;
}
// ignore_for_file: type=lint
@@ -64,7 +64,6 @@ class SelectableChips<T extends S, S, K> extends StatelessWidget {
return ListView.builder(
controller: controller,
scrollDirection: Axis.horizontal,
shrinkWrap: true,
itemCount: items.length,
itemBuilder: (context, index) {
final item = items[index];
+4 -4
View File
@@ -7,17 +7,17 @@ import 'package:skeletonizer/skeletonizer.dart';
class UrlIcon extends HookConsumerWidget {
final double iconSize;
final Uri url;
final List<Uri> urlList;
const UrlIcon(this.url, {required this.iconSize, super.key});
const UrlIcon(this.urlList, {required this.iconSize, super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final icon = useCachedFuture(
() =>
// ignore: discarded_futures
ref.read(genericWebsiteServiceProvider.notifier).getUrlIcon(url),
[url],
ref.read(genericWebsiteServiceProvider.notifier).getUrlIcon(urlList),
[urlList],
);
return Skeletonizer(
@@ -1,5 +1,8 @@
import 'dart:convert';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:lensai/core/routing/routes.dart';
import 'package:lensai/data/models/web_page_info.dart';
import 'package:lensai/extensions/nullable.dart';
import 'package:lensai/presentation/controllers/website_title.dart';
@@ -17,11 +20,12 @@ class WebsiteFeedTile extends HookConsumerWidget {
final pageInfoAsync =
(precachedInfo?.feeds != null)
? AsyncValue.data(precachedInfo!)
: ref.watch(pageInfoProvider(url));
: ref.watch(pageInfoProvider(url, isImageRequest: false));
return Skeletonizer(
enabled: pageInfoAsync.isLoading && precachedInfo?.feeds == null,
child: pageInfoAsync.when(
skipLoadingOnReload: true,
data: (info) {
if (info.feeds.isEmpty) {
return const SizedBox.shrink();
@@ -39,6 +43,13 @@ class WebsiteFeedTile extends HookConsumerWidget {
),
),
),
onTap: () async {
await SelectFeedDialogRoute(
feedsJson: jsonEncode(
info.feeds!.map((feed) => feed.toString()).toList(),
),
).push(context);
},
);
},
error: (error, stackTrace) {
@@ -16,11 +16,12 @@ class WebsiteTitleTile extends HookConsumerWidget {
final pageInfoAsync =
(precachedInfo?.isPageInfoComplete ?? false)
? AsyncValue.data(precachedInfo!)
: ref.watch(pageInfoProvider(url));
: ref.watch(pageInfoProvider(url, isImageRequest: false));
return Skeletonizer(
enabled: pageInfoAsync.isLoading && precachedInfo == null,
child: pageInfoAsync.when(
skipLoadingOnReload: true,
data: (info) {
return ListTile(
leading: RawImage(
@@ -36,7 +37,8 @@ class WebsiteTitleTile extends HookConsumerWidget {
error: (error, stackTrace) {
return FailureWidget(
title: error.toString(),
onRetry: () => ref.refresh(pageInfoProvider(url)),
onRetry:
() => ref.refresh(pageInfoProvider(url, isImageRequest: false)),
);
},
loading: