Olá! Tenho este problema ao tentar incorporar o Discourse em nosso aplicativo Web NextJS. Já tentei procurar respostas nos tópicos existentes que abordam o mesmo erro, mas não consegui encontrar uma resolução para o meu problema.
No front-end, ele fica preso em “Carregando Discussões…”. Inicialmente, pensei que tivesse algo a ver com o CSP, mas já adicionei o domínio à Lista de Permissões de Incorporação. Nenhum erro aparece nos logs do console nem nas chamadas de rede.
Estou preso nisso há algumas horas, então qualquer ajuda seria apreciada.
Eu também tenho esse problema usando o next.js. Ele fica travado em ‘loading discussion’ na primeira carga (antes do tópico ser criado). Se eu atualizo, os comentários/iniciar discussão aparecem - então ele cria o tópico corretamente para mim, mas não atualiza o estado de carregamento (tenho que atualizar para mostrar o estado atualizado com a caixa de comentários).
Seria bom se houvesse um callback ou algo para avisar que o tópico foi criado, pois não é ideal ter que atualizar a página. Não sei se isso é possível com um iframe.
"use client"
import { useEffect, useRef } from "react"
/**
* Um componente React para incorporar comentários do Discourse em um site
*
* @param {Object} props - Propriedades do componente
* @param {string} props.discourseUrl - A URL da sua instância do Discourse (incluindo barra final)
* @param {string} [props.discourseEmbedUrl] - A URL da página atual (para criação automática de tópicos)
* @param {number} [props.topicId] - ID de um tópico existente do Discourse (alternativa a discourseEmbedUrl)
* @param {string} [props.username] - Nome de usuário para criação de tópicos
* @param {string} [props.className] - Nome da classe CSS a ser adicionada ao embed
* @param {string} [props.referrerPolicy] - Política de referência para o iframe
*/
export default function DiscourseComments({
discourseUrl,
discourseEmbedUrl,
topicId,
username,
className,
referrerPolicy = "no-referrer-when-downgrade",
}) {
const initialized = useRef(false)
useEffect(() => {
// Previne inicialização duplicada
if (initialized.current) return
initialized.current = true
// Valida as props necessárias
if (!discourseUrl) {
console.error("DiscourseComments: discourseUrl é obrigatório")
return
}
if (!discourseEmbedUrl && !topicId) {
console.error("DiscourseComments: É necessário fornecer discourseEmbedUrl ou topicId")
return
}
// Configura o embed do Discourse
const config = {
discourseUrl,
discourseReferrerPolicy: referrerPolicy,
}
if (discourseEmbedUrl) {
config.discourseEmbedUrl = discourseEmbedUrl
}
if (topicId) {
config.topicId = topicId
}
if (className) {
config.className = className
}
// Define o objeto global DiscourseEmbed
window.DiscourseEmbed = config
// Carrega o script de embed do Discourse
const script = document.createElement("script")
script.type = "text/javascript"
script.async = true
script.src = `${discourseUrl}javascripts/embed.js`
document.head.appendChild(script)
// Limpeza
return () => {
document.head.removeChild(script)
delete window.DiscourseEmbed
}
}, [discourseUrl, discourseEmbedUrl, topicId, className, referrerPolicy])
return (
<>
<div id="discourse-comments"></div>
{username && <meta name="discourse-username" content={username} />}
</>
)
}