diff --git a/packages/stream_chat_flutter/lib/src/attachment/attachment_title.dart b/packages/stream_chat_flutter/lib/src/attachment/attachment_title.dart index a7d4d2e3..df134250 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/attachment_title.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/attachment_title.dart @@ -19,42 +19,36 @@ class AttachmentTitle extends StatelessWidget { final Attachment attachment; @override - Widget build(BuildContext context) => GestureDetector( - onTap: () { - if (attachment.titleLink != null) { - launchURL(context, attachment.titleLink); - } - }, - child: Padding( - padding: const EdgeInsets.all(8), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - if (attachment.title != null) - Text( - attachment.title!, - overflow: TextOverflow.ellipsis, - style: messageTheme.messageTextStyle?.copyWith( - color: StreamChatTheme.of(context).colorTheme.accentPrimary, - fontWeight: FontWeight.bold, - ), + Widget build(BuildContext context) { + final normalizedTitleLink = attachment.titleLink?.replaceFirst( + RegExp(r'https?://(www\.)?'), + '', + ); + return GestureDetector( + onTap: () { + final titleLink = attachment.titleLink; + if (titleLink != null) launchURL(context, titleLink); + }, + child: Padding( + padding: const EdgeInsets.all(8), + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + if (attachment.title != null) + Text( + attachment.title!, + overflow: TextOverflow.ellipsis, + style: messageTheme.messageTextStyle?.copyWith( + color: StreamChatTheme.of(context).colorTheme.accentPrimary, + fontWeight: FontWeight.bold, ), - if (attachment.titleLink != null || - attachment.ogScrapeUrl != null) - Text( - Uri.parse(attachment.titleLink ?? attachment.ogScrapeUrl!) - .authority - .split('.') - .reversed - .take(2) - .toList() - .reversed - .join('.'), - style: messageTheme.messageTextStyle, - ), - ], - ), + ), + if (normalizedTitleLink != null) + Text(normalizedTitleLink, style: messageTheme.messageTextStyle), + ], ), - ); + ), + ); + } } diff --git a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart index f57e1ee6..6045539f 100644 --- a/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/attachment/file_attachment.dart @@ -258,7 +258,8 @@ class FileAttachment extends AttachmentWidget { visualDensity: VisualDensity.compact, splashRadius: 16, onPressed: () { - launchURL(context, attachment.assetUrl); + final assetUrl = attachment.assetUrl; + if (assetUrl != null) launchURL(context, assetUrl); }, ); } diff --git a/packages/stream_chat_flutter/lib/src/message_input.dart b/packages/stream_chat_flutter/lib/src/message_input.dart index 9646608c..f5f51b46 100644 --- a/packages/stream_chat_flutter/lib/src/message_input.dart +++ b/packages/stream_chat_flutter/lib/src/message_input.dart @@ -1575,7 +1575,7 @@ class MessageInputState extends State { Widget _buildReplyToMessage() { if (!_hasQuotedMessage) return const Offstage(); final containsUrl = widget.quotedMessage!.attachments - .any((element) => element.ogScrapeUrl != null) == + .any((element) => element.titleLink != null) == true; return QuotedMessageWidget( reverse: true, diff --git a/packages/stream_chat_flutter/lib/src/message_list_view.dart b/packages/stream_chat_flutter/lib/src/message_list_view.dart index ab4ae04f..e325598d 100644 --- a/packages/stream_chat_flutter/lib/src/message_list_view.dart +++ b/packages/stream_chat_flutter/lib/src/message_list_view.dart @@ -991,7 +991,7 @@ class _MessageListViewState extends State { final isOnlyEmoji = message.text?.isOnlyEmoji ?? false; final hasUrlAttachment = - message.attachments.any((it) => it.ogScrapeUrl != null) == true; + message.attachments.any((it) => it.titleLink != null) == true; final borderSide = isOnlyEmoji || hasUrlAttachment || (isMyMessage && !hasFileAttachment) diff --git a/packages/stream_chat_flutter/lib/src/message_widget.dart b/packages/stream_chat_flutter/lib/src/message_widget.dart index 7619f21b..e60353ad 100644 --- a/packages/stream_chat_flutter/lib/src/message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/message_widget.dart @@ -566,12 +566,11 @@ class _MessageWidgetState extends State bool get isOnlyEmoji => widget.message.text?.isOnlyEmoji == true; - bool get hasNonUrlAttachments => widget.message.attachments - .where((it) => it.ogScrapeUrl == null) - .isNotEmpty; + bool get hasNonUrlAttachments => + widget.message.attachments.where((it) => it.titleLink == null).isNotEmpty; bool get hasUrlAttachments => - widget.message.attachments.any((it) => it.ogScrapeUrl != null) == true; + widget.message.attachments.any((it) => it.titleLink != null) == true; bool get showBottomRow => showThreadReplyIndicator || @@ -975,9 +974,9 @@ class _MessageWidgetState extends State Widget _buildUrlAttachment() { final urlAttachment = widget.message.attachments - .firstWhere((element) => element.ogScrapeUrl != null); + .firstWhere((element) => element.titleLink != null); - final host = Uri.parse(urlAttachment.ogScrapeUrl!).host; + final host = Uri.parse(urlAttachment.titleLink!).host; final splitList = host.split('.'); final hostName = splitList.length == 3 ? splitList[1] : splitList[0]; final hostDisplayName = urlAttachment.authorName?.capitalize() ?? @@ -1143,7 +1142,7 @@ class _MessageWidgetState extends State final attachmentGroups = >{}; widget.message.attachments - .where((element) => element.ogScrapeUrl == null && element.type != null) + .where((element) => element.titleLink == null && element.type != null) .forEach((e) { if (attachmentGroups[e.type] == null) { attachmentGroups[e.type!] = []; diff --git a/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart b/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart index ad3d936a..01068abd 100644 --- a/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart +++ b/packages/stream_chat_flutter/lib/src/quoted_message_widget.dart @@ -97,8 +97,8 @@ class QuotedMessageWidget extends StatelessWidget { bool get _hasAttachments => message.attachments.isNotEmpty == true; - bool get _containsScrapeUrl => - message.attachments.any((element) => element.ogScrapeUrl != null) == true; + bool get _containsLinkAttachment => + message.attachments.any((element) => element.titleLink != null) == true; bool get _containsText => message.text?.isNotEmpty == true; @@ -198,9 +198,9 @@ class QuotedMessageWidget extends StatelessWidget { Widget _parseAttachments(BuildContext context) { Widget child; Attachment attachment; - if (_containsScrapeUrl) { + if (_containsLinkAttachment) { attachment = message.attachments.firstWhere( - (element) => element.ogScrapeUrl != null, + (element) => element.titleLink != null, ); child = _buildUrlAttachment(attachment); } else { @@ -280,7 +280,7 @@ class QuotedMessageWidget extends StatelessWidget { }; Color? _getBackgroundColor(BuildContext context) { - if (_containsScrapeUrl) { + if (_containsLinkAttachment) { return StreamChatTheme.of(context).colorTheme.linkBg; } return messageTheme.messageBackgroundColor; diff --git a/packages/stream_chat_flutter/lib/src/url_attachment.dart b/packages/stream_chat_flutter/lib/src/url_attachment.dart index 5d5ca489..b940f227 100644 --- a/packages/stream_chat_flutter/lib/src/url_attachment.dart +++ b/packages/stream_chat_flutter/lib/src/url_attachment.dart @@ -30,10 +30,8 @@ class UrlAttachment extends StatelessWidget { final chatThemeData = StreamChatTheme.of(context); return GestureDetector( onTap: () { - launchURL( - context, - urlAttachment.ogScrapeUrl, - ); + final titleLink = urlAttachment.titleLink; + if (titleLink != null) launchURL(context, titleLink); }, child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, diff --git a/packages/stream_chat_flutter/lib/src/utils.dart b/packages/stream_chat_flutter/lib/src/utils.dart index d97ea6a1..4dc9fee7 100644 --- a/packages/stream_chat_flutter/lib/src/utils.dart +++ b/packages/stream_chat_flutter/lib/src/utils.dart @@ -7,8 +7,8 @@ import 'package:url_launcher/url_launcher.dart'; import 'package:stream_chat_flutter/src/extension.dart'; /// Launch URL -Future launchURL(BuildContext context, String? url) async { - if (url != null && await canLaunch(url)) { +Future launchURL(BuildContext context, String url) async { + if (await canLaunch(url)) { await launch(url); } else { ScaffoldMessenger.of(context).showSnackBar(