Komponente zum Hinzufügen einer benutzerdefinierten Nachricht zum Composer basierend auf Benutzer- und Kategorie-ID

Heute hatte ich dieses Problem:

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

Aber vorerst, bis das Team daran arbeitet (hoffentlich), habe ich beschlossen, Claude um Hilfe beim Erstellen einer Komponente zu bitten, die es mir ermöglicht, eine benutzerdefinierte Nachricht im Composer anzuzeigen, um mich daran zu erinnern, ein Tag hinzuzufügen. Ich kann einen oder mehrere Benutzer anhand ihrer ID hinzufügen und dies auf bestimmte Kategorien, ebenfalls anhand ihrer ID, beschränken.

Wenn die ID (Benutzer und Kategorien) NICHT auf der Liste steht, sehe ich dies:

image

Wenn die ID auf der Liste steht, sehe ich die Nachricht:

image

Falls dies für andere hilfreich ist, hier ist es (erstellen Sie einfach eine Komponente und fügen Sie das Skript in den JS-Tab ein):

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

export default apiInitializer("0.8.31", (api) => {
  // Konfiguration: Fügen Sie hier Ihre Benutzer-IDs und Kategorie-IDs hinzu
  const TARGET_USER_IDS = [2]; // Ersetzen Sie dies durch tatsächliche Benutzer-IDs
  const TARGET_CATEGORY_IDS = [4,49]; // Ersetzen Sie dies durch tatsächliche Kategorie-IDs
  const REMINDER_MESSAGE = "🛑 Add the appropriate tag to this post!";
  
  let previousCategoryId = null;
  let checkInterval = null;
  
  function checkAndUpdateMessage() {
    const composer = api.container.lookup("controller:composer");
    if (!composer || !composer.model) {
      // Composer ist weg, Stoppen der Überprüfung
      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;
    
    // Nur handeln, wenn sich die Kategorie geändert hat
    if (categoryId === previousCategoryId) return;
    previousCategoryId = categoryId;
    
    const currentReply = model.reply || "";
    
    // Nachricht entfernen, falls sie hinzugefügt wurde
    if (currentReply.startsWith(REMINDER_MESSAGE)) {
      model.set("reply", currentReply.replace(REMINDER_MESSAGE, "").trim());
    }
    
    // Nachricht hinzufügen, wenn in der Zielkategorie und der Composer leer ist
    if (categoryId && TARGET_CATEGORY_IDS.includes(categoryId)) {
      const cleanReply = model.reply || "";
      if (cleanReply.trim().length === 0) {
        model.set("reply", REMINDER_MESSAGE);
      }
    }
  }
  
  // Überprüfung beim Öffnen des Composers
  api.onAppEvent("composer:opened", () => {
    previousCategoryId = null;
    checkAndUpdateMessage();
    
    // Polling für Kategorieänderungen starten
    if (checkInterval) clearInterval(checkInterval);
    checkInterval = setInterval(checkAndUpdateMessage, 300);
  });
  
  // Überprüfung stoppen, wenn der Composer geschlossen wird
  api.onAppEvent("composer:closed", () => {
    if (checkInterval) {
      clearInterval(checkInterval);
      checkInterval = null;
    }
    previousCategoryId = null;
  });
});
1 „Gefällt mir“