From c6400c8db34e2384ce14ec461c04c99d3c8f3852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=A0imon=20Brandner?= Date: Fri, 27 Aug 2021 16:23:06 +0200 Subject: [PATCH] Show call length during a call MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Šimon Brandner --- src/components/structures/CallEventGrouper.ts | 6 +++++ src/components/views/messages/CallEvent.tsx | 27 +++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/components/structures/CallEventGrouper.ts b/src/components/structures/CallEventGrouper.ts index b48bb32efe..7f0324029e 100644 --- a/src/components/structures/CallEventGrouper.ts +++ b/src/components/structures/CallEventGrouper.ts @@ -25,6 +25,7 @@ import defaultDispatcher from "../../dispatcher/dispatcher"; export enum CallEventGrouperEvent { StateChanged = "state_changed", SilencedChanged = "silenced_changed", + LengthChanged = "length_changed", } const CONNECTING_STATES = [ @@ -113,6 +114,10 @@ export default class CallEventGrouper extends EventEmitter { this.emit(CallEventGrouperEvent.SilencedChanged, newState); }; + private onLengthChanged = (length: number): void => { + this.emit(CallEventGrouperEvent.LengthChanged, length); + }; + public answerCall = () => { this.call?.answer(); }; @@ -139,6 +144,7 @@ export default class CallEventGrouper extends EventEmitter { private setCallListeners() { if (!this.call) return; this.call.addListener(CallEvent.State, this.setState); + this.call.addListener(CallEvent.LengthChanged, this.onLengthChanged); } private setState = () => { diff --git a/src/components/views/messages/CallEvent.tsx b/src/components/views/messages/CallEvent.tsx index 8c9a3da060..5f514b8390 100644 --- a/src/components/views/messages/CallEvent.tsx +++ b/src/components/views/messages/CallEvent.tsx @@ -17,7 +17,7 @@ limitations under the License. import React, { createRef } from 'react'; import { MatrixEvent } from "matrix-js-sdk/src/models/event"; -import { _t, _td } from '../../../languageHandler'; +import { _t } from '../../../languageHandler'; import MemberAvatar from '../avatars/MemberAvatar'; import CallEventGrouper, { CallEventGrouperEvent, CustomCallState } from '../../structures/CallEventGrouper'; import AccessibleButton from '../elements/AccessibleButton'; @@ -26,6 +26,7 @@ import InfoTooltip, { InfoTooltipKind } from '../elements/InfoTooltip'; import classNames from 'classnames'; import AccessibleTooltipButton from '../elements/AccessibleTooltipButton'; import { formatCallTime } from "../../../DateUtils"; +import Clock from "../audio_messages/Clock"; const MAX_NON_NARROW_WIDTH = 450 / 70 * 100; @@ -38,13 +39,9 @@ interface IState { callState: CallState | CustomCallState; silenced: boolean; narrow: boolean; + length: number; } -const TEXTUAL_STATES: Map = new Map([ - [CallState.Connected, _td("Connected")], - [CallState.Connecting, _td("Connecting")], -]); - export default class CallEvent extends React.PureComponent { private wrapperElement = createRef(); private resizeObserver: ResizeObserver; @@ -56,12 +53,14 @@ export default class CallEvent extends React.PureComponent { callState: this.props.callEventGrouper.state, silenced: false, narrow: false, + length: 0, }; } componentDidMount() { this.props.callEventGrouper.addListener(CallEventGrouperEvent.StateChanged, this.onStateChanged); this.props.callEventGrouper.addListener(CallEventGrouperEvent.SilencedChanged, this.onSilencedChanged); + this.props.callEventGrouper.addListener(CallEventGrouperEvent.LengthChanged, this.onLengthChanged); this.resizeObserver = new ResizeObserver(this.resizeObserverCallback); this.resizeObserver.observe(this.wrapperElement.current); @@ -70,10 +69,15 @@ export default class CallEvent extends React.PureComponent { componentWillUnmount() { this.props.callEventGrouper.removeListener(CallEventGrouperEvent.StateChanged, this.onStateChanged); this.props.callEventGrouper.removeListener(CallEventGrouperEvent.SilencedChanged, this.onSilencedChanged); + this.props.callEventGrouper.removeListener(CallEventGrouperEvent.LengthChanged, this.onLengthChanged); this.resizeObserver.disconnect(); } + private onLengthChanged = (length: number): void => { + this.setState({ length }); + }; + private resizeObserverCallback = (entries: ResizeObserverEntry[]): void => { const wrapperElementEntry = entries.find((entry) => entry.target === this.wrapperElement.current); if (!wrapperElementEntry) return; @@ -214,10 +218,17 @@ export default class CallEvent extends React.PureComponent { ); } - if (Array.from(TEXTUAL_STATES.keys()).includes(state)) { + if (state === CallState.Connected) { return (
- { TEXTUAL_STATES.get(state) } + +
+ ); + } + if (state === CallState.Connecting) { + return ( +
+ { _t("Connecting") }
); }