[ #LINEDC ] チャットのローディングアニメーションをTypeScriptで実装する
この記事では、LINEのメッセージングAPIでチャットのローディングアニメーションを表示する方法をTypeScriptで実装しています。秒数を型で制限し、FetchでAPIを直接呼び出す方法を紹介。関数化した実装例も掲載されており、チャンネルアクセストークン、チャットID、秒数を指定するだけで簡単にローディングアニメーションを表示できます。
広告ここから
広告ここまで
目次
LINEのMessage APIには、回答を生成するまでの間に表示できるローディングアニメーションをよびだすAPIがあります。このAPIを呼び出す処理が、Node.jsのSDKになさそうでしたので、自前で実装してみました。
秒数を型でしばっておく
TypeScriptを使う場合は、次のような型を用意しておくと良さそうです。というのも指定できる秒数は決まっているためです。意図しない数字が入らないようにする仕組みとして使えます。
/**
* タイピング表示の秒数として有効な値
*/
export type LoadingSeconds = 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60;
Fetchで直接APIを呼び出す
SDKに処理がないので、Fetchで直接よびだしましょう。とはいえチャンネルのアクセストークンやIDと、秒数の3つをリクエストヘッダーやBodyに入れるだけですので、そこまで複雑なものではありません。
const url = 'https://api.line.me/v2/bot/chat/loading/start';
const headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${channelAccessToken}`
};
const data = {
chatId,
loadingSeconds
};
const res = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(data)
});
関数にするなら、こんな感じ?
ということで、ざっくり仕上げたのがこちらです。
/**
* タイピング表示の秒数として有効な値
*/
export type LoadingSeconds = 5 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60;
/**
* タイピング表示を開始する
* @param channelAccessToken チャンネルアクセストークン
* @param chatId Chat ID
* @param loadingSeconds タイピング表示を表示する秒数(有効値: 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60)
*/
async function startChatLoading(channelAccessToken: string, chatId: string, loadingSeconds: LoadingSeconds): Promise<any> {
const url = 'https://api.line.me/v2/bot/chat/loading/start';
const headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${channelAccessToken}`
};
const data = {
chatId,
loadingSeconds
};
const res = await fetch(url, {
method: 'POST',
headers,
body: JSON.stringify(data)
});
if (!res.ok) {
throw new Error(`Failed to start chat loading: ${res.status} ${res.statusText}`);
}
return res.json();
}
これを次のような形でよびだしてやりましょう。
startChatLoading(event.source.userId, 10);
実際にはevent.source
のuserId
/ groupId
/ roomId
の判定がいるかもしれません。このあたりについても、ヘルパー関数などがあると良さそうとは思います。