Link Previews

Whenever you type a URL in one of your messages, TalkJS can generate a preview of that URL like so:

The Link Preview not only displays website thumbnails, but it also displays the embedded player for YouTube, Spotify, and so on...

When no link preview is available for a website, then the message is rendered as normal

Of course, if you have chosen to suppress contact information, neither the URL, nor the Link Preview will appear in the message, unless the URL is in the allowed hostnames.

If you haven't customized your theme yet, then Link Previews are automatically enabled for you on User Messages, and not for System Messages.

If you have customized your theme before April of 2022, then you need to add the <LinkPreviews> component in the MessageBody, right after the body.formattedText in the theme editor, like so:

<span t:if="{{ body.type == 'text' }}" class="message-text">
{{ body.formattedText }}
<LinkPreviews links="{{ body.links }}" />
</span>

Now your messages will already have Link Previews, but if the message is short, then the link preview will be too thin, like so:

To fix this, you have to edit the UserMessage in the theme editor, in order to give the has-link-previews class to the message, like so:

<div class="message {{ body.hasThumbnail | then: 'has-thumbnail' }} {{ showAuthor | then: 'has-author' }} {{hasLinkPreviews | then: 'has-link-previews'}}">

And then give a width of 100% to the message that has link previews, in the <style> block of the UserMessage, like so:

.has-link-previews {
width: 100%;
}

This will enable Link Previews for both User Messages and System Messages.

If you want to enable Link Previews for User Messages and not for System Messages instead, you have to render the LinkPreviews component conditionally. In order to do so, edit the UserMessage component in the theme editor, and set the isSystemMessage="{{ false }}" property to MessageBody like so:

<MessageBody body="{{ body }}" timestamp="{{ timestamp }}" floatTimestamp="auto" showStatus="{{ sender.isMe }}"
isLongEmailMessage="{{isLongEmailMessage}}" darkenMenuArea="{{ darkenMenuArea }}" isSystemMessage="{{ false }}" />

Then edit the SystemMessage component, and set the isSystemMessage="{{ true }}" property to MessageBody like so:

<MessageBody body="{{ body }}" timestamp="{{ timestamp }}" floatTimestamp="right" isSystemMessage="{{ true }}" />

Finally, in the MessageBody component, change the LinkPreviews component adding a t:if property like so:

<LinkPreviews links="{{ body.links }}" t:if="{{ isSystemMessage | is_falsy }}" />

If you want more control over how the previews appear and wish to filter out specific previews, you can manually loop over link previews using the <LinkPreview> component.

For instance, if you want to remove previews for links that contain specific blocked words, you can do the following:

<div t:for="{{ link in body.links }}" t:key="link" t:if="{{ isSystemMessage | is_falsy }}">
<t:set linkDoesntContainWord="{{ link contains 'blocked-word' | is_falsy }}" />
<LinkPreview link="{{ link }}" t:if="{{ linkDoesntContainWord == true and forloop.index < 3 }}" />
</div>

If you don't want the Link Previews functionality in your chat application, then simply remove the <LinkPreviews> component in the MessageBody in the theme editor, and you're done.

Note that you don't have to remove neither the has-link-previews class from the UserMessage, nor the isSystemMessage property from the MessageBody and in fact, they would be better left as-is, because if you want to re-enable Link Previews in the future, you will have one less thing to worry about.