peertube-plugin-livechat/conversejs/lib/plugins/livechat-specific/heading.ts

76 lines
2.5 KiB
TypeScript

// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
//
// SPDX-License-Identifier: AGPL-3.0-only
import { destroyMUC } from './utils'
/**
* Do some customization on MUCHeading:
* * adds a logout button for users that are authenticated with an external account
* * change the destroyMUC handler
*
* @param plugin The plugin object
*/
export function customizeHeading (plugin: any): void {
const _converse = plugin._converse
_converse.api.listen.on('getHeadingButtons', getHeadingButtons.bind(plugin))
overrideMUCHeadingElement(_converse)
}
function getHeadingButtons (this: any, view: any, buttons: any[]): any {
const _converse = this._converse
if (view.model.get('type') !== _converse.constants.CHATROOMS_TYPE) {
// only on MUC.
return buttons
}
if (_converse.api.settings.get('livechat_specific_external_authent')) {
// Adding a logout button
buttons.push({
i18n_text: _converse.__('Log out'),
handler: async (ev: Event) => {
ev.preventDefault()
ev.stopPropagation()
const messages = [_converse.__('Are you sure you want to leave this groupchat?')]
const result = await _converse.api.confirm(_converse.__('Confirm'), messages)
if (!result) { return }
// Deleting access token in sessionStorage.
window.sessionStorage.removeItem('peertube-plugin-livechat-external-auth-oidc-token')
const reconnectMode = _converse.api.settings.get('livechat_external_auth_reconnect_mode')
if (reconnectMode === 'button-close-open') {
const button = document.getElementsByClassName('peertube-plugin-livechat-button-close')[0]
if ((button as HTMLAnchorElement).click) { (button as HTMLAnchorElement).click() }
return
}
window.location.reload()
},
a_class: 'close-chatbox-button',
icon_class: 'fa-sign-out-alt',
name: 'signout'
})
}
return buttons
}
/**
* Override the MUCHeading custom element, to customize the destroyMUC function.
*/
function overrideMUCHeadingElement (_converse: any): void {
const MUCHeading = _converse.api.elements.registry['converse-muc-heading']
if (MUCHeading) {
class MUCHeadingOverloaded extends MUCHeading {
async destroy (ev: Event): Promise<void> {
ev.preventDefault()
await destroyMUC(_converse, this.model) // here we call a custom version of destroyMUC
}
}
_converse.api.elements.define('converse-muc-heading', MUCHeadingOverloaded)
}
}