From 5311720a7e22261f14906b3195d83f7f51cf2190 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bot=20of=20Thomas=20G=C3=BCttler?= Date: Thu, 14 May 2026 11:26:33 +0200 Subject: [PATCH] fix: open HTML email links in external browser (S4) (#50) --- lib/ui/screens/email_detail_screen.dart | 14 +++++++++++++- lib/ui/screens/thread_detail_screen.dart | 13 +++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/lib/ui/screens/email_detail_screen.dart b/lib/ui/screens/email_detail_screen.dart index 861ac21..7654c9e 100644 --- a/lib/ui/screens/email_detail_screen.dart +++ b/lib/ui/screens/email_detail_screen.dart @@ -18,6 +18,14 @@ import 'package:url_launcher/url_launcher.dart'; final _dateFmt = DateFormat('EEE, MMM d yyyy, HH:mm'); +void _openLink(String? url, Map attrs, dynamic _) { + if (url == null) return; + final uri = Uri.tryParse(url); + if (uri != null) { + unawaited(launchUrl(uri, mode: LaunchMode.externalApplication)); + } +} + class EmailDetailScreen extends ConsumerStatefulWidget { const EmailDetailScreen({super.key, required this.emailId}); final String emailId; @@ -553,7 +561,11 @@ class _SafeHtmlState extends State<_SafeHtml> { (_) => ErrorWidget.builder = prev, ); - return Html(data: widget.data, extensions: widget.extensions); + return Html( + data: widget.data, + extensions: widget.extensions, + onLinkTap: _openLink, + ); } } diff --git a/lib/ui/screens/thread_detail_screen.dart b/lib/ui/screens/thread_detail_screen.dart index 7872653..8977d9c 100644 --- a/lib/ui/screens/thread_detail_screen.dart +++ b/lib/ui/screens/thread_detail_screen.dart @@ -10,6 +10,7 @@ import 'package:sharedinbox/core/models/email.dart'; import 'package:sharedinbox/core/models/undo_action.dart'; import 'package:sharedinbox/core/utils/html_utils.dart'; import 'package:sharedinbox/di.dart'; +import 'package:url_launcher/url_launcher.dart'; final _dateFmt = DateFormat('EEE, MMM d, HH:mm'); @@ -168,6 +169,18 @@ class _EmailMessageCardState extends ConsumerState<_EmailMessageCard> { extensions: [ if (!_loadRemoteImages) _BlockRemoteImagesExtension(), ], + onLinkTap: (url, _, __) { + if (url == null) return; + final uri = Uri.tryParse(url); + if (uri != null) { + unawaited( + launchUrl( + uri, + mode: LaunchMode.externalApplication, + ), + ); + } + }, ), ] else SelectableText(