83 lines
2.4 KiB
JavaScript
83 lines
2.4 KiB
JavaScript
// SPDX-FileCopyrightText: 2024 John Livingston <https://www.john-livingston.fr/>
|
|
//
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { tplPoll } from '../templates/poll.js'
|
|
import { CustomElement } from 'shared/components/element.js'
|
|
import { converse, _converse, api } from '@converse/headless/core'
|
|
import '../styles/poll.scss'
|
|
|
|
export default class MUCPollView extends CustomElement {
|
|
static get properties () {
|
|
return {
|
|
model: { type: Object, attribute: true },
|
|
collapsed: { type: Boolean, attribute: false },
|
|
buttonDisabled: { type: Boolean, attribute: false }
|
|
}
|
|
}
|
|
|
|
async initialize () {
|
|
this.collapsed = false
|
|
this.buttonDisabled = false
|
|
if (!this.model) {
|
|
return
|
|
}
|
|
this.listenTo(this.model, 'change:current_poll', () => {
|
|
this.buttonDisabled = false
|
|
this.requestUpdate()
|
|
})
|
|
this.listenTo(this.model.occupants, 'change:role', occupant => {
|
|
if (occupant.get('jid') !== _converse.bare_jid) { // only for myself
|
|
return
|
|
}
|
|
// visitors cant vote. So we must refresh the polls results when current occupant role changes.
|
|
this.requestUpdate()
|
|
})
|
|
}
|
|
|
|
render () {
|
|
const currentPoll = this.model?.get('current_poll')
|
|
const entered = this.model.session.get('connection_status') === converse.ROOMSTATUS.ENTERED
|
|
const canVote = entered && this.model.getOwnRole() !== 'visitor'
|
|
return tplPoll(this, currentPoll, canVote)
|
|
}
|
|
|
|
toggle (ev) {
|
|
ev.preventDefault()
|
|
this.collapsed = !this.collapsed
|
|
}
|
|
|
|
async voteFor (choice) {
|
|
if (this.buttonDisabled) { return }
|
|
|
|
const currentPoll = this.model?.get('current_poll')
|
|
if (!currentPoll) { return }
|
|
if (currentPoll.over) { return }
|
|
|
|
console.info('User has voted for choice: ', choice)
|
|
// We disable vote buttons until next refresh:
|
|
this.buttonDisabled = true
|
|
this.requestUpdate()
|
|
|
|
await this.model.sendMessage({
|
|
body: '!' + choice.choice
|
|
})
|
|
|
|
// Dispatching an event.
|
|
// When in Peertube interface, this will open a Peertube notifier with a message.
|
|
// FIXME: we should only trigger this on the message echo or bounce,
|
|
// but seems ConverseJs does not provide any promise for that.
|
|
const event = new Event('livechat-poll-vote', {
|
|
bubbles: true
|
|
})
|
|
this.dispatchEvent(event)
|
|
}
|
|
|
|
closePoll (ev) {
|
|
ev.preventDefault()
|
|
this.model.set('current_poll', undefined)
|
|
}
|
|
}
|
|
|
|
api.elements.define('livechat-converse-muc-poll', MUCPollView)
|