// SPDX-FileCopyrightText: 2024 Mehdi Benadel // // SPDX-License-Identifier: AGPL-3.0-only import type { RegisterClientOptions } from '@peertube/peertube-types/client' import type { ChannelConfiguration } from 'shared/lib/types' import { html } from 'lit' import { customElement, property, state } from 'lit/decorators.js' import { ptTr } from '../../lib/directives/translation' import { Task } from '@lit/task' import { ChannelDetailsService } from '../services/channel-details' import { provide } from '@lit/context' import { channelConfigurationContext, channelDetailsServiceContext } from '../contexts/channel' import { registerClientOptionsContext } from '../../lib/contexts/peertube' import { LivechatElement } from '../../lib/elements/livechat' @customElement('livechat-channel-configuration') export class ChannelConfigurationElement extends LivechatElement { @provide({ context: registerClientOptionsContext }) @property({ attribute: false }) public registerClientOptions: RegisterClientOptions | undefined @property({ attribute: false }) public channelId: number | undefined @provide({ context: channelConfigurationContext }) @state() public _channelConfiguration: ChannelConfiguration | undefined @provide({ context: channelDetailsServiceContext }) private _channelDetailsService: ChannelDetailsService | undefined @state() public _formStatus: boolean | any = undefined private readonly _asyncTaskRender = new Task(this, { task: async ([registerClientOptions]) => { if (registerClientOptions) { this._channelDetailsService = new ChannelDetailsService(registerClientOptions) this._channelConfiguration = await this._channelDetailsService.fetchConfiguration(this.channelId ?? 0) } }, args: () => [this.registerClientOptions] }) private readonly _saveConfig = (ev?: Event): void => { ev?.preventDefault() if (this._channelDetailsService && this._channelConfiguration) { this._channelDetailsService.saveOptions(this._channelConfiguration.channel.id, this._channelConfiguration.configuration) .then(() => { this._formStatus = { success: true } console.log('Configuration has been updated') this.requestUpdate('_formStatus') }) .catch((error) => { this._formStatus = error console.log(`An error occurred : ${JSON.stringify(this._formStatus)}`) this.requestUpdate('_formStatus') }) } } protected override render = (): unknown => { const tableHeaderList = { forbiddenWords: { entries: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_DESC2) }, regex: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REGEXP_DESC) }, applyToModerators: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_APPLYTOMODERATORS_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_APPLYTOMODERATORS_DESC) }, label: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_LABEL_DESC) }, reason: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_REASON_DESC) }, comments: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_COMMENTS_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_FORBIDDEN_WORDS_COMMENTS_DESC) } }, quotes: { messages: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_LABEL2), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DESC2) }, delay: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DELAY_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_QUOTE_DELAY_DESC) } }, commands: { command: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_COMMAND_CMD_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_COMMAND_CMD_DESC) }, message: { colName: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_COMMAND_MESSAGE_LABEL), description: ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_COMMAND_MESSAGE_DESC) } } } const tableSchema = { forbiddenWords: { entries: { inputType: 'textarea', default: [''], separator: '\n' }, regex: { inputType: 'checkbox', default: false }, applyToModerators: { inputType: 'checkbox', default: false }, label: { inputType: 'text', default: '' }, reason: { inputType: 'text', default: '', datalist: [] }, comments: { inputType: 'textarea', default: '' } }, quotes: { messages: { inputType: 'textarea', default: [''], separator: '\n' }, delay: { inputType: 'number', default: 10 } }, commands: { command: { inputType: 'text', default: '' }, message: { inputType: 'text', default: '' } } } return this._asyncTaskRender.render({ complete: () => html`

${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_TITLE)}: ${this._channelConfiguration?.channel.displayName} ${this._channelConfiguration?.channel.name}

${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_DESC)}

${this._channelConfiguration?.configuration.bot.enabled ? html`
${ptTr(LOC_LIVECHAT_CONFIGURATION_CHANNEL_BOT_NICKNAME)} { if (event?.target && this._channelConfiguration) { this._channelConfiguration.configuration.bot.nickname = (event.target as HTMLInputElement).value } this.requestUpdate('_channelConfiguration') } } value="${this._channelConfiguration?.configuration.bot.nickname}" />
` : '' }
${this._channelConfiguration?.configuration.bot.enabled ? html`
{ if (this._channelConfiguration) { this._channelConfiguration.configuration.bot.forbiddenWords = e.detail this.requestUpdate('_channelConfiguration') } } } .formName=${'forbidden-words'}>
{ if (this._channelConfiguration) { this._channelConfiguration.configuration.bot.quotes = e.detail this.requestUpdate('_channelConfiguration') } } } .formName=${'quote'}>
{ if (this._channelConfiguration) { this._channelConfiguration.configuration.bot.commands = e.detail this.requestUpdate('_channelConfiguration') } } } .formName=${'command'}>
` : '' }
${(this._formStatus && this._formStatus.success === undefined) ? html`` : '' } ${(this._formStatus && this._formStatus.success === true) ? html`` : '' }
` }) } }