This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/plugins/chat/assets/javascripts/discourse/components/chat-mention-warnings.js
Roman Rizzi 85e1a4934b
REFACTOR: Move mention warnings logic into a separate service. (#19465)
First follow-up to the feature introduced in #19034. We don't want to pollute main components like `chat-live-pane`, so we'll use a service to track and manage the state needed to display before-send warnings while composing a chat message.

We also move from acceptance tests to system specs.
2023-02-03 15:38:30 -03:00

174 lines
4.6 KiB
JavaScript

import Component from "@glimmer/component";
import I18n from "I18n";
import { htmlSafe } from "@ember/template";
import { inject as service } from "@ember/service";
export default class ChatMentionWarnings extends Component {
@service siteSettings;
@service currentUser;
@service chatComposerWarningsTracker;
get unreachableGroupMentions() {
return this.chatComposerWarningsTracker.unreachableGroupMentions;
}
get overMembersLimitGroupMentions() {
return this.chatComposerWarningsTracker.overMembersLimitGroupMentions;
}
get hasTooManyMentions() {
return this.chatComposerWarningsTracker.tooManyMentions;
}
get mentionsCount() {
return this.chatComposerWarningsTracker.mentionsCount;
}
get unreachableGroupMentionsCount() {
return this.unreachableGroupMentions.length;
}
get overMembersLimitMentionsCount() {
return this.overMembersLimitGroupMentions.length;
}
get hasUnreachableGroupMentions() {
return this.unreachableGroupMentionsCount > 0;
}
get hasOverMembersLimitGroupMentions() {
return this.overMembersLimitMentionsCount > 0;
}
get warningsCount() {
return (
this.unreachableGroupMentionsCount + this.overMembersLimitMentionsCount
);
}
get show() {
return (
this.hasTooManyMentions ||
this.hasUnreachableGroupMentions ||
this.hasOverMembersLimitGroupMentions
);
}
get listStyleClass() {
if (this.hasTooManyMentions) {
return "chat-mention-warnings-list__simple";
}
if (this.warningsCount > 1) {
return "chat-mention-warnings-list__multiple";
} else {
return "chat-mention-warnings-list__simple";
}
}
get warningHeaderText() {
if (this.mentionsCount <= this.warningsCount || this.hasTooManyMentions) {
return I18n.t("chat.mention_warning.groups.header.all");
} else {
return I18n.t("chat.mention_warning.groups.header.some");
}
}
get tooManyMentionsBody() {
if (!this.hasTooManyMentions) {
return;
}
let notificationLimit = I18n.t(
"chat.mention_warning.groups.notification_limit"
);
if (this.currentUser.staff) {
notificationLimit = htmlSafe(
`<a
target="_blank"
href="/admin/site_settings/category/plugins?filter=max_mentions_per_chat_message"
>
${notificationLimit}
</a>`
);
}
const settingLimit = I18n.t("chat.mention_warning.mentions_limit", {
count: this.siteSettings.max_mentions_per_chat_message,
});
return htmlSafe(
I18n.t("chat.mention_warning.too_many_mentions", {
notification_limit: notificationLimit,
limit: settingLimit,
})
);
}
get unreachableBody() {
if (!this.hasUnreachableGroupMentions) {
return;
}
if (this.unreachableGroupMentionsCount <= 2) {
return I18n.t("chat.mention_warning.groups.unreachable", {
group: this.unreachableGroupMentions[0],
group_2: this.unreachableGroupMentions[1],
count: this.unreachableGroupMentionsCount,
});
} else {
return I18n.t("chat.mention_warning.groups.unreachable_multiple", {
group: this.unreachableGroupMentions[0],
count: this.unreachableGroupMentionsCount - 1, //N others
});
}
}
get overMembersLimitBody() {
if (!this.hasOverMembersLimitGroupMentions) {
return;
}
let notificationLimit = I18n.t(
"chat.mention_warning.groups.notification_limit"
);
if (this.currentUser.staff) {
notificationLimit = htmlSafe(
`<a
target="_blank"
href="/admin/site_settings/category/plugins?filter=max_users_notified_per_group_mention"
>
${notificationLimit}
</a>`
);
}
const settingLimit = I18n.t("chat.mention_warning.groups.users_limit", {
count: this.siteSettings.max_users_notified_per_group_mention,
});
if (this.hasOverMembersLimitGroupMentions <= 2) {
return htmlSafe(
I18n.t("chat.mention_warning.groups.too_many_members", {
group: this.overMembersLimitGroupMentions[0],
group_2: this.overMembersLimitGroupMentions[1],
count: this.overMembersLimitMentionsCount,
notification_limit: notificationLimit,
limit: settingLimit,
})
);
} else {
return htmlSafe(
I18n.t("chat.mention_warning.groups.too_many_members_multiple", {
group: this.overMembersLimitGroupMentions[0],
count: this.overMembersLimitMentionsCount - 1, //N others
notification_limit: notificationLimit,
limit: settingLimit,
})
);
}
}
}