Edição de posts usando um Componente de Tema

Então me deparei com a ideia de permitir que aqueles com permissões de edição de posts (usuários TL4+) pudessem selecionar texto e converter essa parte em um bloco de código.

Depois de referenciar algumas partes do código do plugin Discourse AI e olhar quais dados são passados para o outlet do plugin que estou usando, cheguei ao código para obter o texto selecionado e envolvê-lo com cercas de código, usando o outlet quote-share-buttons-before.

Então, agora, estou meio que preso. O plugin checklist (de alguma forma) faz isso com um argumento na função checklistSyntax chamado postDecorator, que eles podem então obter o modelo (acho que é o modelo post?) usando .getModel(). Como isso é passado, eu não sei, mas acho que não está disponível para mim na minha configuração?

Se for realmente o modelo de post usado no plugin checklist, pareço ter dificuldade em encontrar onde a simples função ‘save’ usada em

await postModel.save({
  raw: newRaw,
  edit_reason: i18n("checklist.edit_reason"),
});

existe em models/post.js, a menos que eu esteja entendendo errado.

Atualmente estou usando this.args.outletArgs.data.editPost(this.post) (que, se bem me lembro, está em models/topic.js, mas por favor, me corrija se eu estiver errado) que apenas abre o composer para editar o post, não apenas editá-lo diretamente.

Então, minha pergunta é: como posso editar o post como o plugin checklist, sem complicações? Existe uma maneira de fazer isso se eu estiver colocando um botão em um outlet em vez de api.decorateCookedElement como o checklist faz? Preferencialmente sem usar a API REST?

Meu repositório:

Obrigado!

Ok, acho que estou chegando mais perto agora.

Tentei this.post.save() e aparentemente ele “funciona” - parece que a requisição PUT está sendo feita (usando ajax por baixo dos panos), mas encontrei algum erro com pouca ou nenhuma informação. Mas isso foi antes disso…
this.post.save() funciona. O único problema é o listado abaixo:

Minha função agora está assim:

@action
async addCodeFences() {
  let selectedText = this.selectedText;
  let newText = "```" + "\n" + selectedText + "\n" + "```";

  let post = this.post;
  console.log(this.post.cooked); // Funciona

  let rawPost = post.raw; // Não existe!!
  console.log(rawPost); // undefined!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // Erro, já que rawPost é undefined!

  await this.post.save({
    raw: rawPost,
    edit_reason: I18n.t(themePrefix("add_code_fence_edit_reason"))
  });
}

Por algum motivo, não consigo obter o conteúdo bruto da postagem, apenas o cozido. Além de fazer uma requisição ajax, existe alguma maneira de fazer isso? Não consigo encontrar raw como um dos atributos da postagem… existe algum motivo para não estar incluído?

P.S. Estou tentando não recorrer ao Ask Discourse. Eu realmente apreciaria qualquer ajuda!


EDIT: Acho que cada postagem é baseada nesta solicitação de API? E a resposta não parece ter raw como uma das chaves JSON :face_exhaling:.

Sim, isso está correto - não incluímos raw na resposta padrão. Não é necessário para a renderização normal, então incluí-lo seria um desperdício em termos de transferência de dados/velocidade.

A melhor opção seria fazer uma solicitação ajax extra quando você precisar. Como você descobriu, o plugin de checklist é um bom exemplo disso.

1 curtida

Entendido, obrigado. Vou trabalhar nessa requisição ajax.

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