Chat-Link im Post-Event-Widget nach Rollup fehlt

Hallo :waving_hand:

Wir sind auf einen kleinen Bug mit der Chat-Funktion des discourse-calendar-Plugins gestoßen, bei dem der :speech_balloon:-Link zum Chat-Kanal plötzlich im Post-Event-Widget fehlte.

Vermutlich wurde dies durch die kürzliche Änderung im Discourse-Kern verursacht, bei der das Build-System auf Rollup umgestellt wurde:

  • af3385baba — Einführung des Rollup-Compilers (standardmäßig deaktiviert)
  • 74d532c559 — Aktivierung des Rollup-Compilers als Standard

Ich kann das Problem beheben und einen PR dafür einreichen :technologist: .

Erwartetes Verhalten

Beim Hinzufügen eines Ereignisses zu einem Thema und Aktivieren der Chat-Integration („Ereignisspezifischen Chat-Kanal erstellen und verwalten“) sollte das Event-Widget im Beitrag ein :speech_balloon:-Symbol mit einem Link zum mit dem Ereignis verknüpften Chat-Kanal enthalten:

Aktuelles Verhalten

Derzeit wird dieser Abschnitt des Post-Event-Widgets auf dem aktuellen main-Branch gar nicht gerendert:

Fix/Lösung

Das Problem scheint darin zu bestehen, dass der verzögerte optionalRequire-Helper mit Rollup nicht mehr wie ursprünglich beabsichtigt funktioniert. Meines Wissens ruft Rollup optionalRequire zu früh auf, wenn andere Module noch nicht registriert sind, wodurch immer false zurückgegeben wird.

Die Lösung besteht darin, die optionalRequire-Aufrufe in den Konstruktor der Komponente zu verschieben, damit sie tatsächlich verzögert ausgewertet werden.

Für die Modelldatei sähe dies beispielsweise so aus:

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;

Und entsprechend für die Komponente, die den eigentlichen Link rendert:

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>
+}

(Hinweis: Ich muss es in eine Klassenkomponente umwandeln, daher ist der Diff größer)

Ich werde einen PR mit meiner Lösung auf GitHub einreichen, damit andere sie ausprobieren und ihre Meinung dazu äußern können.

2 „Gefällt mir“

Danke @klappradla. Dein vorgeschlagener Fix klingt für mich gut – bitte poste einen Link zum PR, sobald er bereit ist :rocket:

Hier geht’s los → https://github.com/discourse/discourse/pull/39287

1 „Gefällt mir“