diff --git a/app/lib/presentation/controllers/website_title.dart b/app/lib/presentation/controllers/website_title.dart index ad61d6f0..5197cc97 100644 --- a/app/lib/presentation/controllers/website_title.dart +++ b/app/lib/presentation/controllers/website_title.dart @@ -5,6 +5,34 @@ import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'website_title.g.dart'; +@Riverpod() +class CompletePageInfo extends _$CompletePageInfo { + @override + AsyncValue build(Uri url, WebPageInfo? cached) { + if (cached?.isPageInfoComplete == true) { + return AsyncData(cached!); + } + + ref.listen(pageInfoProvider(url, isImageRequest: false), (previous, next) { + if (cached != null && next.hasValue) { + state = AsyncData( + WebPageInfo( + url: url, + //Cached is preferred as this comes from gecko and is more likely to be correct compared to manual request + favicon: cached.favicon ?? next.value!.favicon, + feeds: cached.feeds ?? next.value!.feeds, + title: cached.title ?? next.value!.title, + ), + ); + } else { + state = next; + } + }); + + return (cached != null) ? AsyncData(cached) : const AsyncLoading(); + } +} + @Riverpod() Future pageInfo( Ref ref, diff --git a/app/lib/presentation/controllers/website_title.g.dart b/app/lib/presentation/controllers/website_title.g.dart index 4b2d8faa..b8adb7fe 100644 --- a/app/lib/presentation/controllers/website_title.g.dart +++ b/app/lib/presentation/controllers/website_title.g.dart @@ -158,5 +158,168 @@ class _PageInfoProviderElement bool get isImageRequest => (origin as PageInfoProvider).isImageRequest; } +String _$completePageInfoHash() => r'18d196f4fb9323cdcb8dfa1bde4a70bf25f10e2b'; + +abstract class _$CompletePageInfo + extends BuildlessAutoDisposeNotifier> { + late final Uri url; + late final WebPageInfo? cached; + + AsyncValue build(Uri url, WebPageInfo? cached); +} + +/// See also [CompletePageInfo]. +@ProviderFor(CompletePageInfo) +const completePageInfoProvider = CompletePageInfoFamily(); + +/// See also [CompletePageInfo]. +class CompletePageInfoFamily extends Family> { + /// See also [CompletePageInfo]. + const CompletePageInfoFamily(); + + /// See also [CompletePageInfo]. + CompletePageInfoProvider call(Uri url, WebPageInfo? cached) { + return CompletePageInfoProvider(url, cached); + } + + @override + CompletePageInfoProvider getProviderOverride( + covariant CompletePageInfoProvider provider, + ) { + return call(provider.url, provider.cached); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'completePageInfoProvider'; +} + +/// See also [CompletePageInfo]. +class CompletePageInfoProvider + extends + AutoDisposeNotifierProviderImpl< + CompletePageInfo, + AsyncValue + > { + /// See also [CompletePageInfo]. + CompletePageInfoProvider(Uri url, WebPageInfo? cached) + : this._internal( + () => + CompletePageInfo() + ..url = url + ..cached = cached, + from: completePageInfoProvider, + name: r'completePageInfoProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$completePageInfoHash, + dependencies: CompletePageInfoFamily._dependencies, + allTransitiveDependencies: + CompletePageInfoFamily._allTransitiveDependencies, + url: url, + cached: cached, + ); + + CompletePageInfoProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.url, + required this.cached, + }) : super.internal(); + + final Uri url; + final WebPageInfo? cached; + + @override + AsyncValue runNotifierBuild( + covariant CompletePageInfo notifier, + ) { + return notifier.build(url, cached); + } + + @override + Override overrideWith(CompletePageInfo Function() create) { + return ProviderOverride( + origin: this, + override: CompletePageInfoProvider._internal( + () => + create() + ..url = url + ..cached = cached, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + url: url, + cached: cached, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement> + createElement() { + return _CompletePageInfoProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is CompletePageInfoProvider && + other.url == url && + other.cached == cached; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, url.hashCode); + hash = _SystemHash.combine(hash, cached.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin CompletePageInfoRef + on AutoDisposeNotifierProviderRef> { + /// The parameter `url` of this provider. + Uri get url; + + /// The parameter `cached` of this provider. + WebPageInfo? get cached; +} + +class _CompletePageInfoProviderElement + extends + AutoDisposeNotifierProviderElement< + CompletePageInfo, + AsyncValue + > + with CompletePageInfoRef { + _CompletePageInfoProviderElement(super.provider); + + @override + Uri get url => (origin as CompletePageInfoProvider).url; + @override + WebPageInfo? get cached => (origin as CompletePageInfoProvider).cached; +} + // 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 diff --git a/app/lib/presentation/widgets/website_feed_tile.dart b/app/lib/presentation/widgets/website_feed_tile.dart index cc584aca..b3f4e973 100644 --- a/app/lib/presentation/widgets/website_feed_tile.dart +++ b/app/lib/presentation/widgets/website_feed_tile.dart @@ -17,10 +17,9 @@ class WebsiteFeedTile extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final pageInfoAsync = - (precachedInfo?.feeds != null) - ? AsyncValue.data(precachedInfo!) - : ref.watch(pageInfoProvider(url, isImageRequest: false)); + final pageInfoAsync = ref.watch( + completePageInfoProvider(url, precachedInfo), + ); return Skeletonizer( enabled: pageInfoAsync.isLoading && precachedInfo?.feeds == null, diff --git a/app/lib/presentation/widgets/website_title_tile.dart b/app/lib/presentation/widgets/website_title_tile.dart index 8101d801..f1d608fd 100644 --- a/app/lib/presentation/widgets/website_title_tile.dart +++ b/app/lib/presentation/widgets/website_title_tile.dart @@ -13,10 +13,9 @@ class WebsiteTitleTile extends HookConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final pageInfoAsync = - (precachedInfo?.isPageInfoComplete ?? false) - ? AsyncValue.data(precachedInfo!) - : ref.watch(pageInfoProvider(url, isImageRequest: false)); + final pageInfoAsync = ref.watch( + completePageInfoProvider(url, precachedInfo), + ); return Skeletonizer( enabled: pageInfoAsync.isLoading && precachedInfo == null,