¿No decorar elementos cocinados en la vista de composición?

Estoy trabajando en un componente de tema para bloquear publicaciones que contengan palabras clave que el usuario especifique en un campo de usuario personalizado.

Tengo la funcionalidad de bloqueo/mostrar funcionando, pero también decora el panel de vista previa cuando se escribe. ¿Hay alguna forma de evitar que api.decorateCookedElement se active en la vista previa del compositor? A continuación, se muestra lo que he logrado hasta ahora.

<script type="text/discourse-plugin" version="0.8">
let currentUser = api.getCurrentUser();

if (currentUser) {
    api.container.lookup('store:main').find('user', currentUser.username).then((user) => {
        let blocklist = user.user_fields[1];

        const blocked = blocklist.split(",").map(function(item) {
            return item.trim();
        });
        
        api.decorateCookedElement(
            elem => {
                let textContent = elem.textContent;
                let result = "";
                if (blocked.find(text => textContent.includes(text))) {
                    const found = blocked.filter(text => textContent.includes(text));
                    if (found.length >= 2) {
                        const last = found.pop();
                        result = found.join(', ') + ' and ' + last;
                    } else {
                        result = found.join(', ');
                    }
                    const children = elem.childNodes;
                    const newNode = document.createElement("a");
                    const textNode = document.createTextNode("Bloqueado por contener " + result + ".");
                    newNode.classList.add("block-notice")
                    newNode.appendChild(textNode);
                    newNode.onclick = function() { showComment(this); };
                    
                    elem.insertBefore(newNode, elem.children[0]);
                    for (let index = 0; index < children.length; ++index) {
                        children[index].classList.add("blocker-blocked")
                    }
                    newNode.classList.remove("blocker-blocked");
                }
            },
            {"id": "blocker-blocked"}
        );
        
    });
}

function showComment(elem) {
    const cooked = elem.parentNode;
    elem.remove();
    const children = cooked.childNodes;
    for (let index = 0; index < children.length; ++index) {
        children[index].classList.remove("blocker-blocked")
    }
}
</script>

Hola,

Agregar onlyStream puede hacerlo. Aquí tienes un ejemplo de otro tema. :slightly_smiling_face:

3 Me gusta

Perfecto, ¡gracias por el enlace!

1 me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.