majro update

This commit is contained in:
Fabian Freund
2025-02-28 14:30:49 +01:00
parent a8957f6cf8
commit 3c4d479bd9
181 changed files with 7090 additions and 5299 deletions
@@ -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,
);
}
}
@@ -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(),
),
),
);
}
}