Estoy trabajando en un componente de tema para bloquear publicaciones que contengan una palabra clave contenida en un campo de usuario personalizado. He logrado que esto funcione para ocultar respuestas y temas cuando se enumeran en “latest” o “top” en la vista de escritorio, pero cuando se ven en la aplicación o en dispositivos móviles, agregará el aviso de que el tema fue bloqueado, pero no aplicará la clase “blocked” al contenido. Bloquear respuestas dentro de un tema funciona bien en dispositivos móviles o en la aplicación.
Al revisar components, no parecía que se usara un archivo .hbs diferente para dispositivos móviles, ¿me estoy perdiendo algo más?
const discourseComputed = require("discourse-common/utils/decorators").default;
function addIgnoredTopicClass() {
if (currentUser) {
api.container.lookup('store:main').find('user', currentUser.username).then((user) => {
const blocklist = user.user_fields[1];
const case_sensitive = user.user_fields[2];
const whole_words = user.user_fields[3];
const blocked = blocklist.split(",").map(function(item) {
if (case_sensitive) {
return item.trim();
} else {
return item.trim().toLowerCase();
}
});
let classList = this._super(...arguments);
let elem = document.querySelectorAll("[data-topic-id='" + this.topic.id.toString() + "']")[0];
console.log(elem);
const title = (case_sensitive) ? this.topic.fancy_title : this.topic.fancy_title.toLowerCase();
const excerpt = (case_sensitive) ? this.topic.excerpt : this.topic.excerpt.toLowerCase();
let result = "";
for (let index = 0; index < blocked.length; ++index) {
let pattern = (whole_words) ? new RegExp('(\\b|\\s|^)' + blocked[index] + '(\\b|\\s|$)') : new RegExp(blocked[index]);
// console.log(pattern)
if (pattern.test(title)) {
classList += "blocker-blocked"
const found = blocked.filter(text => title.includes(text));
if (found.length >= 2) {
const last = found.pop();
result = found.join(', ') + ' and ' + last;
} else {
result = found.join(', ');
}
const newNode = document.createElement("a");
const textNode = document.createTextNode("Blocked for containing " + result + ".");
newNode.classList.add("block-notice")
newNode.appendChild(textNode);
newNode.onclick = function() { showComment(this); };
elem.children[0].insertBefore(newNode, elem.children[0].children[0]);
for (let index = 0; index < elem.children.length; ++index) {
if (elem.children[index].classList.contains('main-link')) {
elem.children[index].classList.add("blocker-blocked");
}
}
newNode.classList.remove("blocker-blocked");
}
}
// console.log(classList);
return classList;
});
}
}
api.modifyClass("component:topic-list-item", {
@discourseComputed()
unboundClassNames() {
return addIgnoredTopicClass.call(this);
}
});
api.modifyClass("component:latest-topic-list-item", {
@discourseComputed()
unboundClassNames() {
return addIgnoredTopicClass.call(this);
}
});