اليوم واجهت هذه المشكلة:
https://meta.discourse.org/t/required-tags-should-only-be-required-based-on-type-of-user/392238
ولكن في الوقت الحالي، وإلى أن يعمل الفريق على حلها (نأمل ذلك)، قررت أن أطلب من Claude المساعدة في بناء مكون (Component) يسمح لي بوجود رسالة مخصصة في مُنشئ المشاركة (Composer) لتذكيري بإضافة وسم (tag). يمكنني إضافة مستخدم واحد أو أكثر، عن طريق المعرّف (ID)، ويمكنني تقييد ذلك بفئات معينة، عن طريق المعرّف (ID) أيضًا.
إذا لم يكن المعرّف (للمستخدمين والفئات) موجودًا في القائمة، أرى هذا:

إذا كان المعرّف موجودًا في القائمة، أرى الرسالة:

إذا كان هذا مفيدًا للآخرين، فإليكم الكود (ما عليك سوى إنشاء مكون وإضافة النص البرمجي إلى علامة تبويب JS):
import { apiInitializer } from "discourse/lib/api";
export default apiInitializer("0.8.31", (api) => {
// الإعدادات: أضف معرّفات المستخدمين ومعرّفات الفئات الخاصة بك هنا
const TARGET_USER_IDS = [2]; // استبدل بمعرّفات المستخدمين الفعلية
const TARGET_CATEGORY_IDS = [4,49]; // استبدل بمعرّفات الفئات الفعلية
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) {
// اختفى مُنشئ المشاركة، توقف عن التحقق
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;
// تصرف فقط إذا تغيرت الفئة
if (categoryId === previousCategoryId) return;
previousCategoryId = categoryId;
const currentReply = model.reply || "";
// إزالة الرسالة إذا تمت إضافتها
if (currentReply.startsWith(REMINDER_MESSAGE)) {
model.set("reply", currentReply.replace(REMINDER_MESSAGE, "").trim());
}
// إضافة الرسالة إذا كانت في الفئة المستهدفة وكان مُنشئ المشاركة فارغًا
if (categoryId && TARGET_CATEGORY_IDS.includes(categoryId)) {
const cleanReply = model.reply || "";
if (cleanReply.trim().length === 0) {
model.set("reply", REMINDER_MESSAGE);
}
}
}
// التحقق عند فتح مُنشئ المشاركة
api.onAppEvent("composer:opened", () => {
previousCategoryId = null;
checkAndUpdateMessage();
// ابدأ الاستقصاء لتغييرات الفئة
if (checkInterval) clearInterval(checkInterval);
checkInterval = setInterval(checkAndUpdateMessage, 300);
});
// توقف عن التحقق عند إغلاق مُنشئ المشاركة
api.onAppEvent("composer:closed", () => {
if (checkInterval) {
clearInterval(checkInterval);
checkInterval = null;
}
previousCategoryId = null;
});
});