Typechoでブログを構築する際、通常はOwO ライブラリを使ってスタンプ機能を提供します。Like this:

OwOのスタンプ機能
OwOライブラリの提供する統合方法は従来のフロントエンド開発パターンに合致しており、現在のShiroオープンソース版テーマはNextJSフレームワークで開発されているため、テーマへ直接組み込むには適していません。したがって、自分で簡易版スタンプを開発する必要があります。
スタンプデータファイルを作成する
OwOでは、スタンプデータはOwO.jsonファイルから取得されます。Shiroテーマでは、src/libディレクトリにowo.tsファイルを作成してスタンプデータを定義できます。このファイル内でowoオブジェクトを作成し、内容をOwO.jsonの構造と一致させて、以前のTypechoテーマのスタンプデータを引き継ぎます。
export const owo = {
颜文字: {
type: "emoticon",
container: [
{
icon: 'OωO',
text: 'OωO',
},
//...
],
},
Emoji: {
type: "emoji",
container: [
{
icon: '😂',
text: 'Face with Tears of Joy',
},
//...
],
},
图片表情: {
type: "image",
container: [
{
icon: "https://raw.githubusercontent.com/url8/CDN-EMOTE/main/2233/chijing.png",
text: "face1",
},
//...
],
},
};
スタンプボタンを追加する
ShiroテーマはEmoji Pickerライブラリをスタンプピッカーとして使用しています
しかし私のPCではこのピッカーをスクロールするとフレーム落ちが発生するため、自作のスタンプピッカーコンポーネントでEmoji Pickerを直接置き換えたいと考えています。またブランチコンフリクトを避けるため、元のスタンプピッカーコンポーネントEmojiPickerを修正することはしません。
1. カスタムスタンプピッカーコンポーネントを導入:
まず、src\components\modules\comment\CommentBox\UniversalTextArea.tsxで、元々インポートしていたEmojiPickerコンポーネントを自作のスタンプピッカーコンポーネントStickersに置き換えます:
2. 元のEmojiPickerコンポーネントを置き換える:
UniversalTextAreaコンポーネントの返却部分で、<EmojiPicker onEmojiSelect={handleInsertEmoji} />を<Stickers handleInsertEmoji={handleInsertEmoji} />に置き換えます:
3. スタンプボタンを修正する:
最後に、テキストエリア左下のスタンプボタンを修正します:
これでコメント欄テキストエリアの修正は完了です。
スタンプピッカーコンポーネント
次に、先ほど導入したスタンプピッカーコンポーネントStickersを実装します。このコンポーネントはスタンプピッカーをレンダリングし、ユーザーのクリックイベントを処理します。
src\components\modules\sharedディレクトリに移動し、Stickers.tsxという新しいファイルを作成します。
コンポーネント内では、useStateで現在のスタンプカテゴリcurrentCategory(つまり颜文字、Emojiその他のカテゴリ)を管理し、useMemoでスタンプカテゴリと現在選択されているスタンプデータをキャッシュします。
注意点:颜文字の長さがばらばらなため、現在のスタンプが颜文字の場合はGridレイアウトで要素を整列させる必要があります:
そうしないと以下のようにぎこちなくなります:

Gridレイアウトを使わない場合
Stickers.tsxの完全なコードは以下の通りです:
最後に、プロジェクトを再ビルドするだけで、Shiroでスタンプ機能を使用できるようになります😊。