majro update
This commit is contained in:
@@ -5,8 +5,15 @@ import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
|
||||
part 'website_title.g.dart';
|
||||
|
||||
@Riverpod(keepAlive: true)
|
||||
Future<WebPageInfo> pageInfo(Ref ref, Uri url) {
|
||||
@Riverpod()
|
||||
Future<WebPageInfo> pageInfo(Ref ref, Uri url) async {
|
||||
final websiteService = ref.watch(genericWebsiteServiceProvider.notifier);
|
||||
return websiteService.fetchPageInfo(url).then((value) => value.value);
|
||||
|
||||
final result = await websiteService.fetchPageInfo(url);
|
||||
|
||||
if (result.isSuccess) {
|
||||
ref.keepAlive();
|
||||
}
|
||||
|
||||
return result.value;
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ part of 'website_title.dart';
|
||||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$pageInfoHash() => r'f777a45aba30c82cf7b8790c07a804be364cfeb1';
|
||||
String _$pageInfoHash() => r'bdb860ec904959d7aa561045b85b75b209fb38e1';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
@@ -39,21 +39,13 @@ class PageInfoFamily extends Family<AsyncValue<WebPageInfo>> {
|
||||
const PageInfoFamily();
|
||||
|
||||
/// See also [pageInfo].
|
||||
PageInfoProvider call(
|
||||
Uri url,
|
||||
) {
|
||||
return PageInfoProvider(
|
||||
url,
|
||||
);
|
||||
PageInfoProvider call(Uri url) {
|
||||
return PageInfoProvider(url);
|
||||
}
|
||||
|
||||
@override
|
||||
PageInfoProvider getProviderOverride(
|
||||
covariant PageInfoProvider provider,
|
||||
) {
|
||||
return call(
|
||||
provider.url,
|
||||
);
|
||||
PageInfoProvider getProviderOverride(covariant PageInfoProvider provider) {
|
||||
return call(provider.url);
|
||||
}
|
||||
|
||||
static const Iterable<ProviderOrFamily>? _dependencies = null;
|
||||
@@ -72,25 +64,21 @@ class PageInfoFamily extends Family<AsyncValue<WebPageInfo>> {
|
||||
}
|
||||
|
||||
/// See also [pageInfo].
|
||||
class PageInfoProvider extends FutureProvider<WebPageInfo> {
|
||||
class PageInfoProvider extends AutoDisposeFutureProvider<WebPageInfo> {
|
||||
/// See also [pageInfo].
|
||||
PageInfoProvider(
|
||||
Uri url,
|
||||
) : this._internal(
|
||||
(ref) => pageInfo(
|
||||
ref as PageInfoRef,
|
||||
url,
|
||||
),
|
||||
from: pageInfoProvider,
|
||||
name: r'pageInfoProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$pageInfoHash,
|
||||
dependencies: PageInfoFamily._dependencies,
|
||||
allTransitiveDependencies: PageInfoFamily._allTransitiveDependencies,
|
||||
url: url,
|
||||
);
|
||||
PageInfoProvider(Uri url)
|
||||
: this._internal(
|
||||
(ref) => pageInfo(ref as PageInfoRef, url),
|
||||
from: pageInfoProvider,
|
||||
name: r'pageInfoProvider',
|
||||
debugGetCreateSourceHash:
|
||||
const bool.fromEnvironment('dart.vm.product')
|
||||
? null
|
||||
: _$pageInfoHash,
|
||||
dependencies: PageInfoFamily._dependencies,
|
||||
allTransitiveDependencies: PageInfoFamily._allTransitiveDependencies,
|
||||
url: url,
|
||||
);
|
||||
|
||||
PageInfoProvider._internal(
|
||||
super._createNotifier, {
|
||||
@@ -123,7 +111,7 @@ class PageInfoProvider extends FutureProvider<WebPageInfo> {
|
||||
}
|
||||
|
||||
@override
|
||||
FutureProviderElement<WebPageInfo> createElement() {
|
||||
AutoDisposeFutureProviderElement<WebPageInfo> createElement() {
|
||||
return _PageInfoProviderElement(this);
|
||||
}
|
||||
|
||||
@@ -143,17 +131,19 @@ class PageInfoProvider extends FutureProvider<WebPageInfo> {
|
||||
|
||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||
// ignore: unused_element
|
||||
mixin PageInfoRef on FutureProviderRef<WebPageInfo> {
|
||||
mixin PageInfoRef on AutoDisposeFutureProviderRef<WebPageInfo> {
|
||||
/// The parameter `url` of this provider.
|
||||
Uri get url;
|
||||
}
|
||||
|
||||
class _PageInfoProviderElement extends FutureProviderElement<WebPageInfo>
|
||||
class _PageInfoProviderElement
|
||||
extends AutoDisposeFutureProviderElement<WebPageInfo>
|
||||
with PageInfoRef {
|
||||
_PageInfoProviderElement(super.provider);
|
||||
|
||||
@override
|
||||
Uri get url => (origin as PageInfoProvider).url;
|
||||
}
|
||||
|
||||
// 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
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
|
||||
DraggableScrollableController useDraggableScrollableController() {
|
||||
return use(const _DraggableScrollableControllerHook());
|
||||
}
|
||||
|
||||
class _DraggableScrollableControllerHook
|
||||
extends Hook<DraggableScrollableController> {
|
||||
const _DraggableScrollableControllerHook();
|
||||
|
||||
@override
|
||||
HookState<DraggableScrollableController, Hook<DraggableScrollableController>>
|
||||
createState() {
|
||||
return _DraggableScrollableControllerHookState();
|
||||
}
|
||||
}
|
||||
|
||||
class _DraggableScrollableControllerHookState
|
||||
extends
|
||||
HookState<
|
||||
DraggableScrollableController,
|
||||
_DraggableScrollableControllerHook
|
||||
> {
|
||||
late final _controller = DraggableScrollableController();
|
||||
|
||||
@override
|
||||
DraggableScrollableController build(BuildContext context) => _controller;
|
||||
|
||||
@override
|
||||
void dispose() => _controller.dispose();
|
||||
|
||||
@override
|
||||
String get debugLabel => 'useDraggableScrollableController';
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_hooks/flutter_hooks.dart';
|
||||
|
||||
OverlayPortalController useOverlayPortalController() {
|
||||
return use(const _OverlayPortalControllerHook());
|
||||
}
|
||||
|
||||
class _OverlayPortalControllerHook extends Hook<OverlayPortalController> {
|
||||
const _OverlayPortalControllerHook();
|
||||
|
||||
@override
|
||||
HookState<OverlayPortalController, Hook<OverlayPortalController>>
|
||||
createState() {
|
||||
return _OverlayPortalControllerHookState();
|
||||
}
|
||||
}
|
||||
|
||||
class _OverlayPortalControllerHookState
|
||||
extends HookState<OverlayPortalController, _OverlayPortalControllerHook> {
|
||||
late final _controller = OverlayPortalController();
|
||||
|
||||
@override
|
||||
OverlayPortalController build(BuildContext context) => _controller;
|
||||
|
||||
@override
|
||||
String get debugLabel => 'useOverlayPortalController';
|
||||
}
|
||||
@@ -130,6 +130,7 @@ class ExternalResultsAutocomplete<T extends Object> extends StatefulWidget {
|
||||
/// {@endtemplate}
|
||||
final AutocompleteOnSelected<T>? onSelected;
|
||||
|
||||
// ignore: avoid_futureor_void
|
||||
final FutureOr<void> Function(TextEditingValue textEditingValue)
|
||||
onTextChanged;
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class RoundedBackground extends StatelessWidget {
|
||||
final Widget child;
|
||||
final Color? backgroundColor;
|
||||
|
||||
const RoundedBackground({
|
||||
super.key,
|
||||
required this.child,
|
||||
this.backgroundColor,
|
||||
});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 2),
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(25),
|
||||
color: backgroundColor ?? Theme.of(context).colorScheme.primary,
|
||||
),
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
}
|
||||
+3
-2
@@ -14,8 +14,9 @@ class UrlIcon extends HookConsumerWidget {
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final icon = useCachedFuture(
|
||||
() async =>
|
||||
ref.read(genericWebsiteServiceProvider.notifier).getUrlIcon(url),
|
||||
() =>
|
||||
// ignore: discarded_futures
|
||||
ref.read(genericWebsiteServiceProvider.notifier).getUrlIcon(url),
|
||||
[url],
|
||||
);
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:lensai/data/models/web_page_info.dart';
|
||||
import 'package:lensai/extensions/nullable.dart';
|
||||
import 'package:lensai/presentation/controllers/website_title.dart';
|
||||
import 'package:lensai/presentation/widgets/rounded_text.dart';
|
||||
import 'package:skeletonizer/skeletonizer.dart';
|
||||
|
||||
class WebsiteFeedTile extends HookConsumerWidget {
|
||||
final Uri url;
|
||||
final WebPageInfo? precachedInfo;
|
||||
|
||||
const WebsiteFeedTile(this.url, {this.precachedInfo, super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final pageInfoAsync =
|
||||
(precachedInfo?.feeds != null)
|
||||
? AsyncValue.data(precachedInfo!)
|
||||
: ref.watch(pageInfoProvider(url));
|
||||
|
||||
return Skeletonizer(
|
||||
enabled: pageInfoAsync.isLoading && precachedInfo?.feeds == null,
|
||||
child: pageInfoAsync.when(
|
||||
data: (info) {
|
||||
if (info.feeds.isEmpty) {
|
||||
return const SizedBox.shrink();
|
||||
}
|
||||
|
||||
return ListTile(
|
||||
leading: const Icon(Icons.rss_feed),
|
||||
title: const Text('Available Web Feeds'),
|
||||
trailing: RoundedBackground(
|
||||
child: Text(
|
||||
info.feeds!.length.toString(),
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: Theme.of(context).colorScheme.onPrimary,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
error: (error, stackTrace) {
|
||||
return const SizedBox.shrink();
|
||||
|
||||
//Will be dispalyed on title already
|
||||
|
||||
// return FailureWidget(
|
||||
// title: error.toString(),
|
||||
// onRetry: () => ref.refresh(pageInfoProvider(url)),
|
||||
// );
|
||||
},
|
||||
loading:
|
||||
() => const ListTile(
|
||||
leading: Icon(Icons.rss_feed),
|
||||
contentPadding: EdgeInsets.zero,
|
||||
title: Text('Available Web Feeds'),
|
||||
trailing: Bone.icon(),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user