Tims-Chat/files_wcf/js/Bastelstu.be/Chat/MessageType/Info.js

90 lines
2.5 KiB
JavaScript
Raw Normal View History

2018-08-16 22:30:59 +00:00
/*
* Copyright (c) 2010-2018 Tim Düsterhus.
*
* Use of this software is governed by the Business Source License
* included in the LICENSE file.
*
2020-11-01 16:09:27 +00:00
* Change Date: 2024-11-01
2018-08-16 22:30:59 +00:00
*
* On the date above, in accordance with the Business Source
* License, use of this software will be governed by version 2
* or later of the General Public License.
*/
define([ 'WoltLabSuite/Core/Dom/Traverse'
, 'WoltLabSuite/Core/Language'
, '../Helper'
, '../MessageType'
], function (DomTraverse, Language, Helper, MessageType) {
"use strict";
const decorators = Symbol('decorators')
class Info extends MessageType {
constructor(...superArgs) {
super(...superArgs)
this[decorators] = new Set()
}
addDecorator(decorator) {
if (typeof decorator !== 'function') {
throw new TypeError('Supplied argument must be a function')
}
this[decorators].add(decorator)
}
getReferencedUsers(message) {
return super.getReferencedUsers(message).concat([ message.payload.user.userID ])
}
render(message) {
const rooms = message.payload.rooms.map(function (item) {
const aug = { lastPull: null
, lastPullHTML: null
, lastPush: null
, lastPushHTML: null
}
if (item.lastPull) {
aug.lastPull = new Date(item.lastPull * 1000)
aug.lastPullHTML = Helper.getTimeElementHTML(aug.lastPull)
}
if (item.lastPush) {
aug.lastPush = new Date(item.lastPush * 1000)
aug.lastPushHTML = Helper.getTimeElementHTML(aug.lastPush)
}
return Object.assign({ }, item, aug)
})
const payload = Helper.deepFreeze(
Array.from(this[decorators]).reduce( (payload, decorator) => decorator(payload)
, Object.assign({ }, message.payload, { rooms })
)
)
const fragment = super.render(new Proxy(message, {
get: function (target, property) {
if (property === 'payload') return payload
return target[property]
}
}))
const icon = elCreate('span')
icon.classList.add('icon', 'icon16', 'fa-times', 'jsTooltip', 'hideIcon')
icon.setAttribute('title', Language.get('wcf.global.button.hide'))
icon.addEventListener('click', () => elHide(DomTraverse.parentBySel(icon, '.chatMessageBoundary')))
const elem = fragment.querySelector('.chatMessage .containerList > li:first-child .containerHeadline')
elem.insertBefore(icon, elem.firstChild)
return fragment
}
}
return Info
});