Tims-Chat/files_wcf/js/Bastelstu.be/Chat/BoxRoomList.js

111 lines
2.7 KiB
JavaScript

/*
* Copyright (c) 2010-2018 Tim Düsterhus.
*
* Use of this software is governed by the Business Source License
* included in the LICENSE file.
*
* Change Date: 2024-11-01
*
* 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([
'./console',
'Bastelstu.be/_Push',
'WoltLabSuite/Core/Dom/Util',
'WoltLabSuite/Core/Timer/Repeating',
'Bastelstu.be/PromiseWrap/Ajax',
], function (console, Push, DomUtil, RepeatingTimer, Ajax) {
'use strict'
let timer = undefined
const mapping = new Map()
class BoxRoomList {
constructor(container) {
this.container = container
mapping.set(container, this)
if (timer == null) {
timer = new RepeatingTimer(
BoxRoomList.updateBoxes.bind(BoxRoomList),
60e3
)
}
Push.onConnect(timer.setDelta.bind(timer, 300e3)).catch((error) => {
console.debug(error)
})
Push.onDisconnect(timer.setDelta.bind(timer, 60e3)).catch((error) => {
console.debug(error)
})
Push.onMessage(
'be.bastelstu.chat.join',
BoxRoomList.updateBoxes.bind(BoxRoomList)
).catch((error) => {
console.debug(error)
})
Push.onMessage(
'be.bastelstu.chat.leave',
BoxRoomList.updateBoxes.bind(BoxRoomList)
).catch((error) => {
console.debug(error)
})
}
static updateBoxes() {
mapping.forEach((object) => {
object.update()
})
}
async update() {
const payload = {
className: 'chat\\data\\room\\RoomAction',
actionName: 'getBoxRoomList',
parameters: {},
}
payload.parameters.activeRoomID = this.container.dataset.activeRoomId
payload.parameters.boxID = this.container.dataset.boxId
payload.parameters.isSidebar = this.container.dataset.isSidebar
payload.parameters.skipEmptyRooms = this.container.dataset.skipEmptyRooms
this.replace(await Ajax.api(this, payload))
}
replace(data) {
if (data.returnValues.template == null)
throw new Error('template could not be found in returnValues')
const fragment = DomUtil.createFragmentFromHtml(
data.returnValues.template
)
const oldRoomList = this.container.querySelector('.chatBoxRoomList')
const newRoomList = fragment.querySelector('.chatBoxRoomList')
if (oldRoomList == null) {
throw new Error('.chatBoxRoomList could not be found in container')
}
if (newRoomList == null) {
throw new Error(
'.chatBoxRoomList could not be found in returned template'
)
}
if (oldRoomList.dataset.hash !== newRoomList.dataset.hash) {
this.container.replaceChild(newRoomList, oldRoomList)
}
}
_ajaxSetup() {
return { silent: true, ignoreError: true }
}
}
return BoxRoomList
})