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

89 lines
2.7 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([ './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
});