/* * https://github.com/morethanwords/tweb * Copyright (C) 2019-2021 Eduard Kuzmenko * https://github.com/morethanwords/tweb/blob/master/LICENSE */ import replaceContent from '../../helpers/dom/replaceContent'; import toHHMMSS from '../../helpers/string/toHHMMSS'; import CALL_STATE from '../../lib/calls/callState'; import {i18n, LangPackKey} from '../../lib/langPack'; export default class CallDescriptionElement { private container: HTMLElement; private state: CALL_STATE; private interval: number; constructor(private appendTo: HTMLElement) { this.container = document.createElement('div'); this.container.classList.add('call-description'); } public detach() { if(this.interval !== undefined) { clearInterval(this.interval); this.interval = undefined; } this.container.remove(); this.state = undefined; } public update(instance: any) { const {connectionState} = instance; if(this.state === connectionState) { return; } this.state = connectionState; let element: HTMLElement; if(connectionState === CALL_STATE.CONNECTED) { element = document.createElement('span'); element.classList.add('call-description-duration'); const setTime = () => { element.innerText = toHHMMSS(instance.duration, true); }; this.interval = window.setInterval(setTime, 1000); setTime(); } else { let langPackKey: LangPackKey; switch(connectionState) { case CALL_STATE.PENDING: langPackKey = instance.isOutgoing ? 'Call.StatusRinging' : 'Call.StatusCalling'; break; case CALL_STATE.REQUESTING: langPackKey = 'Call.StatusRequesting'; break; case CALL_STATE.EXCHANGING_KEYS: langPackKey = 'VoipExchangingKeys'; break; case CALL_STATE.CLOSED: langPackKey = instance.connectedAt !== undefined ? 'Call.StatusEnded' : 'Call.StatusFailed'; break; default: langPackKey = 'Call.StatusConnecting'; break; } element = i18n(langPackKey); if(this.interval !== undefined) { clearInterval(this.interval); this.interval = undefined; } } this.container.classList.toggle('has-duration', connectionState === CALL_STATE.CONNECTED); replaceContent(this.container, element); if(!this.container.parentElement) { this.appendTo.append(this.container); } } }