Enlace de chat faltante en el widget de evento de publicación tras la actualización Rollup

Hola :waving_hand:

Nos encontramos con un pequeño error en la función de chat del plugin discourse-calendar, donde el enlace :speech_balloon: al canal de chat desapareció repentinamente en el widget de eventos de la publicación.

Es muy probable que se haya roto con el cambio reciente en el núcleo de Discourse para mover el sistema de compilación a Rollup:

  • af3385baba — Introducción del compilador Rollup (desactivado por defecto)
  • 74d532c559 — Activación del compilador Rollup como predeterminado

Puedo solucionarlo y proporcionar una PR al respecto :technologist: .

Comportamiento esperado

Al agregar un evento a un tema y habilitar la Integración de chat (“Crear y gestionar canales de chat específicos para eventos”), el widget de eventos en la publicación debería incluir un icono :speech_balloon: con un enlace al canal de chat asociado al evento:

Comportamiento actual

Por el momento, en la rama main actual, esta sección del widget de eventos de la publicación simplemente no se renderiza en absoluto:

Solución

Parece que el problema es que el helper perezoso optionalRequire ya no funciona como se pretendía inicialmente con Rollup. Por lo que entiendo, Rollup llama a optionalRequire demasiado pronto, cuando otros módulos aún no están registrados, por lo que siempre devuelve false.

Lo que soluciona el problema es mover las llamadas a optionalRequire dentro del constructor del componente, para que realmente se evalúen de forma perezosa.

Para el archivo del modelo, por ejemplo, se vería así:

diff --git a/plugins/discourse-calendar/assets/javascripts/discourse/models/discourse-post-event-event.js b/plugins/discourse-calendar/assets/javascripts/discourse/models/discourse-post-event-event.js
index 742cc35a84..f687b956aa 100644
--- a/plugins/discourse-calendar/assets/javascripts/discourse/models/discourse-post-event-event.js
+++ b/plugins/discourse-calendar/assets/javascripts/discourse/models/discourse-post-event-event.js
@@ -7,10 +7,6 @@ import User from "discourse/models/user";
 import DiscoursePostEventEventStats from "./discourse-post-event-event-stats";
 import DiscoursePostEventInvitee from "./discourse-post-event-invitee";
 
-const ChatChannel = optionalRequire(
-  "discourse/plugins/chat/discourse/models/chat-channel"
-);
-
 const DEFAULT_REMINDER = {
   type: "notification",
   value: 15,
@@ -62,6 +58,8 @@ export default class DiscoursePostEventEvent {
   @tracked _reminders;
 
   constructor(args = {}) {
+    const ChatChannel = optionalRequire( "discourse/plugins/chat/discourse/models/chat-channel");
+
     this.id = args.id;
     this.rrule = args.rrule;
     this.name = args.name;

Y respectivamente para el componente que renderiza el enlace real:

diff --git a/plugins/discourse-calendar/assets/javascripts/discourse/components/discourse-post-event/chat-channel.gjs b/plugins/discourse-calendar/assets/javascripts/discourse/components/discourse-post-event/chat-channel.gjs
index f673ee8a9f..a988b341e6 100644
--- a/plugins/discourse-calendar/assets/javascripts/discourse/components/discourse-post-event/chat-channel.gjs
+++ b/plugins/discourse-calendar/assets/javascripts/discourse/components/discourse-post-event/chat-channel.gjs
@@ -1,24 +1,27 @@
+import Component from "@glimmer/component";
 import { LinkTo } from "@ember/routing";
 import { optionalRequire } from "discourse/lib/utilities";
 import { and } from "discourse/truth-helpers";
 
-const ChannelTitle = optionalRequire(
-  "discourse/plugins/chat/discourse/components/channel-title"
-);
+export default class DiscoursePostEventChatChannel extends Component {
+  get channelTitle() {
+    return optionalRequire(
+      "discourse/plugins/chat/discourse/components/channel-title"
+    );
+  }
 
-const DiscoursePostEventChatChannel = <template>
-  {{#if (and @event.channel ChannelTitle)}}
-    <section class="event__section event-chat-channel">
-      <span></span>
-      <LinkTo
-        @route="chat.channel"
-        @models={{@event.channel.routeModels}}
-        class="chat-channel-link"
-      >
-        <ChannelTitle @channel={{@event.channel}} />
-      </LinkTo>
-    </section>
-  {{/if}}
-</template>;
-
-export default DiscoursePostEventChatChannel;
+  <template>
+    {{#if (and @event.channel this.channelTitle)}}
+      <section class="event__section event-chat-channel">
+        <span></span>
+        <LinkTo
+          @route="chat.channel"
+          @models={{@event.channel.routeModels}}
+          class="chat-channel-link"
+        >
+          <this.channelTitle @channel={{@event.channel}} />
+        </LinkTo>
+      </section>
+    {{/if}}
+  </template>
+}

(Nota: Necesito convertirlo a un componente de clase, por eso el diff es más grande)

Proporcionaré una PR con mi solución en GitHub, para que la gente pueda probarla y expresar sus opiniones al respecto.

2 Me gusta

Gracias @klappradla. Tu solución propuesta me parece bien: por favor, comparte un enlace al PR cuando esté listo :rocket:

Allí lo tienes → https://github.com/discourse/discourse/pull/39287

1 me gusta