Réactions spécifiques aux sujets et aux publications dans la catégorie

Est-il possible d’avoir des réactions spécifiques aux sujets et aux publications par catégorie ?

Je ne trouve rien d’emblée et aucun composant existant.

Si ce n’est pas possible actuellement, quelles seraient les étapes pour y parvenir ?

Salut Noah,

Tu as raison, il n’y a actuellement aucun moyen d’afficher différentes réactions pour les publications/sujets en fonction d’une certaine catégorie.

Ton meilleur recours est de demander dans Marketplace

1 « J'aime »

Parfait :slight_smile:

J’ai de l’expérience en développement dans d’autres environnements, mais j’explore s’il est possible de le faire via un composant de thème.

Avec un peu d’aide de l’IA :sweat_smile: , je semble y être parvenu, mais je ne suis pas tout à fait sûr que ce soit la bonne façon de procéder dans Discourse :

<script type="text/discourse-plugin" version="0.1">
  api.onPageChange(() => {
    try {
      const isTopicPage = /^\/t\//.test(window.location.pathname);
      
      // Exécuter uniquement sur les pages de sujets
      if (!isTopicPage) return;

      const allowedCategories = ['ask-a-question']; // Utiliser directement les slugs de catégorie

      // Accéder aux détails du sujet pour obtenir le slug de la catégorie
      const topic = Discourse.__container__.lookup("controller:topic");
      const categorySlug = topic && topic.get("model.category.slug");
      const isAllowedCategory = categorySlug && allowedCategories.includes(categorySlug);

      // Fonction pour masquer ou afficher l'emoji spécifique
      const toggleReactionEmoji = () => {
        const emoji = document.querySelector("[data-reaction='frog']");
        
        if (emoji) {
          emoji.style.display = isAllowedCategory ? '' : 'none';
          console.log(`Emoji avec data-reaction='frog' ${isAllowedCategory ? 'affiché' : 'masqué'}.`);
        }
      };

      // Vérification initiale au cas où l'élément serait déjà dans le DOM
      toggleReactionEmoji();

      // Configurer un observateur de mutations pour masquer/afficher l'emoji en fonction des changements de catégorie
      const observer = new MutationObserver((mutations) => {
        mutations.forEach((mutation) => {
          mutation.addedNodes.forEach((node) => {
            if (node.nodeType === 1) { // Vérifier s'il s'agit d'un nœud d'élément
              const emoji = node.querySelector("[data-reaction='frog']");
              if (emoji) {
                emoji.style.display = isAllowedCategory ? '' : 'none';
                console.log(`Emoji avec data-reaction='frog' trouvé dans la mutation et ${isAllowedCategory ? 'affiché' : 'masqué'}.`);
              }
            }
          });
        });
      });

      // Observer le corps pour les changements de liste d'enfants (par exemple, l'ajout de réactions)
      observer.observe(document.body, { childList: true, subtree: true });

      // Nettoyer l'observateur lors de la navigation
      api.cleanupStream(() => observer.disconnect());

    } catch (error) {
      console.error("Une erreur s'est produite dans le script de basculement d'emoji :", error);
    }
  });
</script>
1 « J'aime »