Composant pour ajouter un message personnalisé au Composer basé sur l'ID utilisateur et les catégories

Aujourd’hui, j’ai rencontré ce problème :

https://meta.discourse.org/t/required-tags-should-only-be-required-based-on-type-of-user/392238

mais pour l’instant, en attendant que l’équipe travaille dessus (avec un peu de chance), j’ai décidé de demander à Claude de m’aider à créer un Composant qui me permet d’avoir un message personnalisé dans le Compositeur pour me rappeler d’ajouter une étiquette (tag). Je peux ajouter un ou plusieurs utilisateurs, par ID, et je peux limiter cela à certaines catégories, également par ID.

Si l’ID (utilisateur et catégories) n’est PAS sur la liste, je vois ceci :

image

Si l’ID est sur la liste, je vois le message :

image

Si cela peut être utile à d’autres, le voici (il suffit de créer un composant et d’ajouter le script dans l’onglet JS) :

import { apiInitializer } from "discourse/lib/api";

export default apiInitializer("0.8.31", (api) => {
  // Configuration : Ajoutez vos IDs d'utilisateur et IDs de catégorie ici
  const TARGET_USER_IDS = [2]; // Remplacez par les vrais IDs d'utilisateur
  const TARGET_CATEGORY_IDS = [4,49]; // Remplacez par les vrais IDs de catégorie
  const REMINDER_MESSAGE = "🛑 Add the appropriate tag to this post!"; // Gardé en anglais car c'est le message affiché
  
  let previousCategoryId = null;
  let checkInterval = null;
  
  function checkAndUpdateMessage() {
    const composer = api.container.lookup("controller:composer");
    if (!composer || !composer.model) {
      // Le Compositeur a disparu, arrêtez la vérification
      if (checkInterval) {
        clearInterval(checkInterval);
        checkInterval = null;
      }
      return;
    }
    
    const currentUser = api.getCurrentUser();
    if (!currentUser || !TARGET_USER_IDS.includes(currentUser.id)) return;
    
    const model = composer.model;
    const categoryId = model.categoryId;
    
    // Agir uniquement si la catégorie a changé
    if (categoryId === previousCategoryId) return;
    previousCategoryId = categoryId;
    
    const currentReply = model.reply || "";
    
    // Supprimer le message s'il a été ajouté
    if (currentReply.startsWith(REMINDER_MESSAGE)) {
      model.set("reply", currentReply.replace(REMINDER_MESSAGE, "").trim());
    }
    
    // Ajouter le message si dans la catégorie cible et que le compositeur est vide
    if (categoryId && TARGET_CATEGORY_IDS.includes(categoryId)) {
      const cleanReply = model.reply || "";
      if (cleanReply.trim().length === 0) {
        model.set("reply", REMINDER_MESSAGE);
      }
    }
  }
  
  // Vérifier à l'ouverture du compositeur
  api.onAppEvent("composer:opened", () => {
    previousCategoryId = null;
    checkAndUpdateMessage();
    
    // Démarrer le polling pour les changements de catégorie
    if (checkInterval) clearInterval(checkInterval);
    checkInterval = setInterval(checkAndUpdateMessage, 300);
  });
  
  // Arrêter la vérification à la fermeture du compositeur
  api.onAppEvent("composer:closed", () => {
    if (checkInterval) {
      clearInterval(checkInterval);
      checkInterval = null;
    }
    previousCategoryId = null;
  });
});
1 « J'aime »