/** * This react helmt code is adapted from * https://themeteorchef.com/tutorials/reusable-seo-with-react-helmet. * * A great tutorial explaining how to setup a robust version of an * SEO friendly react-helmet instance. * * * Use the Helmt on pages to generate SEO and meta content! * * Usage: * * */ import React from 'react'; import Helmet from 'react-helmet'; import { graphql, useStaticQuery } from 'gatsby'; interface HelmetProps { articlepathName?: string; authorName?: string; authorsBio?: string; authorsSlug?: string; canonicalUrl?: string; dateforSEO?: string; description?: string; image?: string; isBlogPost: false; pathname: string; published?: string; timeToRead?: string; title: string; isSecret: false; } const seoQuery = graphql` { allSite { edges { node { siteMetadata { description social { url name } siteUrl title name } } } } } `; const themeUIDarkModeWorkaroundScript = [ { type: 'text/javascript', innerHTML: ` (function() { try { var mode = localStorage.getItem('theme-ui-color-mode'); if (!mode) { localStorage.setItem('theme-ui-color-mode', 'light'); } } catch (e) {} })(); `, }, ]; const SEO: React.FC = ({ articlepathName, authorName, authorsBio, authorsSlug, canonicalUrl, children, dateforSEO, description, image, isBlogPost, pathname, published, timeToRead, title, isSecret, }) => { const results = useStaticQuery(seoQuery); const site = results.allSite.edges[0].node.siteMetadata; const twitter = site.social.find(option => option.name === 'twitter') || {}; const github = site.social.find(option => option.name === 'github') || {}; const linkedin = site.social.find(option => option.name === 'linkedin') || {}; const medium = site.social.find(option => option.name === 'medium') || {}; const pageUrl = site.siteUrl + pathname const fullURL = (path: string) => path ? `${path}` : site.siteUrl; // If no image is provided lets looks for a default novela static image image = image ? image : `${site.siteUrl}/preview.jpg`; // Checks if the source of the image is hosted on Contentful if (`${image}`.includes('ctfassets')) { image = `${image}`; } else { image = fullURL(image); } let siteSchema = `{ "@context": "https://schema.org", "@graph": [ { "@type": "Organization", "@id": "${site.siteUrl}/#organization", "name": "${site.title}", "url": "${site.siteUrl}", "sameAs": [ "${twitter.url}", "${github.url}", "${linkedin.url}", "${medium.url}" ], "logo": { "@type": "ImageObject", "@id": "${site.siteUrl}/#logo", "inLanguage": "en-US", "url": "${site.siteUrl}/icons/icon-512x512.png", "width": 512, "height": 512, "caption": "${site.title}" }, "image": { "@id": "${site.siteUrl}/#logo" } }, { "@type": "WebSite", "@id": "${site.siteUrl}/#website", "url": "${site.siteUrl}", "name": "${site.name}", "description": "${site.description}", "publisher": { "@id": "${site.siteUrl}/#organization" }, "inLanguage": "en-US" }, { "@type": [ "WebPage" ], "@id": "${pageUrl}/#webpage", "url": "${pageUrl}", "name": "${title || site.name}", "isPartOf": { "@id": "${site.siteUrl}/#website" }, "about": { "@id": "${site.siteUrl}/#organization" }, "description": "${description || site.description}", "inLanguage": "en-US" }, { "@type": "BreadcrumbList", "description": "Breadcrumbs list", "itemListElement": [ { "@type": "ListItem", "item": "${site.siteUrl}", "name": "Homepage", "position": "1" } ], "name": "Breadcrumbs" } ] } `.replace(/"[^"]+"|(\s)/gm, function (matched, group1) { if (!group1) { return matched; } else { return ''; } }); let blogSchema = `{ "@context": "https://schema.org", "@graph": [ { "@type": "Organization", "@id": "${site.siteUrl}/#organization", "name": "${site.title}", "url": "${site.siteUrl}", "sameAs": [ "${twitter.url}", "${github.url}", "${linkedin.url}", "${medium.url}" ], "logo": { "@type": "ImageObject", "@id": "${site.siteUrl}/#logo", "inLanguage": "en-US", "url": "${site.siteUrl}/icons/icon-512x512.png", "width": 512, "height": 512, "caption": "${site.title}" }, "image": { "@id": "${site.siteUrl}/#logo" } }, { "@type": "WebSite", "@id": "${site.siteUrl}/#website", "url": "${site.siteUrl}", "name": "${site.name}", "description": "${site.description.replace(/"/g, '\\"')}", "publisher": { "@id": "${site.siteUrl}/#organization" }, "inLanguage": "en-US" }, { "@type": "ImageObject", "@id": "${articlepathName}/#primaryimage", "inLanguage": "en-US", "url": "${image}", "width": 1200, "height": 628 }, { "@type": [ "WebPage" ], "@id": "${articlepathName}/#webpage", "url": "${articlepathName}", "name": "${title}", "isPartOf": { "@id": "${site.siteUrl}/#website" }, "primaryImageOfPage": { "@id": "${articlepathName}/#primaryimage" }, "datePublished": "${dateforSEO}", "dateModified": "${dateforSEO}", "description": "${description}", "breadcrumb": { "@id": "${articlepathName}/#breadcrumb" }, "inLanguage": "en-US" }, { "@type": "BreadcrumbList", "@id": "${articlepathName}/#breadcrumb", "itemListElement": [ { "@type": "ListItem", "position": 1, "item": { "@type": "WebPage", "@id": "${site.siteUrl}", "url": "${site.siteUrl}", "name": "Home" } }, { "@type": "ListItem", "position": 2, "item": { "@type": "WebPage", "@id": "${articlepathName}", "url": "${articlepathName}", "name": "${title}" } } ] }, { "@type": "Article", "@id": "${articlepathName}/#article", "isPartOf": { "@id": "${articlepathName}/#webpage" }, "author": { "@id": "${site.siteUrl}/#/schema${authorsSlug}" }, "headline": "${title}", "datePublished": "${dateforSEO}", "dateModified": "${dateforSEO}", "mainEntityOfPage": { "@id": "${articlepathName}/#webpage" }, "publisher": { "@id": "${site.siteUrl}/#organization" }, "image": { "@id": "${articlepathName}/#primaryimage" }, "inLanguage": "en-US" }, { "@type": [ "Person" ], "@id": "${site.siteUrl}/#/schema${authorsSlug}", "name": "${authorName}", "image": { "@type": "ImageObject", "@id": "${site.siteUrl}/#personlogo", "inLanguage": "en-US", "caption": "${authorName}" }, "description": "${authorsBio}", "sameAs": [ "${twitter.url}", "${github.url}", "${linkedin.url}", "${medium.url}" ] } ] } `.replace(/"[^"]+"|(\s)/gm, function (matched, group1) { if (!group1) { return matched; } else { return ''; } }); const schema = isBlogPost ? blogSchema : siteSchema const metaTags = [ { charset: 'utf-8' }, { 'http-equiv': 'X-UA-Compatible', content: 'IE=edge', }, { name: 'viewport', content: 'width=device-width, initial-scale=1', }, { name: 'theme-color', content: '#fff', }, { itemprop: 'name', content: title || site.title }, { itemprop: 'description', content: description || site.description }, { itemprop: 'image', content: image }, { name: 'description', content: description || site.description }, { name: 'twitter:card', content: 'summary_large_image' }, { name: 'twitter:site', content: site.name }, { name: 'twitter:title', content: title || site.title }, { name: 'twitter:description', content: description || site.description }, { name: 'twitter:creator', content: twitter.url }, { name: 'twitter:image', content: image, }, { property: 'og:type', content: 'website' }, { property: 'og:title', content: title || site.title }, { property: 'og:url', content: articlepathName || pageUrl }, { property: 'og:image', content: image }, { property: 'og:description', content: description || site.description }, { property: 'og:site_name', content: site.name }, ]; if (published) { metaTags.push({ name: 'article:published_time', content: published }); } if (timeToRead) { metaTags.push({ name: 'twitter:label1', value: 'Reading time' }); metaTags.push({ name: 'twitter:data1', value: `${timeToRead} min read` }); } if (isSecret) { metaTags.push({ name: 'robots', content: 'noindex' }); } return ( {canonicalUrl && } {children} ); }; export default SEO;