From 14f64cd2a5b01d016d9c42bec751801cbd1bf0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bot=20of=20Thomas=20G=C3=BCttler?= Date: Wed, 27 May 2026 21:02:30 +0200 Subject: [PATCH] feat: show URL tooltip on long-press of unsubscribe chip (#294) (#295) --- lib/ui/screens/email_detail_screen.dart | 11 ++++--- test/widget/email_detail_screen_test.dart | 38 +++++++++++++++++++++++ test/widget/helpers.dart | 2 ++ 3 files changed, 47 insertions(+), 4 deletions(-) diff --git a/lib/ui/screens/email_detail_screen.dart b/lib/ui/screens/email_detail_screen.dart index 1baeb77..7a8f4a8 100644 --- a/lib/ui/screens/email_detail_screen.dart +++ b/lib/ui/screens/email_detail_screen.dart @@ -938,10 +938,13 @@ class _UnsubscribeChip extends StatelessWidget { Widget build(BuildContext context) { final uri = _parseUnsubscribeUri(header); if (uri == null) return const SizedBox.shrink(); - return ActionChip( - avatar: const Icon(Icons.unsubscribe_outlined, size: 16), - label: const Text('Unsubscribe'), - onPressed: () => launchUrl(uri, mode: LaunchMode.externalApplication), + return Tooltip( + message: uri.toString(), + child: ActionChip( + avatar: const Icon(Icons.unsubscribe_outlined, size: 16), + label: const Text('Unsubscribe'), + onPressed: () => launchUrl(uri, mode: LaunchMode.externalApplication), + ), ); } } diff --git a/test/widget/email_detail_screen_test.dart b/test/widget/email_detail_screen_test.dart index 92b63ad..ec4f96e 100644 --- a/test/widget/email_detail_screen_test.dart +++ b/test/widget/email_detail_screen_test.dart @@ -475,6 +475,44 @@ void main() { expect(find.text('Share'), findsOneWidget); }); + testWidgets( + 'long-press on unsubscribe chip shows URL tooltip', + (tester) async { + final email = testEmail( + listUnsubscribeHeader: '', + ); + await tester.pumpWidget( + buildApp( + initialLocation: + '/accounts/acc-1/mailboxes/INBOX/emails/acc-1%3A42', + overrides: _overrides( + body: const EmailBody(emailId: 'acc-1:42', attachments: []), + email: email, + ), + ), + ); + await tester.pumpAndSettle(); + + expect(find.text('Unsubscribe'), findsOneWidget); + + expect( + find.byWidgetPredicate( + (w) => + w is Tooltip && w.message == 'https://example.com/unsubscribe', + ), + findsOneWidget, + ); + + await tester.longPress(find.text('Unsubscribe')); + await tester.pumpAndSettle(); + + expect( + find.text('https://example.com/unsubscribe'), + findsOneWidget, + ); + }, + ); + testWidgets('Show Mail Structure opens dialog with MIME parts', ( tester, ) async { diff --git a/test/widget/helpers.dart b/test/widget/helpers.dart index d5ff81e..aa96deb 100644 --- a/test/widget/helpers.dart +++ b/test/widget/helpers.dart @@ -588,6 +588,7 @@ Email testEmail({ bool isSeen = false, bool isFlagged = false, bool hasAttachment = false, + String? listUnsubscribeHeader, }) => Email( id: id, @@ -603,6 +604,7 @@ Email testEmail({ isSeen: isSeen, isFlagged: isFlagged, hasAttachment: hasAttachment, + listUnsubscribeHeader: listUnsubscribeHeader, ); class FakeSearchHistoryRepository implements SearchHistoryRepository {