build method

  1. @override
Widget build(
  1. BuildContext context,
  2. Message message,
  3. Map<String, List<Attachment>> attachments
)
override

Builds a widget for the given message and attachments. This will only be called if canHandle returns true.

Implementation

@override
Widget build(
  BuildContext context,
  Message message,
  Map<String, List<Attachment>> attachments,
) {
  assert(debugAssertCanHandle(message, attachments), '');

  final urlPreviews = attachments[AttachmentType.urlPreview]!;

  final client = StreamChat.of(context).client;
  final isMyMessage = message.user?.id == client.state.currentUser?.id;

  final streamChatTheme = StreamChatTheme.of(context);
  final messageTheme = isMyMessage
      ? streamChatTheme.ownMessageTheme
      : streamChatTheme.otherMessageTheme;

  Widget _buildUrlPreview(Attachment urlPreview) {
    VoidCallback? onTap;
    if (onAttachmentTap != null) {
      onTap = () => onAttachmentTap!(message, urlPreview);
    }

    final host = Uri.parse(urlPreview.titleLink!).host;
    final splitList = host.split('.');
    final hostName = splitList.length == 3 ? splitList[1] : splitList[0];
    final hostDisplayName = urlPreview.authorName?.capitalize() ??
        getWebsiteName(hostName.toLowerCase()) ??
        hostName.capitalize();

    return InkWell(
      onTap: onTap,
      child: StreamUrlAttachment(
        message: message,
        urlAttachment: urlPreview,
        hostDisplayName: hostDisplayName,
        messageTheme: messageTheme,
        constraints: constraints,
        shape: shape,
      ),
    );
  }

  Widget child;
  if (urlPreviews.length == 1) {
    child = _buildUrlPreview(urlPreviews.first);
  } else {
    child = Column(
      children: <Widget>[
        for (final urlPreview in urlPreviews) _buildUrlPreview(urlPreview),
      ].insertBetween(
        // Add a small vertical padding between each attachment.
        SizedBox(height: padding.vertical / 2),
      ),
    );
  }

  return Padding(
    padding: padding,
    child: child,
  );
}