Ссылка на чат отсутствует в виджете события публикации после обновления Rollup

Привет :waving_hand:

Мы столкнулись с небольшой ошибкой в функции чата плагина discourse-calendar: ссылка :speech_balloon: на канал чата внезапно исчезла из виджета события в посте.

Скорее всего, проблема возникла из-за недавнего изменения в ядре Discourse, связанного с переходом системы сборки на Rollup:

  • af3385baba — Внедрён компилятор Rollup (по умолчанию отключён)
  • 74d532c559 — Компилятор Rollup включён по умолчанию

Я могу исправить это и предоставить соответствующий PR :technologist: .

Ожидаемое поведение

При добавлении события к теме и включении «Интеграции с чатом» («Создание и управление специфичным для события каналом чата»), виджет события в посте должен содержать иконку :speech_balloon: со ссылкой на канал чата, связанный с этим событием:

Текущее поведение

На данный момент в актуальной ветке main этот раздел виджета события в посте просто не отображается:

Исправление / Решение

Проблема, похоже, заключается в том, что ленивый хелпер optionalRequire больше не работает так, как изначально задумывалось, в среде Rollup. По моему пониманию, Rollup вызывает optionalRequire слишком рано, когда другие модули ещё не зарегистрированы, поэтому он всегда возвращает false.

Решение проблемы — переместить вызовы optionalRequire внутрь конструктора компонента, чтобы они действительно выполнялись лениво.

Для файла модели это, например, будет выглядеть так:

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;

Аналогично для компонента, который рендерит саму ссылку:

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

(Примечание: мне нужно преобразовать это в компонент класса, поэтому дифф получился больше)

Я предоставлю PR с моим исправлением на GitHub, чтобы люди могли его протестировать и высказать своё мнение.

2 лайка

Спасибо, @klappradla. Ваше предложенное исправление мне кажется подходящим — пожалуйста, опубликуйте ссылку на PR, когда он будет готов :rocket:

Вот оно — https://github.com/discourse/discourse/pull/39287

1 лайк