aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/Widget/Sharing/Sharing.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/Widget/Sharing/Sharing.tsx')
-rw-r--r--src/components/Widget/Sharing/Sharing.tsx111
1 files changed, 111 insertions, 0 deletions
diff --git a/src/components/Widget/Sharing/Sharing.tsx b/src/components/Widget/Sharing/Sharing.tsx
new file mode 100644
index 0000000..4df8e0d
--- /dev/null
+++ b/src/components/Widget/Sharing/Sharing.tsx
@@ -0,0 +1,111 @@
+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 [domainName, setDomainName] = 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 currentPort = port ? `:${port}` : '';
+ const fullUrl = `${protocol}//${hostname}${currentPort}${router.asPath}`;
+
+ setDomainName(hostname);
+ 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 intro = t`Introduction:`;
+ const readMore = t`Read more here:`;
+ const body = `${intro}\n\n"${pageExcerpt}"\n\n${readMore} ${pageUrl}`;
+ sharingUrl += encodeURI(body);
+ } else {
+ sharingUrl += encodeURI(pageExcerpt);
+ }
+ break;
+ case 'title':
+ const prefix = id === 'email' ? t`Seen on ${domainName}:` : '';
+ sharingUrl += encodeURI(`${prefix} ${title}`);
+ break;
+ case 'url':
+ sharingUrl += encodeURI(pageUrl);
+ break;
+ default:
+ break;
+ }
+
+ count++;
+ }
+
+ return sharingUrl;
+ };
+
+ const getItems = () => {
+ const websites: Website[] = sharingMedia;
+
+ return websites.map((website) => {
+ const { id, name } = website;
+ const sharingUrl = getSharingUrl(website);
+ const linkModifier = `link--${id}`;
+
+ return (
+ <li key={id}>
+ <a
+ href={sharingUrl}
+ title={name}
+ className={`${styles.link} ${styles[linkModifier]}`}
+ >
+ <span className="screen-reader-text">{name}</span>
+ </a>
+ </li>
+ );
+ });
+ };
+
+ return (
+ <div className={styles.wrapper}>
+ <h2>{t`Share`}</h2>
+ <ul className={styles.list}>{getItems()}</ul>
+ </div>
+ );
+};
+
+export default Sharing;