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-10-20 16:01:58 +00:00
|
|
|
* Change Date: 2024-10-20
|
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([ 'Bastelstu.be/PromiseWrap/Ajax'
|
|
|
|
, 'WoltLabSuite/Core/Core'
|
|
|
|
, './User'
|
|
|
|
], function (Ajax, Core, User) {
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const DEPENDENCIES = [ 'sessionID', 'roomID' ]
|
|
|
|
/**
|
|
|
|
* Represents a chat room.
|
|
|
|
*/
|
|
|
|
class Room {
|
|
|
|
constructor(sessionID, roomID) {
|
|
|
|
this.sessionID = sessionID
|
|
|
|
this.roomID = roomID
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends a request to join the room.
|
|
|
|
*
|
|
|
|
* @returns {Promise}
|
|
|
|
*/
|
|
|
|
async join() {
|
|
|
|
const payload = { className: 'chat\\data\\room\\RoomAction'
|
|
|
|
, actionName: 'join'
|
|
|
|
, parameters: { roomID: this.roomID
|
|
|
|
, sessionID: this.sessionID
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Ajax.api(this, payload)
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends a request to leave the room.
|
|
|
|
*
|
|
|
|
* @param {boolean} unload Send a beacon if true'ish and a regular AJAX request otherwise.
|
|
|
|
*/
|
|
|
|
leave(unload = false) {
|
|
|
|
const payload = { className: 'chat\\data\\room\\RoomAction'
|
|
|
|
, actionName: 'leave'
|
|
|
|
, parameters: { roomID: this.roomID
|
|
|
|
, sessionID: this.sessionID
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (unload && FormData && (navigator.sendBeacon || window.fetch)) {
|
|
|
|
// Ordinary AJAX requests are unreliable during unload:
|
|
|
|
// Use navigator.sendBeacon if available, otherwise hope
|
|
|
|
// for the best and clean up based on a time out.
|
|
|
|
|
|
|
|
const url = WSC_API_URL + 'index.php?ajax-proxy/&t=' + SECURITY_TOKEN
|
|
|
|
|
|
|
|
const formData = new FormData()
|
|
|
|
Core.serialize(payload)
|
|
|
|
.split('&')
|
|
|
|
.map((item) => item.split('='))
|
|
|
|
.map((item) => item.map(decodeURIComponent))
|
|
|
|
.forEach((item) => formData.append(item[0], item[1]))
|
|
|
|
|
|
|
|
if (navigator.sendBeacon) {
|
|
|
|
navigator.sendBeacon(url, formData)
|
|
|
|
}
|
|
|
|
|
|
|
|
if (window.fetch) {
|
|
|
|
fetch(url, { method: 'POST', keepalive: true, redirect: 'follow', body: formData })
|
|
|
|
}
|
|
|
|
|
|
|
|
return Promise.resolve()
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return Ajax.api(this, payload)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends a request to retrieve the userIDs inhabiting this room.
|
|
|
|
*
|
|
|
|
* @returns {Promise}
|
|
|
|
*/
|
|
|
|
async getUsers() {
|
|
|
|
const payload = { className: 'chat\\data\\room\\RoomAction'
|
|
|
|
, actionName: 'getUsers'
|
|
|
|
, objectIDs: [ this.roomID ]
|
|
|
|
}
|
|
|
|
|
|
|
|
const result = await Ajax.api(this, payload)
|
|
|
|
|
|
|
|
return Object.values(result.returnValues).map(user => new User(user))
|
|
|
|
}
|
|
|
|
|
|
|
|
_ajaxSetup() {
|
|
|
|
return { silent: true
|
|
|
|
, ignoreError: true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
Room.DEPENDENCIES = DEPENDENCIES
|
|
|
|
|
|
|
|
return Room
|
|
|
|
});
|