ブログを書く人にとって読者からのフィードバックは何よりのモチベーションになります。
そこでこの記事では、easy-notion-blog にいいねボタンを追加しNotion DBに追加したLike列(プロパティ)を増やすカスタマイズの方法を説明します。
easy-notion-blog バージョン0.9.0以降をお使いの方はこの手順は不要です。
そうでない方は axios というライブラリをインストールしましょう。
yarn add axios インストールしたら package.json と yarn.lock をコミットしておきましょう。
Notionを開いてブログのDBにLike列を Type: Number として追加しましょう。
DBに追加した Like プロパティをブログのソースでも扱えるように変更していきます。
まず src/lib/notion/interfaces.ts を開き Post インターフェースに Like プロパティを追加します。
export interface Post {
PageId: string
Title: string
Slug: string
Date: string
Tags: string[]
Excerpt: string
OGImage: string
Rank: number
+ Like: number
} これで Post インターフェースで Like が扱えるようになりました。
次に、DBから取得した Like を実際に Post へ設定します。
src/lib/notion/client.ts を開き _buildPost メソッドを探します。
_buildPost の中で Post を作成しているので、そこに Like プロパティを追加しましょう。
const post: Post = {
PageId: data.id,
Title: prop.Page.title[0].plain_text,
Slug: prop.Slug.rich_text[0].plain_text,
Date: prop.Date.date.start,
Tags: prop.Tags.multi_select.map(opt => opt.name),
Excerpt:
prop.Excerpt.rich_text.length > 0
? prop.Excerpt.rich_text[0].plain_text
: '',
OGImage:
prop.OGImage.files.length > 0 ? prop.OGImage.files[0].file.url : null,
Rank: prop.Rank.number,
+ Like: prop.Like.number,
}
return post これでブログのソースで実際の Like プロパティの値が扱えるようになりました。
今回はいいねボタンを押したときに Like プロパティを増やしたいので、 Like を更新できるようにしなければなりません。
src/lib/notion/client.ts を開き、 Like プロパティを更新するためのメソッド incrementLikes を追加しましょう。
+ export async function incrementLikes(post:Post) {
+ const result = await client.pages.update({
+ page_id: post.PageId,
+ properties: {
+ 'Like': (post.Like || 0) + 1,
+ },
+ })
+
+ if (!result) {
+ return null
+ }
+
+ return _buildPost(result)
+ }
+ incrementLikes は post を受け取り、現在の Like に +1 した値でNotion DBを更新します。
ただし、 Like の値がまだない場合は null が入っているため、 (post.Like || 0) のようにして null の場合には 0 + 1 となるようにしています。
a || b のように書くと左辺 a が偽(falsy)の場合に右辺 b の値の評価結果を返します。 null は falsy な値のため、右辺が評価されて 0 が返ります。左辺 a が真(truthy)な場合には右辺は評価されず左辺の値が返ります。 Like をインクリメントするメソッドを作ったので、いいねボタンを押したときに直接呼び出せば良いような気がしますが、これはできません。
JavaScript がアクセスできるのは、その JavaScript が生成されたドメインと同じドメインだけという決まりがあります。これを Same-Origin Policy(同一生成元ポリシー)と言います。
Notion API は notion.so ドメインで、私たちが Vercel でホストしている easy-notion-blog とは別ドメインです。
そのため、フロントの JavaScript から直接 Notion API にアクセスすることはできません。
そこで、easy-notion-blog のサーバーサイドを経由して Notion API にアクセスします。
いいねボタン(フロント)を押した際にいったん easy-notion-blog のサーバーサイドにリクエストし、サーバーサイドから Notion API をリクエストするという作戦です。
そういうわけで easy-notion-blog にいいねを受け付ける API を作ります。
src/pages/api ディレクトリを作成し下記の内容で src/pages/api/like.ts を作成します。
import { NextApiRequest, NextApiResponse } from 'next'
import {
getPostBySlug,
incrementLikes,
} from '../../lib/notion/client'
const ApiLike = async function(req: NextApiRequest, res: NextApiResponse) {
if (req.method !== 'PUT') {
res.statusCode = 400
res.end()
return
}
const { slug } = req.query
if (!slug) {
res.statusCode = 400
res.end()
return
}
try {
const post = await getPostBySlug(slug as string)
if (!post) {
throw new Error(`post not found. slug: ${slug}`)
}
await incrementLikes(post)
res.statusCode = 200
res.end()
} catch (e) {
console.log(e)
res.statusCode = 500
res.end()
}
}
export default ApiLike
/api/like?slug=aaa のようなURLでリクエストすることでいいねを更新できるようになりました。
今回は更新にあたるのでHTTPメソッドとしては PUT だけを許可しています。
いいねAPIができたので、いよいよいいねボタンを作っていきます。
下記の内容で src/components/like-button.tsx を作成します。
import React, { useState } from 'react';
import axios from 'axios'
type Props = {
slug: string
}
const LikeButton = (props: Props) => {
const [active, setActive] = useState(false)
const handleClick = () => {
if (!active) {
axios.put(`/api/like?slug=${props.slug}`, {})
setActive(true)
}
}
return (
<button onClick={handleClick}>Like</button>
)
}
export default LikeButton
button に設定した onClick によって、ボタンを押したときに /api/like?slug=aaa に PUT リクエストを送ることができるようになりました。
ボタンのコンポーネントができたので記事ページの下部に設置しましょう。
src/pages/blog/[slug].tsx を開いて <footer> の SocialButtons の下あたりに追加してみましょう。
ファイルの上部でインポートするのも忘れないでください。
+ import LikeButton from '../../components/like-button' <footer>
{NEXT_PUBLIC_URL && (
<SocialButtons
title={post.Title}
url={new URL(
getBlogLink(post.Slug),
NEXT_PUBLIC_URL
).toString()}
id={post.Slug}
/>
)}
+ <LikeButton slug={post.Slug} />
</footer>
追加できたらローカルの開発環境を立ち上げて動作確認してみましょう。
yarn dev ブラウザで http://localhost:3000/blog にアクセスしていいねボタンの動作を確認しましょう。
ボタンを押したときに、該当ポストの Like プロパティが増えていれば成功です。
もしエラーになってしまったり動作しない場合は、 yarn dev やブラウザのコンソールログを確認してみてください。
それでもわからない場合は Twitter の easy-notion-blog コミュニティ に参加して気軽に聞いてみてください。私もチェックしているので力になれるはずです。
以上です。
この記事では、easy-notion-blog にいいねボタンを追加しNotion DBに追加したLikeプロパティを増やすカスタマイズの方法を説明しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます