spaCy/website/src/components/seo.js

140 lines
3.9 KiB
JavaScript
Raw Normal View History

import React from 'react'
import PropTypes from 'prop-types'
import Helmet from 'react-helmet'
import { StaticQuery, graphql } from 'gatsby'
import socialImageDefault from '../images/social_default.jpg'
import socialImageApi from '../images/social_api.jpg'
import socialImageUniverse from '../images/social_universe.jpg'
2020-07-01 15:41:13 +03:00
import socialImageNightly from '../images/social_nightly.jpg'
function getPageTitle(title, sitename, slogan, sectionTitle) {
2019-03-18 20:58:55 +03:00
if (sectionTitle && title) {
return `${title} · ${sitename} ${sectionTitle}`
}
if (title) {
return `${title} · ${sitename}`
}
return `${sitename} · ${slogan}`
}
2020-07-01 15:41:13 +03:00
function getImage(section, nightly) {
if (nightly) return socialImageNightly
if (section === 'api') return socialImageApi
if (section === 'universe') return socialImageUniverse
return socialImageDefault
}
2020-07-01 15:41:13 +03:00
const SEO = ({ description, lang, title, section, sectionTitle, bodyClass, nightly }) => (
<StaticQuery
query={query}
render={data => {
const siteMetadata = data.site.siteMetadata
const metaDescription = description || siteMetadata.description
const pageTitle = getPageTitle(
title,
siteMetadata.title,
siteMetadata.slogan,
sectionTitle
)
2020-07-01 15:41:13 +03:00
const socialImage = siteMetadata.siteUrl + getImage(section, nightly)
const meta = [
{
name: 'description',
content: metaDescription,
},
{
property: 'og:title',
content: pageTitle,
},
{
property: 'og:description',
content: metaDescription,
},
{
property: 'og:type',
content: `website`,
},
{
property: 'og:site_name',
content: title,
},
{
property: 'og:image',
content: socialImage,
},
{
name: 'twitter:card',
content: 'summary_large_image',
},
{
name: 'twitter:image',
content: socialImage,
},
{
name: 'twitter:creator',
2019-02-20 16:33:23 +03:00
content: `@${siteMetadata.social.twitter}`,
},
{
name: 'twitter:site',
2019-02-20 16:33:23 +03:00
content: `@${siteMetadata.social.twitter}`,
},
{
name: 'twitter:title',
content: pageTitle,
},
{
name: 'twitter:description',
content: metaDescription,
},
{
name: 'docsearch:language',
content: lang,
},
]
return (
<Helmet
2019-04-23 19:39:30 +03:00
defer={false}
htmlAttributes={{ lang }}
bodyAttributes={{ class: bodyClass }}
title={pageTitle}
meta={meta}
/>
)
}}
/>
)
SEO.defaultProps = {
lang: 'en',
}
SEO.propTypes = {
description: PropTypes.string,
lang: PropTypes.string,
meta: PropTypes.array,
keywords: PropTypes.arrayOf(PropTypes.string),
title: PropTypes.string,
section: PropTypes.string,
bodyClass: PropTypes.string,
}
export default SEO
const query = graphql`
query DefaultSEOQuery {
site {
siteMetadata {
title
description
slogan
2019-03-26 20:27:40 +03:00
siteUrl
social {
twitter
}
}
}
}
`