Refactoring and fixes
Signed-off-by: Šimon Brandner <simon.bra.ag@gmail.com>
This commit is contained in:
parent
3bf28e3a6b
commit
521b2445a8
2 changed files with 36 additions and 42 deletions
|
@ -14,7 +14,6 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
import { EventType } from "matrix-js-sdk/src/@types/event";
|
import { EventType } from "matrix-js-sdk/src/@types/event";
|
||||||
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
|
import { MatrixEvent } from "matrix-js-sdk/src/models/event";
|
||||||
import { CallEvent, CallState, CallType, MatrixCall } from "matrix-js-sdk/src/webrtc/call";
|
import { CallEvent, CallState, CallType, MatrixCall } from "matrix-js-sdk/src/webrtc/call";
|
||||||
|
@ -38,9 +37,9 @@ export enum CustomCallState {
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class CallEventGrouper extends EventEmitter {
|
export default class CallEventGrouper extends EventEmitter {
|
||||||
events: Set<MatrixEvent> = new Set<MatrixEvent>();
|
private events: Set<MatrixEvent> = new Set<MatrixEvent>();
|
||||||
call: MatrixCall;
|
private call: MatrixCall;
|
||||||
state: CallState | CustomCallState;
|
public state: CallState | CustomCallState;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
|
@ -52,6 +51,30 @@ export default class CallEventGrouper extends EventEmitter {
|
||||||
return [...this.events].find((event) => event.getType() === EventType.CallInvite);
|
return [...this.events].find((event) => event.getType() === EventType.CallInvite);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private get hangup(): MatrixEvent {
|
||||||
|
return [...this.events].find((event) => event.getType() === EventType.CallHangup);
|
||||||
|
}
|
||||||
|
|
||||||
|
public get isVoice(): boolean {
|
||||||
|
const invite = this.invite;
|
||||||
|
if (!invite) return;
|
||||||
|
|
||||||
|
// FIXME: Find a better way to determine this from the event?
|
||||||
|
if (invite.getContent()?.offer?.sdp?.indexOf('m=video') !== -1) return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public get hangupReason(): string | null {
|
||||||
|
return this.hangup?.getContent()?.reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if there are only events from the other side - we missed the call
|
||||||
|
*/
|
||||||
|
private get callWasMissed(): boolean {
|
||||||
|
return ![...this.events].some((event) => event.sender?.userId === MatrixClientPeg.get().getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
public answerCall = () => {
|
public answerCall = () => {
|
||||||
this.call?.answer();
|
this.call?.answer();
|
||||||
}
|
}
|
||||||
|
@ -68,35 +91,6 @@ export default class CallEventGrouper extends EventEmitter {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public isVoice(): boolean {
|
|
||||||
const invite = this.invite;
|
|
||||||
|
|
||||||
// FIXME: Find a better way to determine this from the event?
|
|
||||||
let isVoice = true;
|
|
||||||
if (
|
|
||||||
invite.getContent().offer && invite.getContent().offer.sdp &&
|
|
||||||
invite.getContent().offer.sdp.indexOf('m=video') !== -1
|
|
||||||
) {
|
|
||||||
isVoice = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return isVoice;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getState(): CallState | CustomCallState {
|
|
||||||
return this.state;
|
|
||||||
}
|
|
||||||
|
|
||||||
public getHangupReason(): string | null {
|
|
||||||
return [...this.events].find((event) => event.getType() === EventType.CallHangup)?.getContent()?.reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if there are only events from the other side - we missed the call
|
|
||||||
*/
|
|
||||||
private wasThisCallMissed(): boolean {
|
|
||||||
return ![...this.events].some((event) => event.sender?.userId === MatrixClientPeg.get().getUserId());
|
|
||||||
}
|
|
||||||
|
|
||||||
private setCallListeners() {
|
private setCallListeners() {
|
||||||
if (!this.call) return;
|
if (!this.call) return;
|
||||||
|
@ -110,7 +104,7 @@ export default class CallEventGrouper extends EventEmitter {
|
||||||
const lastEvent = [...this.events][this.events.size - 1];
|
const lastEvent = [...this.events][this.events.size - 1];
|
||||||
const lastEventType = lastEvent.getType();
|
const lastEventType = lastEvent.getType();
|
||||||
|
|
||||||
if (this.wasThisCallMissed()) this.state = CustomCallState.Missed;
|
if (this.callWasMissed) this.state = CustomCallState.Missed;
|
||||||
else if (lastEventType === EventType.CallHangup) this.state = CallState.Ended;
|
else if (lastEventType === EventType.CallHangup) this.state = CallState.Ended;
|
||||||
else if (lastEventType === EventType.CallReject) this.state = CallState.Ended;
|
else if (lastEventType === EventType.CallReject) this.state = CallState.Ended;
|
||||||
else if (lastEventType === EventType.CallInvite && this.call) this.state = CallState.Connecting;
|
else if (lastEventType === EventType.CallInvite && this.call) this.state = CallState.Connecting;
|
||||||
|
@ -119,16 +113,16 @@ export default class CallEventGrouper extends EventEmitter {
|
||||||
}
|
}
|
||||||
|
|
||||||
private setCall = () => {
|
private setCall = () => {
|
||||||
|
if (this.call) return;
|
||||||
|
|
||||||
const callId = [...this.events][0].getContent().call_id;
|
const callId = [...this.events][0].getContent().call_id;
|
||||||
if (!this.call) {
|
this.call = CallHandler.sharedInstance().getCallById(callId);
|
||||||
this.call = CallHandler.sharedInstance().getCallById(callId);
|
this.setCallListeners();
|
||||||
this.setCallListeners();
|
|
||||||
}
|
|
||||||
this.setState();
|
this.setState();
|
||||||
}
|
}
|
||||||
|
|
||||||
public add(event: MatrixEvent) {
|
public add(event: MatrixEvent) {
|
||||||
this.events.add(event);
|
this.events.add(event);
|
||||||
this.setState();
|
this.setCall();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ export default class CallEvent extends React.Component<IProps, IState> {
|
||||||
super(props);
|
super(props);
|
||||||
|
|
||||||
this.state = {
|
this.state = {
|
||||||
callState: this.props.callEventGrouper.getState(),
|
callState: this.props.callEventGrouper.state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ export default class CallEvent extends React.Component<IProps, IState> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if (state === CallState.Ended) {
|
if (state === CallState.Ended) {
|
||||||
const hangupReason = this.props.callEventGrouper.getHangupReason();
|
const hangupReason = this.props.callEventGrouper.hangupReason;
|
||||||
|
|
||||||
if (["user_hangup", "user hangup"].includes(hangupReason) || !hangupReason) {
|
if (["user_hangup", "user hangup"].includes(hangupReason) || !hangupReason) {
|
||||||
// workaround for https://github.com/vector-im/element-web/issues/5178
|
// workaround for https://github.com/vector-im/element-web/issues/5178
|
||||||
|
@ -157,7 +157,7 @@ export default class CallEvent extends React.Component<IProps, IState> {
|
||||||
render() {
|
render() {
|
||||||
const event = this.props.mxEvent;
|
const event = this.props.mxEvent;
|
||||||
const sender = event.sender ? event.sender.name : event.getSender();
|
const sender = event.sender ? event.sender.name : event.getSender();
|
||||||
const callType = this.props.callEventGrouper.isVoice() ? _t("Voice call") : _t("Video call");
|
const callType = this.props.callEventGrouper.isVoice ? _t("Voice call") : _t("Video call");
|
||||||
const content = this.renderContent(this.state.callState);
|
const content = this.renderContent(this.state.callState);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue