From 7af0f1d4e3b657dfe1c036a2e4776d552308128a Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Sun, 19 Apr 2026 18:44:33 +0200 Subject: [PATCH] ui improvements and lint fixes --- .../lib/features/addons/domain/providers.dart | 8 +-- .../presentation/screens/addon_details.dart | 4 +- .../screens/addon_listing_details.dart | 71 ++++++++----------- .../bangs/domain/providers/bangs.g.dart | 2 +- .../web_feed/utils/fetch_entrypoint.dart | 2 +- 5 files changed, 39 insertions(+), 48 deletions(-) diff --git a/apps/weblibre/lib/features/addons/domain/providers.dart b/apps/weblibre/lib/features/addons/domain/providers.dart index f7ebfad4..6b9f473d 100644 --- a/apps/weblibre/lib/features/addons/domain/providers.dart +++ b/apps/weblibre/lib/features/addons/domain/providers.dart @@ -153,14 +153,14 @@ Future> searchAddonListings( if (trimmed.isEmpty) { return ref.watch(featuredAddonListingsProvider(app).future); } - return ref.read(addonServiceProvider).searchAddonListings( - query: trimmed, - app: app, - ); + return ref + .read(addonServiceProvider) + .searchAddonListings(query: trimmed, app: app); } @Riverpod(keepAlive: true) class AddonStoreAppFilter extends _$AddonStoreAppFilter { + // ignore: use_setters_to_change_properties void setApp(AddonStoreApp app) => state = app; @override diff --git a/apps/weblibre/lib/features/addons/presentation/screens/addon_details.dart b/apps/weblibre/lib/features/addons/presentation/screens/addon_details.dart index f9a24a3b..a85615c1 100644 --- a/apps/weblibre/lib/features/addons/presentation/screens/addon_details.dart +++ b/apps/weblibre/lib/features/addons/presentation/screens/addon_details.dart @@ -589,9 +589,9 @@ class _DescriptionCard extends ConsumerWidget { : MarkdownBody( data: markdown, selectable: true, - onTapLink: (text, href, title) { + onTapLink: (text, href, title) async { if (href != null && href.isNotEmpty) { - launchUrl(Uri.parse(href)); + await launchUrl(Uri.parse(href)); } }, ), diff --git a/apps/weblibre/lib/features/addons/presentation/screens/addon_listing_details.dart b/apps/weblibre/lib/features/addons/presentation/screens/addon_listing_details.dart index 0f2de31e..8ab69d8a 100644 --- a/apps/weblibre/lib/features/addons/presentation/screens/addon_listing_details.dart +++ b/apps/weblibre/lib/features/addons/presentation/screens/addon_listing_details.dart @@ -249,16 +249,37 @@ class _ScreenshotsSection extends StatelessWidget { itemBuilder: (context, index) { final p = previews[index]; return GestureDetector( - onTap: () => _showFullScreenImage(context, p.imageUrl), + onTap: () => showDialog( + context: context, + barrierColor: Colors.black87, + builder: (context) => Dialog( + backgroundColor: Colors.transparent, + insetPadding: EdgeInsets.zero, + child: GestureDetector( + onTap: () => Navigator.of(context).pop(), + child: InteractiveViewer( + child: Hero( + tag: p.imageUrl, + child: Image.network(p.imageUrl, fit: BoxFit.contain), + ), + ), + ), + ), + ), child: ClipRRect( borderRadius: BorderRadius.circular(8), - child: Image.network( - p.thumbnailUrl ?? p.imageUrl, - fit: BoxFit.cover, - errorBuilder: (_, _, _) => Container( - width: 300, - color: Theme.of(context).colorScheme.surfaceContainerHighest, - child: const Icon(Icons.broken_image_outlined), + child: Hero( + tag: p.imageUrl, + child: Image.network( + p.thumbnailUrl ?? p.imageUrl, + fit: BoxFit.cover, + errorBuilder: (_, _, _) => Container( + width: 300, + color: Theme.of( + context, + ).colorScheme.surfaceContainerHighest, + child: const Icon(Icons.broken_image_outlined), + ), ), ), ), @@ -267,36 +288,6 @@ class _ScreenshotsSection extends StatelessWidget { ), ); } - - void _showFullScreenImage(BuildContext context, String url) { - Navigator.of(context).push( - PageRouteBuilder( - opaque: false, - barrierColor: Colors.black87, - pageBuilder: (_, _, _) => _FullScreenImage(url: url), - ), - ); - } -} - -class _FullScreenImage extends StatelessWidget { - final String url; - const _FullScreenImage({required this.url}); - - @override - Widget build(BuildContext context) { - return Scaffold( - backgroundColor: Colors.transparent, - body: GestureDetector( - onTap: () => Navigator.of(context).pop(), - child: Center( - child: InteractiveViewer( - child: Image.network(url, fit: BoxFit.contain), - ), - ), - ), - ); - } } class _ExpandableDescription extends HookConsumerWidget { @@ -311,8 +302,8 @@ class _ExpandableDescription extends HookConsumerWidget { skipLoadingOnReload: true, data: (markdown) => MarkdownBody( data: markdown.isEmpty ? html : markdown, - onTapLink: (_, href, _) { - if (href != null) launchUrl(Uri.parse(href)); + onTapLink: (_, href, _) async { + if (href != null) await launchUrl(Uri.parse(href)); }, ), loading: () => Text(html), diff --git a/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart b/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart index 57158c31..743a8d55 100644 --- a/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart +++ b/apps/weblibre/lib/features/bangs/domain/providers/bangs.g.dart @@ -80,7 +80,7 @@ final class DefaultSearchBangProvider } } -String _$defaultSearchBangHash() => r'39c5b18231a56763e2c620cae5f2889f7c95f6ee'; +String _$defaultSearchBangHash() => r'2da8ec4ccd0da74a7242a83ef4efe53850293116'; @ProviderFor(bangData) final bangDataProvider = BangDataFamily._(); diff --git a/apps/weblibre/lib/features/web_feed/utils/fetch_entrypoint.dart b/apps/weblibre/lib/features/web_feed/utils/fetch_entrypoint.dart index 061cf525..091ad588 100644 --- a/apps/weblibre/lib/features/web_feed/utils/fetch_entrypoint.dart +++ b/apps/weblibre/lib/features/web_feed/utils/fetch_entrypoint.dart @@ -24,7 +24,7 @@ import 'package:weblibre/core/logger.dart'; import 'package:weblibre/features/web_feed/presentation/controllers/fetch_articles.dart'; @pragma('vm:entry-point') -Future backgroundFetch(HeadlessTask task) async { +Future backgroundFetch(HeadlessEvent task) async { final taskId = task.taskId; final isTimeout = task.timeout;