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.
121 lines
3.9 KiB
121 lines
3.9 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import {GroupCallParticipant} from '../../layer'; |
|
import type {GroupCallOutputSource} from '../../lib/appManagers/appGroupCallsManager'; |
|
import {i18n} from '../../lib/langPack'; |
|
import PeerTitle from '../peerTitle'; |
|
import {getGroupCallParticipantMutedState} from '.'; |
|
import GroupCallParticipantMutedIcon from './participantMutedIcon'; |
|
import GroupCallParticipantStatusElement from './participantStatus'; |
|
import GroupCallInstance from '../../lib/calls/groupCallInstance'; |
|
import callVideoCanvasBlur from '../call/videoCanvasBlur'; |
|
import getPeerId from '../../lib/appManagers/utils/peers/getPeerId'; |
|
import {AppManagers} from '../../lib/appManagers/managers'; |
|
|
|
const className = 'group-call-participant-video'; |
|
|
|
export type GroupCallParticipantVideoType = 'video' | 'presentation'; |
|
export default class GroupCallParticipantVideoElement { |
|
public container: HTMLElement; |
|
private peerTitle: PeerTitle; |
|
private subtitle: HTMLElement; |
|
private info: HTMLElement; |
|
private left: HTMLElement; |
|
private right: HTMLElement; |
|
private header: HTMLElement; |
|
private groupCallParticipantMutedIcon: GroupCallParticipantMutedIcon; |
|
private groupCallParticipantStatus: GroupCallParticipantStatusElement; |
|
|
|
constructor(private managers: AppManagers, private instance: GroupCallInstance, public source: GroupCallOutputSource) { |
|
this.container = document.createElement('div'); |
|
this.container.classList.add(className + '-container'); |
|
|
|
this.info = document.createElement('div'); |
|
this.info.classList.add(className + '-info'); |
|
|
|
this.left = document.createElement('div'); |
|
this.left.classList.add(className + '-info-left'); |
|
|
|
this.right = document.createElement('div'); |
|
this.right.classList.add(className + '-info-right'); |
|
|
|
this.info.append(this.left, this.right); |
|
|
|
this.container.append(this.info); |
|
} |
|
|
|
public setPinned(value: boolean) { |
|
if(!value) { |
|
if(this.header) { |
|
this.header.remove(); |
|
this.header = undefined; |
|
} |
|
|
|
return; |
|
} else if(this.header) { |
|
return; |
|
} |
|
|
|
// if(!this.header) { |
|
this.header = document.createElement('div'); |
|
this.header.classList.add(className + '-header'); |
|
|
|
const icon = document.createElement('i'); |
|
icon.classList.add('group-call-pin-icon', 'tgico-pin'); |
|
this.header.append(icon); |
|
|
|
this.container.append(this.header); |
|
// } |
|
|
|
// this.container.classList.toggle('is-pinned', value); |
|
} |
|
|
|
public setParticipant(participant: GroupCallParticipant, type: GroupCallParticipantVideoType, video: HTMLVideoElement) { |
|
let peerTitleElement: HTMLElement; |
|
if(participant.pFlags.self) { |
|
peerTitleElement = i18n('VoiceChat.Status.You'); |
|
peerTitleElement.classList.add('peer-title'); |
|
} else { |
|
this.peerTitle = new PeerTitle({ |
|
peerId: getPeerId(participant.peer) |
|
}); |
|
|
|
peerTitleElement = this.peerTitle.element; |
|
} |
|
|
|
this.groupCallParticipantMutedIcon = new GroupCallParticipantMutedIcon(false); |
|
this.groupCallParticipantStatus = new GroupCallParticipantStatusElement([type]); |
|
|
|
this.left.append(peerTitleElement, this.groupCallParticipantStatus.container); |
|
|
|
this.right.append(this.groupCallParticipantMutedIcon.container); |
|
|
|
video.classList.add(className, 'call-video'); |
|
|
|
if(video.paused) { |
|
video.play(); |
|
} |
|
|
|
const canvas = callVideoCanvasBlur(video); |
|
canvas.classList.add(className + '-blur'); |
|
|
|
this.container.prepend(canvas, video); |
|
|
|
this.updateParticipant(participant); |
|
} |
|
|
|
public updateParticipant(participant: GroupCallParticipant) { |
|
const state = getGroupCallParticipantMutedState(participant); |
|
|
|
this.groupCallParticipantMutedIcon.setState(state); |
|
this.groupCallParticipantStatus.setState(state, participant); |
|
} |
|
|
|
public destroy() { |
|
this.groupCallParticipantMutedIcon.destroy(); |
|
} |
|
}
|
|
|