comment.tsx
TLDR
This file, comment.tsx
, is a React component that renders a comment with user information and options. It takes in a comment
object, userId
, userImageUrl
, and readonly
flag as props and displays the comment's author, avatar, username, creation date, and text content. Users with write access can see additional options like deleting the comment.
Methods
No methods in this file.
Classes
No classes in this file.
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {FC} from 'react'
import {useIntl} from 'react-intl'
import {Block} from '../../blocks/block'
import mutator from '../../mutator'
import {Utils} from '../../utils'
import IconButton from '../../widgets/buttons/iconButton'
import DeleteIcon from '../../widgets/icons/delete'
import OptionsIcon from '../../widgets/icons/options'
import Menu from '../../widgets/menu'
import MenuWrapper from '../../widgets/menuWrapper'
import {getUser} from '../../store/users'
import {useAppSelector} from '../../store/hooks'
import Tooltip from '../../widgets/tooltip'
import GuestBadge from '../../widgets/guestBadge'
import './comment.scss'
type Props = {
comment: Block
userId: string
userImageUrl: string
readonly: boolean
}
const Comment: FC<Props> = (props: Props) => {
const {comment, userId, userImageUrl} = props
const intl = useIntl()
const html = Utils.htmlFromMarkdown(comment.title)
const user = useAppSelector(getUser(userId))
const date = new Date(comment.createAt)
return (
<div
key={comment.id}
className='Comment comment'
>
<div className='comment-header'>
<img
className='comment-avatar'
src={userImageUrl}
/>
<div className='comment-username'>{user?.username}</div>
<GuestBadge show={user?.is_guest}/>
<Tooltip title={Utils.displayDateTime(date, intl)}>
<div className='comment-date'>
{Utils.relativeDisplayDateTime(date, intl)}
</div>
</Tooltip>
{!props.readonly && (
<MenuWrapper>
<IconButton icon={<OptionsIcon/>}/>
<Menu position='left'>
<Menu.Text
icon={<DeleteIcon/>}
id='delete'
name={intl.formatMessage({id: 'Comment.delete', defaultMessage: 'Delete'})}
onClick={() => mutator.deleteBlock(comment)}
/>
</Menu>
</MenuWrapper>
)}
</div>
<div
className='comment-text'
dangerouslySetInnerHTML={{__html: html}}
/>
</div>
)
}
export default Comment