// SPDX-FileCopyrightText: 2024 John Livingston // // SPDX-License-Identifier: AGPL-3.0-only import type { RegisterClientOptions } from '@peertube/peertube-types/client' import type { Video } from '@peertube/peertube-types' import type { LiveChatSettings } from '../lib/contexts/peertube' import { logger } from '../../utils/logger' import { html, render } from 'lit' async function shareChatUrl ( registerOptions: RegisterClientOptions, settings: LiveChatSettings, video: Video ): Promise { const peertubeHelpers = registerOptions.peertubeHelpers const labelShare = await peertubeHelpers.translate(LOC_SHARE_CHAT_LINK) // function save (form: ShareForm): void { // if (!window.localStorage) { // return // } // const v = { // version: 1, // in case we add incompatible values in a near feature // readonly: !!form.readonly.checked, // withscroll: !!form.withscroll.checked, // transparent: !!form.transparent.checked, // autocolors: !!form.autoColors?.checked, // generateIframe: !!form.generateIframe.checked, // protocol: !form.radioProtocolWeb || form.radioProtocolWeb.checked ? 'web' : 'xmpp' // } // window.localStorage.setItem('peertube-plugin-livechat-shareurl', JSON.stringify(v)) // } // function restore (form: ShareForm): void { // if (!window.localStorage) { // return // } // const s = window.localStorage.getItem('peertube-plugin-livechat-shareurl') // if (!s) { // return // } // let v: any // try { // v = JSON.parse(s) // if (!v || (typeof v !== 'object') || v.version !== 1) { // return // } // form.readonly.checked = !!v.readonly // form.withscroll.checked = !!v.withscroll // form.transparent.checked = !!v.transparent // if (form.autoColors) { // form.autoColors.checked = !!v.autocolors // } // form.generateIframe.checked = !!v.generateIframe // if (form.radioProtocolXMPP && v.protocol === 'xmpp') { // form.radioProtocolXMPP.checked = true // } else if (form.radioProtocolWeb) { // form.radioProtocolWeb.checked = true // } // } catch (err) { // logger.error(err as string) // } // } logger.info('Opening the share modal...') // We can't just put in modalContent, Peertube sanitize it... const observer = new MutationObserver(mutations => { for (const { addedNodes } of mutations) { addedNodes.forEach(node => { if ((node as HTMLElement).localName === 'ngb-modal-window') { logger.info('Detecting a new modal, checking if this is the good one...') const title = (node as HTMLElement).querySelector?.('.modal-title') if (!(title?.textContent === labelShare)) { return } logger.info('Yes, it is the good modal!') observer.disconnect() const modalBodyElem: HTMLElement | null = (node as HTMLElement).querySelector('.modal-body') if (!modalBodyElem) { logger.error('Modal has no body... Dont know how to fill it.') return } modalBodyElem.childNodes.forEach(child => modalBodyElem.removeChild(child)) render(html` `, modalBodyElem) } }) } }) observer.observe(document.body, { childList: true }) peertubeHelpers.showModal({ title: labelShare, content: '', close: true }) // just in case, remove the observer after a timeout, if not already done... setTimeout(() => { observer.disconnect() }, 1000) } export { shareChatUrl }