Carbon/src/js/events/membership.js

128 lines
3.1 KiB
JavaScript

const {UngroupableEvent} = require("./event")
const {ejs} = require("../basic")
const {extractDisplayName, resolveMxc, extractLocalpart} = require("../functions")
class MembershipEvent extends UngroupableEvent {
constructor(data) {
super(data)
this.class("c-message-event")
this.senderName = extractDisplayName(data)
if (data.content.avatar_url) {
this.smallAvatar = ejs("img")
.attribute("width", "32")
.attribute("height", "32")
.attribute("src", resolveMxc(data.content.avatar_url, 32, "crop"))
.class("c-message-event__avatar")
} else {
this.smallAvatar = ""
}
this.render()
}
static canRender(eventData) {
return eventData.type === "m.room.member"
}
renderInner(iconURL, elements) {
this.clearChildren()
this.child(
ejs("div").class("c-message-event__inner").child(
iconURL ? ejs("img").class("c-message-event__icon").attribute("width", "20").attribute("height", "20").attribute("src", iconURL) : "",
...elements
)
)
super.render()
}
}
class JoinedEvent extends MembershipEvent {
static canRender(eventData) {
return super.canRender(eventData) && eventData.content.membership === "join"
}
render() {
const changes = []
const prev = this.data.unsigned.prev_content
if (prev && prev.membership === "join") {
if (prev.avatar_url !== this.data.content.avatar_url) {
changes.push("changed their avatar")
}
if (prev.displayname !== this.data.content.displayname) {
changes.push(`changed their display name (was ${this.data.unsigned.prev_content.displayname})`)
}
}
let message
let iconURL
if (changes.length) {
message = " " + changes.join(", ")
iconURL = "static/profile-event.svg"
} else {
message = " joined the room"
iconURL = "static/join-event.svg"
}
this.renderInner(iconURL, [
this.smallAvatar,
this.senderName,
message
])
}
}
class InvitedEvent extends MembershipEvent {
static canRender(eventData) {
return super.canRender(eventData) && eventData.content.membership === "invite"
}
render() {
this.renderInner("static/invite-event.svg", [
this.smallAvatar,
`${extractLocalpart(this.data.sender)} invited ${this.data.state_key}` // full mxid for clarity
])
}
}
class LeaveEvent extends MembershipEvent {
static canRender(eventData) {
return super.canRender(eventData) && eventData.content.membership === "leave"
}
render() {
this.renderInner("static/leave-event.svg", [
this.smallAvatar,
this.senderName,
" left the room"
])
}
}
class BanEvent extends MembershipEvent {
static canRender(eventData) {
return super.canRender(eventData) && eventData.content.membership === "ban"
}
render() {
let message =
` left (banned by ${this.data.sender}`
+ (this.data.content.reason ? `, reason: ${this.data.content.reason}` : "")
+ ")"
this.renderInner("static/leave-event.svg", [
this.smallAvatar,
this.senderName,
message
])
}
}
class UnknownMembership extends MembershipEvent {
render() {
this.renderInner("", [
this.smallAvatar,
this.senderName,
ejs("i").text(" unknown membership event")
])
}
}
module.exports = [JoinedEvent, InvitedEvent, LeaveEvent, BanEvent, UnknownMembership]