カテゴリー別のトピックと投稿の反応について

カテゴリ固有のトピックと投稿のリアクションは可能ですか?

標準機能や既存のコンポーネントでは見つかりません。

現在不可能であれば、これを実現するための手順はどのようなものになりますか?

ノアさん、

おっしゃる通り、現時点では特定のカテゴリに基づいて投稿/トピックごとに異なるリアクションを表示する方法はありません。

Marketplace で質問するのが最善の方法です。

「いいね!」 1

完璧です :slight_smile:

他の環境での開発経験はありますが、テーマコンポーネント経由で可能かどうかを検討しています。

AI :sweat_smile: の助けを借りて、動作しているようですが、Discourseでこれを達成する方法としてこれが正確かどうかは100%確信が持てません。

<script type="text/discourse-plugin" version="0.1">
  api.onPageChange(() => {
    try {
      const isTopicPage = /^\/t\//.test(window.location.pathname);
      
      // トピックページでのみ実行
      if (!isTopicPage) return;

      const allowedCategories = ['ask-a-question']; // カテゴリスラッグを直接使用

      // トピックの詳細にアクセスしてカテゴリ スラッグを取得
      const topic = Discourse.__container__.lookup("controller:topic");
      const categorySlug = topic && topic.get("model.category.slug");
      const isAllowedCategory = categorySlug && allowedCategories.includes(categorySlug);

      // 特定の絵文字を非表示または表示する関数
      const toggleReactionEmoji = () => {
        const emoji = document.querySelector("[data-reaction='frog']");
        
        if (emoji) {
          emoji.style.display = isAllowedCategory ? '' : 'none';
          console.log(`Emoji with data-reaction='frog' ${isAllowedCategory ? 'shown' : 'hidden'}.`);
        }
      };

      // 要素が既にDOMにある場合に備えて、初期チェックを実行
      toggleReactionEmoji();

      // カテゴリの変更に基づいて絵文字を非表示/表示するためのミューテーションオブザーバーを設定
      const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
          mutation.addedNodes.forEach(node => {
            if (node.nodeType === 1) { // 要素ノードかどうかを確認
              const emoji = node.querySelector("[data-reaction='frog']");
              if (emoji) {
                emoji.style.display = isAllowedCategory ? '' : 'none';
                console.log(`Emoji with data-reaction='frog' found in mutation and ${isAllowedCategory ? 'shown' : 'hidden'}.`);
              }
            }
          });
        });
      });

      // 反応が追加された場合などの子リストの変更を監視するために body を監視
      observer.observe(document.body, { childList: true, subtree: true });

      // ナビゲーションを離れる際にオブザーバーをクリーンアップ
      api.cleanupStream(() => observer.disconnect());

    } catch (error) {
      console.error("An error occurred in the emoji toggle script:", error);
    }
  });
</script>
「いいね!」 1