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.
123 lines
4.9 KiB
123 lines
4.9 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import type { AppMessagesManager } from "../../lib/appManagers/appMessagesManager"; |
|
import type ChatTopbar from "./topbar"; |
|
import rootScope from "../../lib/rootScope"; |
|
import appMediaPlaybackController from "../appMediaPlaybackController"; |
|
import DivAndCaption from "../divAndCaption"; |
|
import PinnedContainer from "./pinnedContainer"; |
|
import Chat from "./chat"; |
|
import { cancelEvent } from "../../helpers/dom/cancelEvent"; |
|
import { attachClickEvent } from "../../helpers/dom/clickEvent"; |
|
import replaceContent from "../../helpers/dom/replaceContent"; |
|
import PeerTitle from "../peerTitle"; |
|
import { i18n } from "../../lib/langPack"; |
|
import { formatFullSentTime } from "../../helpers/date"; |
|
import { MediaProgressLine, VolumeSelector } from "../../lib/mediaPlayer"; |
|
import ButtonIcon from "../buttonIcon"; |
|
|
|
export default class ChatAudio extends PinnedContainer { |
|
private toggleEl: HTMLElement; |
|
private progressLine: MediaProgressLine; |
|
private volumeSelector: VolumeSelector; |
|
|
|
constructor(protected topbar: ChatTopbar, protected chat: Chat, protected appMessagesManager: AppMessagesManager) { |
|
super({ |
|
topbar, |
|
chat, |
|
listenerSetter: topbar.listenerSetter, |
|
className: 'audio', |
|
divAndCaption: new DivAndCaption( |
|
'pinned-audio', |
|
(title: string | HTMLElement | DocumentFragment, subtitle: string | HTMLElement | DocumentFragment) => { |
|
replaceContent(this.divAndCaption.title, title); |
|
replaceContent(this.divAndCaption.subtitle, subtitle); |
|
} |
|
), |
|
onClose: () => { |
|
appMediaPlaybackController.stop(); |
|
}, |
|
floating: true |
|
}); |
|
|
|
this.divAndCaption.border.remove(); |
|
|
|
const prevEl = ButtonIcon('pprevious active', {noRipple: true}); |
|
const nextEl = ButtonIcon('nnext active', {noRipple: true}); |
|
|
|
prevEl.innerHTML = `<svg class="missing-icon" viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet"><g><path class="missing-icon-path" d="M6 6h2v12H6zm3.5 6l8.5 6V6z"></path></g></svg>`; |
|
nextEl.innerHTML = `<svg class="missing-icon" viewBox="0 0 24 24" preserveAspectRatio="xMidYMid meet"><g><path class="missing-icon-path" d="M6 18l8.5-6L6 6v12zM16 6v12h2V6h-2z"></path></g></svg>`; |
|
|
|
const attachClick = (elem: HTMLElement, callback: () => void) => { |
|
attachClickEvent(elem, (e) => { |
|
cancelEvent(e); |
|
callback(); |
|
}, {listenerSetter: this.topbar.listenerSetter}); |
|
}; |
|
|
|
attachClick(prevEl, () => { |
|
appMediaPlaybackController.previous(); |
|
}); |
|
|
|
attachClick(nextEl, () => { |
|
appMediaPlaybackController.next(); |
|
}); |
|
|
|
this.toggleEl = ButtonIcon('', {noRipple: true}); |
|
this.toggleEl.classList.add('active', 'pinned-audio-ico', 'tgico'); |
|
attachClick(this.toggleEl, () => { |
|
appMediaPlaybackController.toggle(); |
|
}); |
|
this.wrapper.prepend(this.wrapper.firstElementChild, prevEl, this.toggleEl, nextEl); |
|
|
|
this.volumeSelector = new VolumeSelector(this.listenerSetter, true); |
|
const volumeProgressLineContainer = document.createElement('div'); |
|
volumeProgressLineContainer.classList.add('progress-line-container'); |
|
volumeProgressLineContainer.append(this.volumeSelector.container); |
|
const tunnel = document.createElement('div'); |
|
tunnel.classList.add('pinned-audio-volume-tunnel'); |
|
this.volumeSelector.btn.classList.add('pinned-audio-volume', 'active'); |
|
this.volumeSelector.btn.prepend(tunnel); |
|
this.volumeSelector.btn.append(volumeProgressLineContainer); |
|
this.wrapperUtils.prepend(this.volumeSelector.btn); |
|
|
|
const progressWrapper = document.createElement('div'); |
|
progressWrapper.classList.add('pinned-audio-progress-wrapper'); |
|
|
|
this.progressLine = new MediaProgressLine(undefined, undefined, true, true); |
|
this.progressLine.container.classList.add('pinned-audio-progress'); |
|
progressWrapper.append(this.progressLine.container); |
|
this.wrapper.insertBefore(progressWrapper, this.wrapperUtils); |
|
|
|
this.topbar.listenerSetter.add(rootScope)('media_play', ({doc, message, media}) => { |
|
let title: string | HTMLElement, subtitle: string | HTMLElement | DocumentFragment; |
|
if(doc.type === 'voice' || doc.type === 'round') { |
|
title = new PeerTitle({peerId: message.fromId}).element; |
|
|
|
//subtitle = 'Voice message'; |
|
subtitle = formatFullSentTime(message.date); |
|
} else { |
|
title = doc.audioTitle || doc.fileName; |
|
subtitle = doc.audioPerformer || i18n('AudioUnknownArtist'); |
|
} |
|
|
|
this.progressLine.setMedia(media); |
|
|
|
this.fill(title, subtitle, message); |
|
this.toggleEl.classList.add('flip-icon'); |
|
this.toggle(false); |
|
}); |
|
|
|
this.topbar.listenerSetter.add(rootScope)('media_pause', () => { |
|
this.toggleEl.classList.remove('flip-icon'); |
|
}); |
|
|
|
this.topbar.listenerSetter.add(rootScope)('media_stop', () => { |
|
this.toggle(true); |
|
}); |
|
} |
|
}
|
|
|