|
|
|
/*
|
|
|
|
* 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);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|