OurBigBook
web/front/Comment.tsx
import React from 'react'
import { useRouter } from 'next/router'

import { TimeIcon } from 'front'
import Maybe from 'front/Maybe'
import { webApi } from 'front/api'
import config from 'front/config'
import CustomLink from 'front/CustomLink'
import { cant } from 'front/cant'
import { formatDate } from 'front/date'
import UserLinkWithImage from 'front/UserLinkWithImage'

const Comment = ({ comment, comments, id, loggedInUser, setComments }) => {
  const router = useRouter();
  const {
    query: { number: issueNumber, slug },
  } = router;
  const handleDelete = async (commentId) => {
    await webApi.commentDelete((slug as string[]).join('/'), issueNumber, comment.number)
    setComments(comments => comments.filter(comment => comment.id !== id))
  };
  const targetId = `${config.commentIdPrefix}${comment.number}`
  return (
    <div className="comment" id={targetId}>
      <div className="comment-header">
        <CustomLink className="number" href={`#${targetId}`}>#{comment.number}</CustomLink>
        {' by '}
        <UserLinkWithImage user={comment.author} showUsernameMobile={false} />
        {' on '}
        <TimeIcon />
        {' '}
        {formatDate(comment.createdAt)}
        {' '}
        <Maybe test={!cant.deleteComment(loggedInUser, comment)}>
          <button
            className="btn"
            onClick={() => handleDelete(comment.id)}
          >
            <i className="ion-trash-a" /> Delete Comment
          </button>
        </Maybe>
      </div>
      <div
        className="comment-body ourbigbook"
        dangerouslySetInnerHTML={{ __html: comment.render }}
      />
    </div>
  );
};

export default Comment;