4168b2ce41
* various fix and improvements
96 lines
3.1 KiB
JavaScript
96 lines
3.1 KiB
JavaScript
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { _converse, converse } from '../../../src/headless/core.js'
|
|
import { getHeadingButtons } from './utils.js'
|
|
import { POLL_MESSAGE_TAG, POLL_QUESTION_TAG, POLL_CHOICE_TAG } from './constants.js'
|
|
import './modals/poll-form.js'
|
|
import './components/poll-view.js'
|
|
import './components/poll-form-view.js'
|
|
|
|
const { sizzle } = converse.env
|
|
|
|
converse.plugins.add('livechat-converse-poll', {
|
|
dependencies: ['converse-muc', 'converse-disco'],
|
|
|
|
initialize () {
|
|
// _converse.api.listen.on('chatRoomInitialized', muc => {
|
|
// muc.features.on('change:' + XMLNS_POLL, () => {
|
|
// // TODO: refresh headingbuttons?
|
|
// })
|
|
// })
|
|
// adding the poll actions in the MUC heading buttons:
|
|
_converse.api.listen.on('getHeadingButtons', getHeadingButtons)
|
|
|
|
_converse.api.listen.on('parseMUCMessage', (stanza, attrs) => {
|
|
// Checking if there is any poll data in the message.
|
|
const poll = sizzle(POLL_MESSAGE_TAG, stanza)?.[0]
|
|
if (!poll) {
|
|
return attrs
|
|
}
|
|
const question = sizzle(POLL_QUESTION_TAG, poll)?.[0]
|
|
const choices = sizzle(POLL_CHOICE_TAG, poll)
|
|
if (!question || !choices.length) {
|
|
return attrs
|
|
}
|
|
|
|
const endDate = poll.hasAttribute('end')
|
|
? new Date(1000 * parseInt(poll.getAttribute('end')))
|
|
: null
|
|
|
|
const currentPoll = {
|
|
question: question.textContent,
|
|
id: poll.getAttribute('id'),
|
|
votes: parseInt(poll.getAttribute('votes') ?? 0),
|
|
over: poll.hasAttribute('over'),
|
|
endDate: endDate,
|
|
choices: choices.map(c => {
|
|
return {
|
|
label: c.textContent,
|
|
choice: c.getAttribute('choice'),
|
|
votes: parseInt(c.getAttribute('votes') ?? 0)
|
|
}
|
|
})
|
|
}
|
|
|
|
return Object.assign(
|
|
attrs,
|
|
{
|
|
current_poll: currentPoll
|
|
}
|
|
)
|
|
})
|
|
},
|
|
|
|
overrides: {
|
|
ChatRoom: {
|
|
onMessage: function onMessage (attrs) {
|
|
if (!attrs.current_poll) {
|
|
return this.__super__.onMessage(attrs)
|
|
}
|
|
// We intercept poll messages, to show the banner.
|
|
// Note: we also show the message in the chat.
|
|
if (attrs.is_delayed || attrs.is_archived) {
|
|
if (attrs.current_poll.over) {
|
|
console.info('Got a delayed/archived poll message for an poll that is over, just displaying in the chat')
|
|
return this.__super__.onMessage(attrs)
|
|
}
|
|
console.info('Got a delayed/archived poll message, just dropping')
|
|
return
|
|
}
|
|
|
|
console.info('Got a poll message, setting it as the current_poll')
|
|
this.set('current_poll', attrs.current_poll)
|
|
// this will be displayed by the livechat-converse-muc-poll custom element,
|
|
// which is inserted in the DOM by the muc.js template overload.
|
|
if (attrs.current_poll.over) {
|
|
console.info('The poll is over, displaying the message in the chat')
|
|
return this.__super__.onMessage(attrs)
|
|
}
|
|
// Dropping the message.
|
|
}
|
|
}
|
|
}
|
|
})
|