Sou novo em temas do Discourse e emberjs, e atualmente estou trabalhando em um tema que tem itens de navegação do site principal.
Os itens de navegação json vêm de uma requisição ajax e preciso exibi-los em 2 locais.
1º local é header-buttons:before. Consegui fazer isso com api.decorateWidget e disparando os appEvents site-header:force-refresh.
O 2º local é via pluginOutlet, below-site-header.
Acredito que não posso fazer o mesmo que acima, usando api.decorateWidget, porque este é um pluginOutlet, não um widget(?).
Minhas perguntas são:
Como inserir manualmente o conteúdo ajax no pluginOutlet?
Gostaria também de saber como compilar um virtual-dom dinamicamente após minha chamada ajax? Por exemplo, a variável acima, headerNav, gostaria de obter uma marcação HTML compilada dela. Não tenho certeza de qual lib/função usar.
Se possível, como também renderizar novamente um pluginOutlet? Semelhante a appEvents.trigger("site-header:force-refresh");
Mantenha seu decorador de widget como está e crie um componente Ember separado que faça o que você deseja no plugin outlet. Estamos descontinuando os widgets em favor de componentes Ember (que é o que a maior parte do Discourse é construída).
Este processo seria assim:
Crie um arquivo JS e HBS (template) do componente no diretório javascripts/discourse/components do seu tema.
component-name.js
component-name.hbs
Construa seu componente Ember… infelizmente esta etapa é essencialmente “aprender Ember” (Guias Ember) … mas acho que isso pode lhe dar uma ideia geral para começar:
Em component-name.js:
import Component from "@glimmer/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
const endpoint = settings.site_navigation_links_endpoint;
export default class ComponentName extends Component {
@tracked navLinks = null;
@action
async fetchNavLinks() {
try {
const response = await fetch(endpoint);
const data = await response.json(); // assumindo que é json
this.navLinks = data;
} catch (error) {
console.error("Falha:", error);
}
}
}
Isso chamará a ação fetchNavLinks sempre que o componente for inserido (neste caso, quando você visita o site do Discourse e o aplicativo renderiza). Sempre que navLinks for atualizado, o conteúdo do componente será atualizado porque é uma propriedade rastreada.
Se você quiser atualizar os links com mais frequência do que na renderização do componente, precisará adicionar mais lógica ao JS aqui… verificando se a rota (página) atual atende a certas condições, por exemplo.
Este componente seria adicionado a um plugin outlet adicionando-o ao outlet em javascripts/discourse/connectors/below-site-header/my-component-connector.hbs:
Optei pela segunda abordagem, usando componente, já que os widgets estão gradualmente sendo descontinuados. Exceto pelo pequeno erro de digitação na chamada da função, no arquivo .hbs deveria ser {{did-insert this. fetchNavLinks}}, tudo funciona!
É ótimo saber que temos did-insert, isso é um grande alívio! Terminei a tarefa.