Реакции на темы и посты по категориям?

Возможно ли иметь реакции к темам и сообщениям, специфичные для категорий?

Я не нахожу ничего готового и никаких существующих компонентов.

Если это сейчас невозможно, какие шаги необходимы для реализации чего-то подобного?

Привет, Ноа,

Ты прав, в данный момент нет возможности показывать разные реакции на сообщения/темы в зависимости от категории.

Лучше всего спросить в Marketplace

Отлично :slight_smile:

У меня есть опыт разработки в других средах, но я исследую, возможно ли это сделать через компонент темы.

С небольшой помощью ИИ :sweat_smile: у меня, кажется, получилось, но я не на 100% уверен, что это правильный способ реализации в Discourse:

<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(`Эмодзи с data-reaction='frog' ${isAllowedCategory ? 'показан' : 'скрыт'}.`);
        }
      };

      // Первоначальная проверка на случай, если элемент уже находится в 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(`Эмодзи с data-reaction='frog' найден в изменении и ${isAllowedCategory ? 'показан' : 'скрыт'}.`);
              }
            }
          });
        });
      });

      // Наблюдение за телом документа на предмет изменений в списке дочерних элементов (например, добавление реакций)
      observer.observe(document.body, { childList: true, subtree: true });

      // Очистка наблюдателя при переходе на другую страницу
      api.cleanupStream(() => observer.disconnect());

    } catch (error) {
      console.error("Произошла ошибка в скрипте переключения эмодзи:", error);
    }
  });
</script>