import { isEmpty } from "@ember/utils"; import { wantsNewWindow } from "discourse/lib/intercept-click"; import RawHtml from "discourse/widgets/raw-html"; import { createWidget } from "discourse/widgets/widget"; import DiscourseURL from "discourse/lib/url"; import { h } from "virtual-dom"; import { emojiUnescape } from "discourse/lib/text"; import { postUrl, escapeExpression, formatUsername } from "discourse/lib/utilities"; import { setTransientHeader } from "discourse/lib/ajax"; import { userPath } from "discourse/lib/url"; import { iconNode } from "discourse-common/lib/icon-library"; export const DefaultNotificationItem = createWidget( "default-notification-item", { tagName: "li", buildClasses(attrs) { const classNames = []; if (attrs.get("read")) { classNames.push("read"); } if (attrs.is_warning) { classNames.push("is-warning"); } return classNames; }, url(data) { const attrs = this.attrs; const badgeId = data.badge_id; if (badgeId) { let badgeSlug = data.badge_slug; if (!badgeSlug) { const badgeName = data.badge_name; badgeSlug = badgeName.replace(/[^A-Za-z0-9_]+/g, "-").toLowerCase(); } let username = data.username; username = username ? "?username=" + username.toLowerCase() : ""; return Discourse.getURL( "/badges/" + badgeId + "/" + badgeSlug + username ); } const topicId = attrs.topic_id; if (topicId) { return postUrl(attrs.slug, topicId, attrs.post_number); } if (data.group_id) { return userPath(data.username + "/messages/group/" + data.group_name); } }, description(data) { const badgeName = data.badge_name; if (badgeName) { return escapeExpression(badgeName); } if (this.attrs.fancy_title) { if (this.attrs.topic_id) { return `${this.attrs.fancy_title}`; } return this.attrs.fancy_title; } const description = data.topic_title; return isEmpty(description) ? "" : escapeExpression(description); }, text(notificationName, data) { const username = formatUsername(data.display_username); const description = this.description(data); return I18n.t(`notifications.${notificationName}`, { description, username }); }, icon(notificationName) { return iconNode(`notification.${notificationName}`); }, notificationTitle(notificationName) { if (notificationName) { return I18n.t(`notifications.titles.${notificationName}`); } else { return ""; } }, html(attrs) { const notificationType = attrs.notification_type; const lookup = this.site.get("notificationLookup"); const notificationName = lookup[notificationType]; let { data } = attrs; let text = emojiUnescape(this.text(notificationName, data)); let icon = this.icon(notificationName, data); const title = this.notificationTitle(notificationName, data); // We can use a `
` tag here once other languages have fixed their HTML // translations. let html = new RawHtml({ html: `