DEV Community

Cover image for Using the DEV API to add DEV.to comment counts to my blog
Emma Goto ๐Ÿ™
Emma Goto ๐Ÿ™

Posted on • Originally published at emgoto.com on

Using the DEV API to add DEV.to comment counts to my blog

Currently my personal blog site doesnโ€™t support comments. Since I cross-post all of my posts to DEV, I got the idea to show how many comments my blog post has received on DEV:

Image of my blog with number of DEV comments

My blog is open-source, so you can check out the code over on Github.

Using DEV.toโ€™s API

DEV provides an articles API that lets you get data about any article that has been published on DEV. Each article will look something like this:

 { "type_of": "article", "id": 451782, "title": "I made my Gatsby blog open source: a feature walkthrough", "description": "I recently open-sourced my blog built using Gatsby! This post will walk you through why I chose Gatsb...", "readable_publish_date": "Sep 9", "slug": "i-made-my-gatsby-blog-open-source-a-feature-walkthrough-49oe", "path": "/emma/i-made-my-gatsby-blog-open-source-a-feature-walkthrough-49oe", "url": "https://dev.to/emma/i-made-my-gatsby-blog-open-source-a-feature-walkthrough-49oe", "comments_count": 5, "public_reactions_count": 74, "collection_id": null, "published_timestamp": "2020-09-09T20:57:58Z", "positive_reactions_count": 74, // ... the list goes on! } 
Enter fullscreen mode Exit fullscreen mode

The two values that I'm interested in from this API are the comments_count and url values.

Storing the article ID in my frontmatter

Each of my posts are written in Markdown, with a bunch of metadata known as the frontmatter at the top. The frontmatter for this post looks like this:

--- title: "Using the DEV API to add DEV.to comment counts to my blog" date: 2020-09-17 tags: ["blog", "dev"] category: "blog" emoji: ๐Ÿ’ฌ devArticleId: 12345 --- 
Enter fullscreen mode Exit fullscreen mode

I'm storing the article ID in the frontmatter, so that when this post is rendered, I can call DEV's API with that ID.

Finding your DEV articleโ€™s ID

I needed to add this devArticleId value to all of my Markdown posts. I ended up doing this manually by grabbing a list of my articles on DEV using this endpoint:

https://dev.to/api/articles?username=emma 
Enter fullscreen mode Exit fullscreen mode

And then cross-referencing the DEV articles with my blog posts.

Alternatively, if I wanted to grab the ID for a specific article I can also find that by inspecting the article's source code on DEV and looking for data-article-id:

<div class="crayons-article__body text-styles spec__body" data-article-id="422738" id="article-body" > 
Enter fullscreen mode Exit fullscreen mode

Creating a data-fetching hook

Since my blog runs on Gatsby, I can create a React hook to fetch my data:

const useDevArticleComments = devArticleId => { const [loading, setLoading] = useState(!!devArticleId); const [data, setData] = useState(); useEffect(() => { devArticleId && fetch(`https://dev.to/api/articles/${devArticleId}`) .then(response => response.json()) .then(response => { setData(response); setLoading(false); }) .catch(error => setLoading(false)); }, [devArticleId]); return { loading, data: data && { comments: data.comments_count, url: data.url, }, }; }; 
Enter fullscreen mode Exit fullscreen mode

Iโ€™m returning two values here - loading and data. While loading is true, I donโ€™t render anything and wait for the data to load. Once the data comes in, I can display either the number of comments on my post, or a prompt to leave a comment.

After creating this component, I also took the time to install Jest and add some unit tests. Unit tests are definitely something I tend to neglect in my side projects, so I want to make a conscious effort to properly unit-test this blog!

Top comments (2)

Collapse
 
shadowtime2000 profile image
shadowtime2000

Neat.

Collapse
 
emma profile image
Emma Goto ๐Ÿ™

Thanks!