Возможно ли иметь реакции к темам и сообщениям, специфичные для категорий?
Я не нахожу ничего готового и никаких существующих компонентов.
Если это сейчас невозможно, какие шаги необходимы для реализации чего-то подобного?
Возможно ли иметь реакции к темам и сообщениям, специфичные для категорий?
Я не нахожу ничего готового и никаких существующих компонентов.
Если это сейчас невозможно, какие шаги необходимы для реализации чего-то подобного?
Привет, Ноа,
Ты прав, в данный момент нет возможности показывать разные реакции на сообщения/темы в зависимости от категории.
Лучше всего спросить в Marketplace
Отлично ![]()
У меня есть опыт разработки в других средах, но я исследую, возможно ли это сделать через компонент темы.
С небольшой помощью ИИ
у меня, кажется, получилось, но я не на 100% уверен, что это правильный способ реализации в Discourse:
<script type="text/discourse-plugin" version="0.1">
api.onPageChange(() => {
try {
const isTopicPage = /^\/t\//.test(window.location.pathname);
// Запускать только на страницах тем
if (!isTopicPage) return;
const allowedCategories = ['ask-a-question']; // Используйте слаг категории напрямую
// Получите детали темы, чтобы извлечь слаг категории
const topic = Discourse.__container__.lookup("controller:topic");
const categorySlug = topic && topic.get("model.category.slug");
const isAllowedCategory = categorySlug && allowedCategories.includes(categorySlug);
// Функция для скрытия или отображения конкретного эмодзи
const toggleReactionEmoji = () => {
const emoji = document.querySelector("[data-reaction='frog']");
if (emoji) {
emoji.style.display = isAllowedCategory ? '' : 'none';
console.log(`Эмодзи с data-reaction='frog' ${isAllowedCategory ? 'показан' : 'скрыт'}.`);
}
};
// Первоначальная проверка на случай, если элемент уже находится в DOM
toggleReactionEmoji();
// Настройка наблюдателя за изменениями для скрытия/показа эмодзи при смене категории
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.nodeType === 1) { // Проверка, является ли узел элементом
const emoji = node.querySelector("[data-reaction='frog']");
if (emoji) {
emoji.style.display = isAllowedCategory ? '' : 'none';
console.log(`Эмодзи с data-reaction='frog' найден в изменении и ${isAllowedCategory ? 'показан' : 'скрыт'}.`);
}
}
});
});
});
// Наблюдение за телом документа на предмет изменений в списке дочерних элементов (например, добавление реакций)
observer.observe(document.body, { childList: true, subtree: true });
// Очистка наблюдателя при переходе на другую страницу
api.cleanupStream(() => observer.disconnect());
} catch (error) {
console.error("Произошла ошибка в скрипте переключения эмодзи:", error);
}
});
</script>