Redirecione uma rota existente em um componente de tema

Para redirecionar uma rota existente do Discourse em um componente de tema, você pode usar api.modifyClass para modificar a classe da rota.

Mais informações podem ser encontradas na documentação do Ember sobre redirecionamento de rotas. Aqui está um exemplo:

<script type="text/discourse-plugin" version="0.8"> 
    // Modificar a rota de tag. 
    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            this._super(tag, transition);
            // Se for domingo, redirecionar para o tópico com id 20.
            if (today.getDay() == 6) {
                this.replaceWith("/t/20");
            }
        }
    }
</script>

Se você precisar carregar dados para decidir onde ou se deve redirecionar, é necessário que o gancho da sua rota retorne uma promessa, conforme discutido na documentação do Ember sobre roteamento assíncrono. Aqui está um exemplo:

<script type="text/discourse-plugin" version="0.8">
    const ajax = require('discourse/lib/ajax').ajax;

    api.modifyClass('route:tag-show', {
        afterModel: function(tag, transition) {
            // Parece importar que isso venha primeiro.
            this._super(tag, transition);

            // Redirecionar para o primeiro tópico aberto que tenha as tags da rota e a tag 'canonical'.            
            var path = `/tags/intersection/canonical/${tag.id}.json`;
            const context = this;
            return ajax(path).then(function(result){
                var topics = result.topic_list.topics.filter(function(topic) { 
                   return !topic.closed ;
                });
                if (topics && topics.length > 0) {
                    var topic = topics[0];
                    // Você precisa considerar o caso em que o destino é o mesmo que a origem.
                    // Você poderia cancelar a transição, mas aqui permitimos que ela prossiga sem redirecionamento.
                    if (!transition.from || transition.from.parent.name != 'topic' || transition.from.parent.params.id != topic.id) {
                        context.replaceWith("/t/" + topic.id);
                    }
                }
            })
            // Capturar quaisquer problemas para que a rota (não redirecionada) possa prosseguir como fallback. 
            .catch(function() {
                console.log('Erro ao carregar tópicos via ajax no gancho afterModel da rota tag show.');
            });
        },
    });
</script>
8 curtidas