UNPKG

@draftbox-co/gatsby-ghost-novela-theme

Version:

A Gatsby theme plugin for creating blogs from headless Ghost CMS.

234 lines (219 loc) 7.29 kB
import React from "react"; import Helmet from "react-helmet"; import PropTypes from "prop-types"; //import _ from 'lodash' import { StaticQuery, graphql } from "gatsby"; import url from "url"; //import ImageMeta from './ImageMeta' const WebsiteMeta = ({ data, settings, canonical, title, description, image, type, }) => { const config = settings.site.siteMetadata; settings = settings.allGhostSettings.edges[0].node; const publisherLogo = config.logoUrl || config.alternateLogoUrl ? url.resolve(config.siteUrl, config.logoUrl || config.alternateLogoUrl) : null; let shareImage = config.coverUrl || config.facebookCard.imageUrl || config.twitterCard.imageUrl; shareImage = shareImage ? url.resolve(config.siteUrl, shareImage) : null; description = description || data.meta_description || data.description || config.siteDescriptionMeta || settings.description; title = settings.title; const jsonLd = { "@context": `https://schema.org/`, "@type": type, url: canonical, image: shareImage ? { "@type": `ImageObject`, url: shareImage, width: config.shareImageWidth, height: config.shareImageHeight, } : undefined, publisher: { "@type": `Organization`, name: config.siteTitle, logo: publisherLogo ? { "@type": `ImageObject`, url: publisherLogo, width: 60, height: 60, } : undefined, }, mainEntityOfPage: { "@type": `WebPage`, "@id": config.siteUrl, }, description: config.metadata.description || config.siteDescription, }; return ( // <> // <Helmet htmlAttributes={{"lang": settings.lang ? settings.lang : "auto"}}> // <title>{title}</title> // <meta name="description" content={description} /> // <link rel="canonical" href={canonical} /> // <meta property="og:site_name" content={settings.title} /> // <meta property="og:type" content="website" /> // <meta property="og:title" content={title} /> // <meta property="og:description" content={description} /> // <meta property="og:url" content={canonical} /> // <meta name="twitter:title" content={title} /> // <meta name="twitter:description" content={description} /> // <meta name="twitter:url" content={canonical} /> // {settings.twitter && <meta name="twitter:site" content={`https://twitter.com/${settings.twitter.replace(/^@/, ``)}/`} />} // {settings.twitter && <meta name="twitter:creator" content={settings.twitter} />} // <script type="application/ld+json">{JSON.stringify(jsonLd, undefined, 4)}</script> // </Helmet> // <ImageMeta image={shareImage} /> //twitter/facebook -> meta -> siteTitle //images - only if it exists // </> <> <Helmet htmlAttributes={{ lang: config.language || "auto" }}> <title>{config.metadata.title || config.siteTitle}</title> <meta name="description" content={config.metadata.description || config.siteDescription} /> <link rel="canonical" href={canonical} /> <meta property="og:site_name" content={config.siteTitle} /> <meta property="og:type" content="website" /> <meta property="og:title" content={ config.facebookCard.title || config.metadata.title || config.siteTitle } /> <meta property="og:description" content={ config.facebookCard.description || config.metadata.description || config.siteDescription } /> <meta property="og:url" content={canonical} /> {config.facebookCard.imageUrl !== "" && ( <meta property="og:image" content={`${config.siteUrl}/${config.facebookCard.imageUrl}`} /> )} {config.facebookCard.width !== "" && ( <meta property="og:image:width" content={config.facebookCard.width} /> )} {config.facebookCard.height !== "" && ( <meta property="og:image:height" content={config.facebookCard.height} /> )} {config.facebookCard.appId !== "" && ( <meta property="fb:app_id" content={config.facebookCard.appId} /> )} <meta name="twitter:title" content={ config.twitterCard.title || config.metadata.title || config.siteTitle } /> <meta name="twitter:description" content={ config.twitterCard.description || config.metadata.description || config.siteDescription } /> <meta name="twitter:url" content={canonical} /> {config.twitterCard.username && ( <meta name="twitter:site" content={config.twitterCard.username} /> )} {config.twitterCard.username && ( <meta name="twitter:creator" content={config.twitterCard.username} /> )} {config.twitterCard.imageUrl && ( <meta name="twitter:image" content={url.resolve(config.siteUrl, config.twitterCard.imageUrl)} /> )} {config.twitterCard.imageUrl && ( <meta name="twitter:card" content="summary_large_image" /> )} <script type="application/ld+json"> {JSON.stringify(jsonLd, undefined, 4)} </script> </Helmet> {/* <ImageMeta image={shareImage} /> */} </> ); }; WebsiteMeta.propTypes = { data: PropTypes.shape({ title: PropTypes.string, meta_title: PropTypes.string, meta_description: PropTypes.string, name: PropTypes.string, feature_image: PropTypes.string, description: PropTypes.string, bio: PropTypes.string, profile_image: PropTypes.string, }).isRequired, settings: PropTypes.shape({ logo: PropTypes.object, description: PropTypes.string, title: PropTypes.string, twitter: PropTypes.string, allGhostSettings: PropTypes.object.isRequired, site: PropTypes.object.isRequired, iconUrl: PropTypes.string, }).isRequired, canonical: PropTypes.string.isRequired, title: PropTypes.string, description: PropTypes.string, image: PropTypes.string, type: PropTypes.oneOf([`WebSite`, `Series`]).isRequired, }; const WebsiteMetaQuery = (props) => ( <StaticQuery query={graphql` query GhostSettingsWebsiteMeta { allGhostSettings { edges { node { ...GhostSettingsFields } } } site { siteMetadata { ...SiteMetadataFields } } } `} render={(data) => <WebsiteMeta settings={data} {...props} />} /> ); export default WebsiteMetaQuery;