// SPDX-FileCopyrightText: 2024 John Livingston // // SPDX-License-Identifier: AGPL-3.0-only import { tplPoll } from '../templates/poll.js' import { CustomElement } from 'shared/components/element.js' import { 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() }) } 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 } 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() this.model.sendMessage({ body: '!' + choice.choice }) } closePoll (ev) { ev.preventDefault() this.model.set('current_poll', undefined) } } api.elements.define('livechat-converse-muc-poll', MUCPollView)