major update
This commit is contained in:
@@ -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];
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user