Привет ![]()
Мы столкнулись с небольшой ошибкой в функции чата плагина discourse-calendar: ссылка
на канал чата внезапно исчезла из виджета события в посте.
Скорее всего, проблема возникла из-за недавнего изменения в ядре Discourse, связанного с переходом системы сборки на Rollup:
- af3385baba — Внедрён компилятор Rollup (по умолчанию отключён)
- 74d532c559 — Компилятор Rollup включён по умолчанию
Я могу исправить это и предоставить соответствующий PR
.
Ожидаемое поведение
При добавлении события к теме и включении «Интеграции с чатом» («Создание и управление специфичным для события каналом чата»), виджет события в посте должен содержать иконку
со ссылкой на канал чата, связанный с этим событием:
Текущее поведение
На данный момент в актуальной ветке 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, чтобы люди могли его протестировать и высказать своё мнение.

