No final do dia, preciso de um botão de novo tópico no corpo da lista de tópicos no tema central do Discourse. Todos os engenheiros reclamam que não gostam do botão “Iniciar nova conversa” estar apenas no final da lista de tópicos dentro de cada categoria. Eles não querem usar a opção do menu “novo tópico” no topo, pois isso não inicia o tópico na categoria em que eles estão atualmente.
Já executei isso através do Llama 3.1 405B, bem como do GPT-4 via ask.discourse.com, mas não consigo obter uma versão de JavaScript que compile. Estou constantemente recebendo o erro de compilação: Compile error: SyntaxError: Private field must be used in an enclosing class
Também recebo um erro no registro de widgets, mas isso ocorre porque o widget personalizado nunca é criado devido ao erro de compilação do JS.
Estou usando o tema Discourse Central.
Dado este cabeçalho:
"<script type=\"text/discourse-plugin\" version=\"0.8.18\">
api.createWidget('custom-new-topic-button', {
tagName: 'div.custom-new-topic-button',
buildKey: () => `custom-new-topic-button`,
html() {
return [
this.attach('button', {
className: 'btn btn-primary',
action: 'createNewTopic',
contents: 'New Topic'
})
];
},
click() {
const composerController = this.container.lookup("controller:composer");
const currentCategory = this.container.lookup("controller:navigation/category").get("model.id");
composerController.open({
action: require("discourse/models/composer").default.CREATE_TOPIC,
draftKey: require("discourse/models/composer").default.DRAFT,
categoryId: currentCategory,
});
return false;
},
});
api.decorateWidget('topic-list:before', (helper) => {
if (api.getCurrentUser()) {
helper.appendChild(helper.createWidget('custom-new-topic-button'));
}
});
</script>"
Com esta seção de cabeçalho:
"<script>
{{#if currentUser}}
<div>
{{custom-new-topic-button}}
</div>
{{/if}}
</script>"
E este CSS:
".topic-list-body::before {
content: "";
display: block;
position: relative; /* Importante para permitir o posicionamento absoluto dentro */
}
.topic-list-body-new-topic {
position: absolute;
top: 0;
left: 0;
padding: 10px;
background: #f2f3f5;
border-bottom: 1px solid #ccc;
}
.custom-new-topic-button .btn.btn-primary {
background-color: #007bff;
border-color: #007bff;
color: #fff;
}"
Esse era meu código original. A recomendação mais recente é:
<script type="text/discourse-plugin" version="0.8.18">
api.createWidget('custom-new-topic-button', {
tagName: 'div.custom-new-topic-button',
buildKey() {
return 'custom-new-topic-button';
},
defaultState() {
return {};
},
html() {
return [
this.attach('button', {
className: 'btn btn-primary',
action: 'createNewTopic',
contents: 'New Topic'
})
];
},
createNewTopic() {
const composerController = this.container.lookup("controller:composer");
const currentCategory = this.container.lookup("controller:navigation/category").get("model.id");
const Composer = require("discourse/models/composer").default;
composerController.open({
action: Composer.CREATE_TOPIC,
draftKey: Composer.DRAFT,
categoryId: currentCategory,
});
return false;
},
});
api.decorateWidget('topic-list:before', (helper) => {
if (api.getCurrentUser()) {
helper.appendChild(helper.createWidget('custom-new-topic-button'));
}
});
</script>

