Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.3 KiB
97 lines
3.3 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import AvatarElement from '../avatar'; |
|
import PopupElement, {addCancelButton, PopupButton, PopupOptions} from '.'; |
|
import {i18n, LangPackKey} from '../../lib/langPack'; |
|
import CheckboxField, {CheckboxFieldOptions} from '../checkboxField'; |
|
import setInnerHTML from '../../helpers/dom/setInnerHTML'; |
|
|
|
export type PopupPeerButton = Omit<PopupButton, 'callback'> & Partial<{callback: PopupPeerButtonCallback}>; |
|
export type PopupPeerButtonCallbackCheckboxes = Set<LangPackKey>; |
|
export type PopupPeerButtonCallback = (checkboxes?: PopupPeerButtonCallbackCheckboxes) => void; |
|
export type PopupPeerCheckboxOptions = CheckboxFieldOptions & {checkboxField?: CheckboxField}; |
|
|
|
export type PopupPeerOptions = Omit<PopupOptions, 'buttons' | 'title'> & Partial<{ |
|
peerId: PeerId, |
|
title: string | HTMLElement, |
|
titleLangKey: LangPackKey, |
|
titleLangArgs: any[], |
|
noTitle: boolean, |
|
description: string | DocumentFragment, |
|
descriptionLangKey: LangPackKey, |
|
descriptionLangArgs: any[], |
|
buttons: Array<PopupPeerButton>, |
|
checkboxes: Array<PopupPeerCheckboxOptions> |
|
}>; |
|
export default class PopupPeer extends PopupElement { |
|
protected description: HTMLParagraphElement; |
|
|
|
constructor(private className: string, options: PopupPeerOptions = {}) { |
|
super('popup-peer' + (className ? ' ' + className : ''), { |
|
overlayClosable: true, |
|
...options, |
|
title: true, |
|
buttons: options.buttons && addCancelButton(options.buttons) |
|
}); |
|
|
|
if(options.peerId) { |
|
const avatarEl = new AvatarElement(); |
|
avatarEl.classList.add('avatar-32'); |
|
avatarEl.updateWithOptions({ |
|
isDialog: true, |
|
peerId: options.peerId |
|
}); |
|
this.header.prepend(avatarEl); |
|
} |
|
|
|
if(!options.noTitle) { |
|
if(options.titleLangKey || !options.title) this.title.append(i18n(options.titleLangKey || 'AppName', options.titleLangArgs)); |
|
else if(options.title instanceof HTMLElement) { |
|
this.title.append(options.title); |
|
} else this.title.innerText = options.title || ''; |
|
} |
|
|
|
const fragment = document.createDocumentFragment(); |
|
|
|
if(options.descriptionLangKey || options.description) { |
|
const p = this.description = document.createElement('p'); |
|
p.classList.add('popup-description'); |
|
if(options.descriptionLangKey) p.append(i18n(options.descriptionLangKey, options.descriptionLangArgs)); |
|
else if(options.description) setInnerHTML(p, options.description); |
|
|
|
fragment.append(p); |
|
} |
|
|
|
if(options.checkboxes) { |
|
this.container.classList.add('have-checkbox'); |
|
|
|
options.checkboxes.forEach((o) => { |
|
o.withRipple = true; |
|
const checkboxField = new CheckboxField(o); |
|
o.checkboxField = checkboxField; |
|
fragment.append(checkboxField.label); |
|
}); |
|
|
|
options.buttons.forEach((button) => { |
|
if(button.callback) { |
|
const original = button.callback; |
|
button.callback = () => { |
|
const c: Set<LangPackKey> = new Set(); |
|
options.checkboxes.forEach((o) => { |
|
if(o.checkboxField.checked) { |
|
c.add(o.text); |
|
} |
|
}); |
|
original(c); |
|
}; |
|
} |
|
}); |
|
} |
|
|
|
this.container.insertBefore(fragment, this.header.nextElementSibling); |
|
} |
|
}
|
|
|