From abf6e96383035f99addab804e8c3dd1a74d36375 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Fri, 17 Dec 2021 17:58:03 +0100
Subject: chore: display comments list on posts

---
 src/components/Comment/Comment.tsx | 88 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 88 insertions(+)
 create mode 100644 src/components/Comment/Comment.tsx

(limited to 'src/components/Comment/Comment.tsx')

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;
-- 
cgit v1.2.3

