mirror of https://github.com/vector-im/riot-web
Merge pull request #5324 from matrix-org/dbkr/hang_up_your_hangups
Support rejecting callspull/21833/head
commit
b10f7a47fd
|
@ -238,9 +238,24 @@ export default class CallHandler {
|
||||||
(call.hangupParty === CallParty.Local && call.hangupReason === CallErrorCode.InviteTimeout)
|
(call.hangupParty === CallParty.Local && call.hangupReason === CallErrorCode.InviteTimeout)
|
||||||
)) {
|
)) {
|
||||||
this.play(AudioID.Busy);
|
this.play(AudioID.Busy);
|
||||||
Modal.createTrackedDialog('Call Handler', 'Call Timeout', ErrorDialog, {
|
let title;
|
||||||
title: _t('Call Timeout'),
|
let description;
|
||||||
description: _t('The remote side failed to pick up') + '.',
|
if (call.hangupReason === CallErrorCode.UserHangup) {
|
||||||
|
title = _t("Call Declined");
|
||||||
|
description = _t("The other party declined the call.");
|
||||||
|
} else if (call.hangupReason === CallErrorCode.InviteTimeout) {
|
||||||
|
title = _t("Call Failed");
|
||||||
|
// XXX: full stop appended as some relic here, but these
|
||||||
|
// strings need proper input from design anyway, so let's
|
||||||
|
// not change this string until we have a proper one.
|
||||||
|
description = _t('The remote side failed to pick up') + '.';
|
||||||
|
} else {
|
||||||
|
title = _t("Call Failed");
|
||||||
|
description = _t("The call could not be established");
|
||||||
|
}
|
||||||
|
|
||||||
|
Modal.createTrackedDialog('Call Handler', 'Call Failed', ErrorDialog, {
|
||||||
|
title, description,
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.play(AudioID.CallEnd);
|
this.play(AudioID.CallEnd);
|
||||||
|
@ -422,10 +437,15 @@ export default class CallHandler {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'hangup':
|
case 'hangup':
|
||||||
|
case 'reject':
|
||||||
if (!this.calls.get(payload.room_id)) {
|
if (!this.calls.get(payload.room_id)) {
|
||||||
return; // no call to hangup
|
return; // no call to hangup
|
||||||
}
|
}
|
||||||
this.calls.get(payload.room_id).hangup(CallErrorCode.UserHangup, false)
|
if (payload.action === 'reject') {
|
||||||
|
this.calls.get(payload.room_id).reject();
|
||||||
|
} else {
|
||||||
|
this.calls.get(payload.room_id).hangup(CallErrorCode.UserHangup, false);
|
||||||
|
}
|
||||||
this.removeCallForRoom(payload.room_id);
|
this.removeCallForRoom(payload.room_id);
|
||||||
break;
|
break;
|
||||||
case 'answer':
|
case 'answer':
|
||||||
|
|
|
@ -300,14 +300,27 @@ function textForCallHangupEvent(event) {
|
||||||
reason = _t('(not supported by this browser)');
|
reason = _t('(not supported by this browser)');
|
||||||
} else if (eventContent.reason) {
|
} else if (eventContent.reason) {
|
||||||
if (eventContent.reason === "ice_failed") {
|
if (eventContent.reason === "ice_failed") {
|
||||||
|
// We couldn't establish a connection at all
|
||||||
reason = _t('(could not connect media)');
|
reason = _t('(could not connect media)');
|
||||||
|
} else if (eventContent.reason === "ice_timeout") {
|
||||||
|
// We established a connection but it died
|
||||||
|
reason = _t('(connection failed)');
|
||||||
|
} else if (eventContent.reason === "user_media_failed") {
|
||||||
|
// The other side couldn't open capture devices
|
||||||
|
reason = _t("(their device couldn't start the camera / microphone)");
|
||||||
|
} else if (eventContent.reason === "unknown_error") {
|
||||||
|
// An error code the other side doesn't have a way to express
|
||||||
|
// (as opposed to an error code they gave but we don't know about,
|
||||||
|
// in which case we show the error code)
|
||||||
|
reason = _t("(an error occurred)");
|
||||||
} else if (eventContent.reason === "invite_timeout") {
|
} else if (eventContent.reason === "invite_timeout") {
|
||||||
reason = _t('(no answer)');
|
reason = _t('(no answer)');
|
||||||
} else if (eventContent.reason === "user hangup") {
|
} else if (eventContent.reason === "user hangup" || eventContent.reason === "user_hangup") {
|
||||||
// workaround for https://github.com/vector-im/element-web/issues/5178
|
// workaround for https://github.com/vector-im/element-web/issues/5178
|
||||||
// it seems Android randomly sets a reason of "user hangup" which is
|
// it seems Android randomly sets a reason of "user hangup" which is
|
||||||
// interpreted as an error code :(
|
// interpreted as an error code :(
|
||||||
// https://github.com/vector-im/riot-android/issues/2623
|
// https://github.com/vector-im/riot-android/issues/2623
|
||||||
|
// Also the correct hangup code as of VoIP v1 (with underscore)
|
||||||
reason = '';
|
reason = '';
|
||||||
} else {
|
} else {
|
||||||
reason = _t('(unknown failure: %(reason)s)', {reason: eventContent.reason});
|
reason = _t('(unknown failure: %(reason)s)', {reason: eventContent.reason});
|
||||||
|
@ -316,6 +329,11 @@ function textForCallHangupEvent(event) {
|
||||||
return _t('%(senderName)s ended the call.', {senderName}) + ' ' + reason;
|
return _t('%(senderName)s ended the call.', {senderName}) + ' ' + reason;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function textForCallRejectEvent(event) {
|
||||||
|
const senderName = event.sender ? event.sender.name : _t('Someone');
|
||||||
|
return _t('%(senderName)s declined the call.', {senderName});
|
||||||
|
}
|
||||||
|
|
||||||
function textForCallInviteEvent(event) {
|
function textForCallInviteEvent(event) {
|
||||||
const senderName = event.sender ? event.sender.name : _t('Someone');
|
const senderName = event.sender ? event.sender.name : _t('Someone');
|
||||||
// FIXME: Find a better way to determine this from the event?
|
// FIXME: Find a better way to determine this from the event?
|
||||||
|
@ -545,6 +563,7 @@ const handlers = {
|
||||||
'm.call.invite': textForCallInviteEvent,
|
'm.call.invite': textForCallInviteEvent,
|
||||||
'm.call.answer': textForCallAnswerEvent,
|
'm.call.answer': textForCallAnswerEvent,
|
||||||
'm.call.hangup': textForCallHangupEvent,
|
'm.call.hangup': textForCallHangupEvent,
|
||||||
|
'm.call.reject': textForCallRejectEvent,
|
||||||
};
|
};
|
||||||
|
|
||||||
const stateHandlers = {
|
const stateHandlers = {
|
||||||
|
|
|
@ -46,6 +46,7 @@ const eventTileTypes = {
|
||||||
'm.call.invite': 'messages.TextualEvent',
|
'm.call.invite': 'messages.TextualEvent',
|
||||||
'm.call.answer': 'messages.TextualEvent',
|
'm.call.answer': 'messages.TextualEvent',
|
||||||
'm.call.hangup': 'messages.TextualEvent',
|
'm.call.hangup': 'messages.TextualEvent',
|
||||||
|
'm.call.reject': 'messages.TextualEvent',
|
||||||
};
|
};
|
||||||
|
|
||||||
const stateEventTileTypes = {
|
const stateEventTileTypes = {
|
||||||
|
|
|
@ -38,6 +38,7 @@ import WidgetUtils from "../../../utils/WidgetUtils";
|
||||||
import {UPDATE_EVENT} from "../../../stores/AsyncStore";
|
import {UPDATE_EVENT} from "../../../stores/AsyncStore";
|
||||||
import ActiveWidgetStore from "../../../stores/ActiveWidgetStore";
|
import ActiveWidgetStore from "../../../stores/ActiveWidgetStore";
|
||||||
import { PlaceCallType } from "../../../CallHandler";
|
import { PlaceCallType } from "../../../CallHandler";
|
||||||
|
import { CallState } from 'matrix-js-sdk/src/webrtc/call';
|
||||||
|
|
||||||
function ComposerAvatar(props) {
|
function ComposerAvatar(props) {
|
||||||
const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar');
|
const MemberStatusMessageAvatar = sdk.getComponent('avatars.MemberStatusMessageAvatar');
|
||||||
|
@ -104,8 +105,11 @@ function HangupButton(props) {
|
||||||
if (!call) {
|
if (!call) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const action = call.state === CallState.Ringing ? 'reject' : 'hangup';
|
||||||
|
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: 'hangup',
|
action,
|
||||||
// hangup the call for this room, which may not be the room in props
|
// hangup the call for this room, which may not be the room in props
|
||||||
// (e.g. conferences which will hangup the 1:1 room instead)
|
// (e.g. conferences which will hangup the 1:1 room instead)
|
||||||
room_id: call.roomId,
|
room_id: call.roomId,
|
||||||
|
|
|
@ -78,7 +78,7 @@ export default class IncomingCallBox extends React.Component<IProps, IState> {
|
||||||
private onRejectClick: React.MouseEventHandler = (e) => {
|
private onRejectClick: React.MouseEventHandler = (e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
dis.dispatch({
|
dis.dispatch({
|
||||||
action: 'hangup',
|
action: 'reject',
|
||||||
room_id: this.state.incomingCall.roomId,
|
room_id: this.state.incomingCall.roomId,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
|
@ -35,8 +35,10 @@
|
||||||
"Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.",
|
"Unable to load! Check your network connectivity and try again.": "Unable to load! Check your network connectivity and try again.",
|
||||||
"Dismiss": "Dismiss",
|
"Dismiss": "Dismiss",
|
||||||
"Call Failed": "Call Failed",
|
"Call Failed": "Call Failed",
|
||||||
"Call Timeout": "Call Timeout",
|
"Call Declined": "Call Declined",
|
||||||
|
"The other party declined the call.": "The other party declined the call.",
|
||||||
"The remote side failed to pick up": "The remote side failed to pick up",
|
"The remote side failed to pick up": "The remote side failed to pick up",
|
||||||
|
"The call could not be established": "The call could not be established",
|
||||||
"Call failed due to misconfigured server": "Call failed due to misconfigured server",
|
"Call failed due to misconfigured server": "Call failed due to misconfigured server",
|
||||||
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.",
|
"Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.": "Please ask the administrator of your homeserver (<code>%(homeserverDomain)s</code>) to configure a TURN server in order for calls to work reliably.",
|
||||||
"Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.",
|
"Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.": "Alternatively, you can try to use the public server at <code>turn.matrix.org</code>, but this will not be as reliable, and it will share your IP address with that server. You can also manage this in Settings.",
|
||||||
|
@ -259,9 +261,13 @@
|
||||||
"(not supported by this browser)": "(not supported by this browser)",
|
"(not supported by this browser)": "(not supported by this browser)",
|
||||||
"%(senderName)s answered the call.": "%(senderName)s answered the call.",
|
"%(senderName)s answered the call.": "%(senderName)s answered the call.",
|
||||||
"(could not connect media)": "(could not connect media)",
|
"(could not connect media)": "(could not connect media)",
|
||||||
|
"(connection failed)": "(connection failed)",
|
||||||
|
"(their device couldn't start the camera / microphone)": "(their device couldn't start the camera / microphone)",
|
||||||
|
"(an error occurred)": "(an error occurred)",
|
||||||
"(no answer)": "(no answer)",
|
"(no answer)": "(no answer)",
|
||||||
"(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)",
|
"(unknown failure: %(reason)s)": "(unknown failure: %(reason)s)",
|
||||||
"%(senderName)s ended the call.": "%(senderName)s ended the call.",
|
"%(senderName)s ended the call.": "%(senderName)s ended the call.",
|
||||||
|
"%(senderName)s declined the call.": "%(senderName)s declined the call.",
|
||||||
"%(senderName)s placed a voice call.": "%(senderName)s placed a voice call.",
|
"%(senderName)s placed a voice call.": "%(senderName)s placed a voice call.",
|
||||||
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s placed a voice call. (not supported by this browser)",
|
"%(senderName)s placed a voice call. (not supported by this browser)": "%(senderName)s placed a voice call. (not supported by this browser)",
|
||||||
"%(senderName)s placed a video call.": "%(senderName)s placed a video call.",
|
"%(senderName)s placed a video call.": "%(senderName)s placed a video call.",
|
||||||
|
|
Loading…
Reference in New Issue