diff --git a/auspice-client/customisations/config.json b/auspice-client/customisations/config.json index a276fecf0..5a33b21e1 100644 --- a/auspice-client/customisations/config.json +++ b/auspice-client/customisations/config.json @@ -10,6 +10,7 @@ }, "navbarComponent": "navbar.js", "splashComponent": "splash.js", + "socialComponent": "social.js", "browserTitle": "Nextstrain", "googleAnalyticsKey": "UA-92687617-1" } diff --git a/auspice-client/customisations/social.js b/auspice-client/customisations/social.js new file mode 100644 index 000000000..bdb7a5acf --- /dev/null +++ b/auspice-client/customisations/social.js @@ -0,0 +1,83 @@ +import React from 'react'; // eslint-disable-line +import { Helmet } from "react-helmet"; // eslint-disable-line +import ncovCards from "../../static-site/src/components/Cards/nCoVCards"; +import communityCards from "../../static-site/src/components/Cards/communityCards"; +import coreCards from "../../static-site/src/components/Cards/coreCards"; +import narrativeCards from "../../static-site/src/components/Cards/narrativeCards"; +import config from "../../static-site/data/SiteConfig"; + +const siteImage = config.siteLogo; +const allCards = [ncovCards, communityCards, coreCards, narrativeCards]; +const imageList = generateImageLookup(allCards, siteImage); + +/* This function creates a list that pairs path regexes to their splash images. */ +// Example output: +// [ +// [/^\/zika.*/, "/splash_images/zika.png"], +// [/^\/WNV.*/, "/splash_images/wnv.jpg"], +// [/.*/, "/logos/nextstrain-logo-small.png"] +// ] +function generateImageLookup(cards, defaultImage) { + let imageLookup = [].concat(...cards); + // Sort reverse alphabetically so that e.g. "/ncov/foo" precedes "/ncov" + imageLookup.sort((a, b) => b.url.localeCompare(a.url)); + // Extract path and image from each card, making the path into a valid regex + imageLookup = imageLookup.map((el) => { + const escapedUrl = escapeRegExp(el.url); + const regexString = `^${escapedUrl}.*`; + const regex = new RegExp(regexString); + return [regex, `/splash_images/${el.img}`]; + }); + // Append the catch-all default image + imageLookup.push([new RegExp(".*"), defaultImage]); + return imageLookup; +} + +/* Escapes any regex special characters from a string +https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions */ +function escapeRegExp(string) { + return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); +} + +/* Iterates through the paths and returns the associated image +path if the regex matches the current window path. This will +return the default siteImage if no path is matched. */ +function getSocialImage(windowPath, imageLookup=imageList, defaultImage=siteImage) { + for (const [regex, imagePath] of imageLookup) { + if (regex.test(windowPath)) { + return imagePath; + } + } + return defaultImage; +} + +const SocialTags = ({metadata, pageTitle}) => { + const url = `${window.location.origin}${window.location.pathname}`; + const socialImagePath = getSocialImage(window.location.pathname); + const socialImageUrl = `${window.location.origin}${socialImagePath}`; + + /* react-helmet combines these with existing header values. + These tags will override shared tags from earlier in the tree. */ + return ( + + {/* OpenGraph tags */} + + + + {metadata && metadata.title ? + : + null} + + + {/* Twitter tags */} + + + {metadata && metadata.title ? + : + null} + + + ); +}; + +export default SocialTags; diff --git a/static-site/data/SiteConfig.js b/static-site/data/SiteConfig.js index 762f8d27b..dac789c36 100644 --- a/static-site/data/SiteConfig.js +++ b/static-site/data/SiteConfig.js @@ -1,7 +1,7 @@ module.exports = { siteTitle: "Nextstrain", siteTitleAlt: "Real-time tracking of pathogen evolution", // Alternative site title for SEO. - siteLogo: "/static/logos/nextstrain-logo-small.png", // Logo used for SEO + siteLogo: "/logos/nextstrain-logo-small.png", // Logo used for SEO siteUrl: "https://nextstrain.org", pathPrefix: "/", siteDescription: "Real-time tracking of pathogen evolution", // Website description used for RSS feeds/meta description tag. diff --git a/static-site/src/components/SEO/SEO.jsx b/static-site/src/components/SEO/SEO.jsx index 8d7568150..87ba532ed 100644 --- a/static-site/src/components/SEO/SEO.jsx +++ b/static-site/src/components/SEO/SEO.jsx @@ -70,6 +70,7 @@ class SEO extends Component { return ( {/* General tags */} + @@ -80,14 +81,23 @@ class SEO extends Component { {/* OpenGraph tags */} - {postSEO ? : null} + {postSEO ? + : + + } - + {config.siteFBAppID ? + : + null + } + + {/* Twitter Card tags */} + + + + ); }