diff options
Diffstat (limited to 'src/components/Comment/Comment.tsx')
| -rw-r--r-- | src/components/Comment/Comment.tsx | 88 | 
1 files changed, 88 insertions, 0 deletions
| diff --git a/src/components/Comment/Comment.tsx b/src/components/Comment/Comment.tsx new file mode 100644 index 0000000..ad6875c --- /dev/null +++ b/src/components/Comment/Comment.tsx @@ -0,0 +1,88 @@ +import { Button } from '@components/Buttons'; +import { t } from '@lingui/macro'; +import { Comment as CommentData } from '@ts/types/comments'; +import Image from 'next/image'; +import Link from 'next/link'; +import { useRouter } from 'next/router'; +import styles from './Comment.module.scss'; + +const Comment = ({ comment }: { comment: CommentData }) => { +  const router = useRouter(); + +  const getCommentAuthor = () => { +    return comment.author.url ? ( +      <Link href={comment.author.url}> +        <a>{comment.author.name}</a> +      </Link> +    ) : ( +      <span>{comment.author.name}</span> +    ); +  }; + +  const getLocaleDate = () => { +    const commentDate = new Date(comment.date); +    const date = commentDate.toLocaleDateString(router.locale, { +      year: 'numeric', +      month: 'long', +      day: 'numeric', +    }); +    const time = commentDate +      .toLocaleTimeString(router.locale, { +        hour: 'numeric', +        minute: 'numeric', +      }) +      .replace(':', 'h'); +    return t`${date} at ${time}`; +  }; + +  const getApprovedComment = () => { +    return ( +      <> +        <article className={styles.wrapper}> +          <header className={styles.header}> +            {comment.author.gravatarUrl && ( +              <div className={styles.avatar}> +                <Image +                  src={comment.author.gravatarUrl} +                  alt={comment.author.name} +                  layout="fill" +                /> +              </div> +            )} +            {getCommentAuthor()} +          </header> +          <dl className={styles.date}> +            <dt>{t`Published on:`}</dt> +            <dd>{getLocaleDate()}</dd> +          </dl> +          <div +            className={styles.body} +            dangerouslySetInnerHTML={{ __html: comment.content }} +          ></div> +          <footer className={styles.footer}> +            <Button clickHandler={() => ''}>{t`Reply`}</Button> +          </footer> +        </article> +        {comment.replies.length > 0 && ( +          <ol className={styles.list}> +            {comment.replies.map((reply) => { +              return <Comment key={reply.id} comment={reply} />; +            })} +          </ol> +        )} +      </> +    ); +  }; + +  const getCommentStatus = () => { +    return <p>{t`This comment is awaiting moderation.`}</p>; +  }; + +  return ( +    <li className={styles.item}> +      {comment.approved ? getApprovedComment() : getCommentStatus()} +    </li> +  ); +}; + +export default Comment; | 
