### Plain messages Note that timestamp and status can be hidden with the `collapseMetadata` boolean property. ```jsx
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
console.log('onDownload')} onReply={() => console.log('onReply')} onShowDetail={() => console.log('onShowDetail')} onDelete={() => console.log('onDelete')} />
``` ### Status ```jsx
console.log('onRetrySend')} />
console.log('onRetrySend')} />
console.log('onRetrySend')} />
console.log('onRetrySend')} />
console.log('onRetrySend')} />
``` ### All colors ```jsx
``` ### Reactions ```jsx {[ { reactions: [{ emoji: '👍', from: { id: '+14155552671' } }] }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Jack Sparrow' } }, { emoji: '😂', from: { id: '+14155552672', profileName: 'Davy Jones' }, }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Jack Sparrow' } }, { emoji: '😂', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '😮', from: { id: '+14155552673', profileName: 'Joel Ferrari' }, }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Jack Sparrow' } }, { emoji: '😂', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '😮', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552676', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552678', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😮', from: { id: '+14155552677', name: 'Amelia Briggs' } }, { emoji: '😮', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '😮', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { short: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552677', name: 'Amelia Briggs' } }, ], }, { short: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, ], }, { short: true, reactions: [], }, { reactions: [ { emoji: '👍', from: { isMe: true, id: '+14155552671', name: 'Amelia Briggs' }, }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552677', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { isMe: true, id: '+14155552674', name: 'Amelia Briggs' }, }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552677', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😡', from: { isMe: true, id: '+14155552677', name: 'Amelia Briggs' }, }, { emoji: '👎', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { outgoing: true, reactions: [ { emoji: '😂', from: { id: '+14155552671', name: 'Amelia Briggs' } }, ], }, { outgoing: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552677', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { outgoing: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { isMe: true, id: '+14155552674', name: 'Amelia Briggs' }, }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552677', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { outgoing: true, short: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, { emoji: '😡', from: { id: '+14155552677', name: 'Amelia Briggs' } }, { emoji: '👎', from: { id: '+14155552678', name: 'Amelia Briggs' } }, { emoji: '❤️', from: { id: '+14155552679', name: 'Amelia Briggs' } }, ], }, { outgoing: true, short: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552674', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552675', name: 'Amelia Briggs' } }, { emoji: '😂', from: { id: '+14155552676', name: 'Amelia Briggs' } }, ], }, { outgoing: true, short: true, reactions: [ { emoji: '👍', from: { id: '+14155552671', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552672', name: 'Amelia Briggs' } }, { emoji: '👍', from: { id: '+14155552673', name: 'Amelia Briggs' } }, ], }, ].map((spec, i) => (
))}
``` ### Long data ```jsx
``` ### Pending long message download ```jsx
``` ### With an attachment #### Image with caption ```jsx
console.log('showVisualAttachment')} onDownload={() => console.log('onDownload')} onReply={() => console.log('onReply')} />
console.log('showVisualAttachment')} onDownload={() => console.log('onDownload')} onReply={() => console.log('onReply')} />
console.log('showVisualAttachment')} onDownload={() => console.log('onDownload')} onReply={() => console.log('onReply')} />
console.log('showVisualAttachment')} onDownload={() => console.log('onDownload')} onReply={() => console.log('onReply')} />
``` #### Image First, showing the metadata overlay on dark and light images, then a message with `collapseMetadata` set. ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Sticker Stickers have no background, but they have all the standard message bubble features. ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Sticker with collapsed metadata First set is in a 1:1 conversation, second set is in a group. ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Sticker with non-square aspect ratio First set is in a 1:1 conversation, second set is in a group. ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Sticker with pending image A sticker with no attachments (what our selectors produce for a pending sticker) is not displayed at all. ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Multiple images ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Multiple images with caption ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Outgoing image with status Note that the delivered indicator is always Signal Blue, not the conversation color. ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Pending images ```
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Image with portrait aspect ratio ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Image with portrait aspect ratio and caption ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} expirationLength={5 * 60 * 1000} expirationTimestamp={Date.now() + 5 * 60 * 1000} />
console.log('showVisualAttachment')} expirationLength={5 * 60 * 1000} expirationTimestamp={Date.now() + 5 * 60 * 1000} />
``` #### Image with landscape aspect ratio ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Image with landscape aspect ratio and caption ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Video with caption ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Video ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Missing images and videos ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Broken source URL images and videos ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Image/video which is too big ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Image/video missing height/width ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Audio with caption ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Audio ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Voice message Voice notes are not shown any differently from audio attachments. #### Other file type with caption ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Other file type ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Other file type pending ```jsx
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
console.log('showVisualAttachment')} />
``` #### Dangerous file type ```jsx
console.log('showVisualAttachment - isDangerous:', isDangerous) } />
console.log('showVisualAttachment - isDangerous:', isDangerous) } />
``` #### Link previews, full-size image ```jsx
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
console.log('onClick'), }} text="Pretty sweet link: https://instagram.com/something" previews={[ { title: 'This is a really sweet post', domain: 'instagram.com', image: { url: util.pngObjectUrl, contentType: 'image/png', width: 800, height: 1200, }, }, ]} onClickLinkPreview={url => console.log('onClickLinkPreview', url)} />
console.log('onClick'), }} text="Pretty sweet link: https://instagram.com/something" previews={[ { title: 'This is a really sweet post', domain: 'instagram.com', image: { url: util.pngObjectUrl, contentType: 'image/png', width: 800, height: 1200, }, }, ]} onClickLinkPreview={url => console.log('onClickLinkPreview', url)} />
``` #### Link previews, stickers url Sticker link previews are forced to use the small link preview form, no matter the image size. ```jsx
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
``` #### Link previews, small image ```jsx
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
console.log('onClick'), }} text="Pretty sweet link: https://instagram.com/something" previews={[ { title: 'This is a really sweet post with a really long name. Gotta restrict that to just two lines, you know how that goes...', domain: 'instagram.com', image: { url: util.pngObjectUrl, contentType: 'image/png', width: 160, height: 120, }, }, ]} onClickLinkPreview={url => console.log('onClickLinkPreview', url)} />
console.log('onClick'), }} text="Pretty sweet link: https://instagram.com/something" previews={[ { title: 'This is a really sweet post with a really long name. Gotta restrict that to just two lines, you know how that goes...', domain: 'instagram.com', image: { url: util.pngObjectUrl, contentType: 'image/png', width: 160, height: 120, }, }, ]} onClickLinkPreview={url => console.log('onClickLinkPreview', url)} />
``` #### Link previews with pending image ```jsx
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
``` #### Link previews, no image ```jsx
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
console.log('onClick'), }} text="Pretty sweet link: https://instagram.com/something" previews={[ { title: 'This is a really sweet post with a really long name. Gotta restrict that to just two lines, you know how that goes...', domain: 'instagram.com', }, ]} onClickLinkPreview={url => console.log('onClickLinkPreview', url)} />
console.log('onClick'), }} text="Pretty sweet link: https://instagram.com/something" previews={[ { title: 'This is a really sweet post with a really long name. Gotta restrict that to just two lines, you know how that goes...', domain: 'instagram.com', }, ]} onClickLinkPreview={url => console.log('onClickLinkPreview', url)} />
``` ### Tap to view ```jsx
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } />
console.log('displayTapToViewMessage', args) } />
console.log('displayTapToViewMessage', args) } />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
console.log('displayTapToViewMessage', args) } authorAvatarPath={util.gifObjectUrl} />
``` ### In a group conversation Note that the author avatar goes away if `collapseMetadata` is set. ```jsx
console.log('showVisualAttachment')} authorAvatarPath={util.gifObjectUrl} />
console.log('showVisualAttachment')} authorAvatarPath={util.gifObjectUrl} />
console.log('showVisualAttachment')} authorAvatarPath={util.gifObjectUrl} />
console.log('showVisualAttachment')} />
console.log('onClickLinkPreview', url)} />
console.log('onClickLinkPreview', url)} />
```