From a52dd5d7acd06d92e27c8a96fe010963ec5b8275 Mon Sep 17 00:00:00 2001
From: Armand Philippot <git@armandphilippot.com>
Date: Tue, 21 Dec 2021 16:42:56 +0100
Subject: chore: add a sharing component

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

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

diff --git a/src/components/Sharing/Sharing.tsx b/src/components/Sharing/Sharing.tsx
new file mode 100644
index 0000000..9f8383b
--- /dev/null
+++ b/src/components/Sharing/Sharing.tsx
@@ -0,0 +1,106 @@
+import sharingMedia from '@config/sharing';
+import { t } from '@lingui/macro';
+import { useRouter } from 'next/router';
+import { useEffect, useState } from 'react';
+import styles from './Sharing.module.scss';
+
+type Parameters = {
+  content: string;
+  image: string;
+  title: string;
+  url: string;
+};
+
+type Website = {
+  id: string;
+  name: string;
+  parameters: Parameters;
+  url: string;
+};
+
+const Sharing = ({ excerpt, title }: { excerpt: string; title: string }) => {
+  const [pageExcerpt, setPageExcerpt] = useState('');
+  const [pageUrl, setPageUrl] = useState('');
+  const router = useRouter();
+
+  useEffect(() => {
+    const divEl = document.createElement('div');
+    divEl.innerHTML = excerpt;
+    const cleanExcerpt = divEl.textContent!;
+    setPageExcerpt(cleanExcerpt);
+  }, [excerpt]);
+
+  useEffect(() => {
+    const { protocol, hostname, port } = window.location;
+    const fullUrl = `${protocol}//${hostname}${port ? `:${port}` : ''}${
+      router.asPath
+    }`;
+
+    setPageUrl(fullUrl);
+  }, [router.asPath]);
+
+  const getSharingUrl = (website: Website): string => {
+    const { id, parameters, url } = website;
+    let sharingUrl = `${url}?`;
+    let count = 0;
+
+    for (const [key, value] of Object.entries(parameters)) {
+      if (!value) continue;
+
+      sharingUrl += count > 0 ? `&${value}=` : `${value}=`;
+
+      switch (key) {
+        case 'content':
+          if (id === 'email') {
+            const body = `${t`Introduction:`}\n\n"${pageExcerpt}"\n\n${t`Read more here:`} ${pageUrl}`;
+            sharingUrl += encodeURI(body);
+          } else {
+            sharingUrl += encodeURI(pageExcerpt);
+          }
+          break;
+        case 'title':
+          const prefix =
+            id === 'email' ? t`Seen on ${window.location.hostname}:` : '';
+          sharingUrl += encodeURI(`${prefix} ${title}`);
+          break;
+        case 'url':
+          sharingUrl += encodeURI(pageUrl);
+        default:
+          break;
+      }
+
+      count++;
+    }
+
+    return sharingUrl;
+  };
+
+  const getItems = () => {
+    const websites: Website[] = sharingMedia;
+
+    return websites.map((website) => {
+      const { id, name } = website;
+      const sharingUrl = getSharingUrl(website);
+
+      return (
+        <li key={id}>
+          <a
+            href={sharingUrl}
+            className={`${styles.link} ${styles[`link--${id}`]}`}
+          >
+            {name}
+          </a>
+        </li>
+      );
+    });
+  };
+
+  return (
+    <div>
+      <h2>{t`Share`}</h2>
+      <ul className={styles.list}>{getItems()}</ul>
+    </div>
+  );
+};
+
+export default Sharing;
-- 
cgit v1.2.3

