From 1d05300f17bc4089aac2e3612e1364146e9c4e4b Mon Sep 17 00:00:00 2001 From: Patrick Britton Date: Sun, 8 Feb 2026 14:53:46 -0600 Subject: [PATCH] feat: show link URL below post body for news stories --- sojorn_app/lib/widgets/sojorn_post_card.dart | 39 ++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/sojorn_app/lib/widgets/sojorn_post_card.dart b/sojorn_app/lib/widgets/sojorn_post_card.dart index 2d96aa5..b92e908 100644 --- a/sojorn_app/lib/widgets/sojorn_post_card.dart +++ b/sojorn_app/lib/widgets/sojorn_post_card.dart @@ -2,6 +2,7 @@ import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:google_fonts/google_fonts.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../models/post.dart'; import '../providers/settings_provider.dart'; @@ -264,6 +265,23 @@ class _sojornPostCardState extends ConsumerState { ), ), ], + // Show link URL below post body for posts with link previews + if (post.hasLinkPreview && post.linkPreviewUrl != null) ...[ + const SizedBox(height: 6), + GestureDetector( + onTap: () => _launchPreviewUrl(post.linkPreviewUrl!), + child: Text( + _truncateUrl(post.linkPreviewUrl!), + style: TextStyle( + color: AppTheme.royalPurple, + fontSize: 13, + fontWeight: FontWeight.w500, + decoration: TextDecoration.underline, + decorationColor: AppTheme.royalPurple.withValues(alpha: 0.5), + ), + ), + ), + ], ], ), ), @@ -381,6 +399,27 @@ class _sojornPostCardState extends ConsumerState { ), ); } + + String _truncateUrl(String url) { + if (url.length <= 45) return url; + try { + final uri = Uri.parse(url); + final path = uri.path; + if (path.length > 15) { + return '${uri.scheme}://${uri.host}${path.substring(0, 12)}...'; + } + return '${uri.scheme}://${uri.host}$path'; + } catch (_) { + return '${url.substring(0, 42)}...'; + } + } + + void _launchPreviewUrl(String url) { + final uri = Uri.tryParse(url); + if (uri != null) { + launchUrl(uri, mode: LaunchMode.externalApplication); + } + } } /// Subtle single-line "replying to" hint shown on feed cards that are chains.