Customizing the Blog - part 1/n - Social Media Sharing
January 11, 2020
This blog is based on Gatsby and initiated from Gatsby's blog starter; boilerplate for a full-featured blog. While it provides a lot of useful features for a blog, it also leaves plenty of room for customization, which is something I like.
In this post, I go through how to add functionality to share posts into social media platforms like Twitter and Linked In.
Since I know that Gatsby has a plugin library, my first thought was to find a suitable plugin from there, but I couldn't find any. It is interesting because social media sharing is a pretty basic functionality for any blog, in my opinion. It started to seem that this but would not let me off easy. – since one of the primary purposes of this blog is to learn different things, it's okay.
After a little search in Google, GitHub and npmjs.com, I found packages called react-share and react-icons, those looked sufficient for my purpose. – I based my decision to use these packages out of dozens of other packages on their popularity and the fact that there were releases made recently.
Now I only needed to find my way over creating and using a React component.
//TODO: Learn more about React components.
Okay. First of all, let's install the packages and their dependencies by:
yarn add react-share react-iconsThen create new React component under src/components/share.js:
/**
* A component to share pages to social media platforms.
*/
import React from "react";
import PropTypes from "prop-types";
import { TwitterShareButton, LinkedinShareButton } from "react-share";
import { IconContext } from "react-icons";
import { FaTwitter, FaLinkedin } from "react-icons/fa";
const SocialShare = (props) => {
const { url, title } = props;
const shareBlockProps = {
url: url,
title: title,
};
return (
<IconContext.Provider
value={{
size: "1.5rem",
className: "share",
style: { marginRight: "0.5rem", marginBottom: "1.0rem" },
}}
>
<div>
<TwitterShareButton {...shareBlockProps}>
<FaTwitter />
</TwitterShareButton>
<LinkedinShareButton {...shareBlockProps}>
<FaLinkedin />
</LinkedinShareButton>
</div>
</IconContext.Provider>
);
};
SocialShare.propTypes = {
url: PropTypes.string,
title: PropTypes.string,
};
SocialShare.defaultProps = {
url: "https://cloudgardener.dev/",
title: "Post with no title.",
};
export default SocialShare;To enable this newly created component for blog posts, we need to adjust the post template in src/templates/blog-post.js.
Let's start by importing the component:
import SocialShare from "../components/share";Then gather information needed from page data.
The SocialShare component currently takes in two properties, url and title, and to be able to fill those, we need to adjust the pageQuery by adding siteUrl and fields { slug } into it:
export const pageQuery = graphql`
query BlogPostBySlug($slug: String!) {
site {
siteMetadata {
title
siteUrl
}
}
markdownRemark(fields: { slug: { eq: $slug } }) {
id
excerpt(pruneLength: 160)
html
fields {
slug
}
frontmatter {
title
date(formatString: "MMMM DD, YYYY")
description
}
}
}
`;Now we have all the data to define the postUrl variable, inside the render() block:
const postUrl = this.props.data.site.siteMetadata.siteUrl + post.fields.slug;Last but not least we use the SocialShare component inside the return block, after the post section:
<SocialShare url="{postUrl}" title="{post.frontmatter.title}" />The result looks like this:
Here you can see the complete src/templates/blog-post.js.
That's about it! Now I have a functional social media sharing on my blog. What's next? – Who knows. :)
"Every day, work to refine the skills you have and to add new tools to your repertoire." ― Andrew Hunt, The Pragmatic Programmer: From Journeyman to Master
Sincerely yours, your Cloud Gardener,
/niko