Kategoriebasierte Themen und Beitragreaktionen?

Ist es möglich, kategoriefreundliche Themen und Beitragsreaktionen zu haben?

Ich finde nichts Out-of-the-Box und keine vorhandenen Komponenten.

Wenn es derzeit nicht möglich ist, welche Schritte wären erforderlich, um so etwas zu erreichen?

Hallo Noah,

Du hast Recht, es gibt derzeit keine Möglichkeit, unterschiedliche Reaktionen für Beiträge/Themen basierend auf einer bestimmten Kategorie anzuzeigen.

Am besten fragst du in Marketplace nach.

1 „Gefällt mir“

Perfekt :slight_smile:

Ich habe einige Erfahrung mit der Entwicklung in anderen Umgebungen, aber ich prüfe, ob dies über eine Theme-Komponente möglich ist.

Mit ein wenig Hilfe von KI :sweat_smile: scheint es zu funktionieren, bin mir aber nicht 100% sicher, ob dies der richtige Weg ist, dies in Discourse zu erreichen:

<script type="text/discourse-plugin" version="0.1">
  api.onPageChange(() => {
    try {
      const isTopicPage = /^\/t\//.test(window.location.pathname);
      
      // Nur auf Topic-Seiten ausführen
      if (!isTopicPage) return;

      const allowedCategories = ['ask-a-question']; // Kategorie-Slugs direkt verwenden

      // Auf die Topic-Details zugreifen, um den Kategorie-Slug zu erhalten
      const topic = Discourse.__container__.lookup("controller:topic");
      const categorySlug = topic && topic.get("model.category.slug");
      const isAllowedCategory = categorySlug && allowedCategories.includes(categorySlug);

      // Funktion zum Ein- oder Ausblenden des spezifischen Emojis
      const toggleReactionEmoji = () => {
        const emoji = document.querySelector("[data-reaction='frog']");
        
        if (emoji) {
          emoji.style.display = isAllowedCategory ? '' : 'none';
          console.log(`Emoji mit data-reaction='frog' ${isAllowedCategory ? 'angezeigt' : 'ausgeblendet'}.`);
        }
      };

      // Erster Check, falls das Element bereits im DOM vorhanden ist
      toggleReactionEmoji();

      // Einen Mutationsbeobachter einrichten, um Emoji basierend auf Kategorieänderungen ein- oder auszublenden
      const observer = new MutationObserver(mutations => {
        mutations.forEach(mutation => {
          mutation.addedNodes.forEach(node => {
            if (node.nodeType === 1) { // Prüfen, ob es sich um einen Elementknoten handelt
              const emoji = node.querySelector("[data-reaction='frog']");
              if (emoji) {
                emoji.style.display = isAllowedCategory ? '' : 'none';
                console.log(`Emoji mit data-reaction='frog' in Mutation gefunden und ${isAllowedCategory ? 'angezeigt' : 'ausgeblendet'}.`);
              }
            }
          });
        });
      });

      // Den Body auf Änderungen der Kindknoten beobachten (z.B. Hinzufügen von Reaktionen)
      observer.observe(document.body, { childList: true, subtree: true });

      // Den Beobachter beim Navigieren aufräumen
      api.cleanupStream(() => observer.disconnect());

    } catch (error) {
      console.error("Ein Fehler ist im Emoji-Umschaltungs-Skript aufgetreten:", error);
    }
  });
</script>
1 „Gefällt mir“