@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
JavaScript
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;