Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0c91e4c615 | ||
|
|
b138fa2c44 | ||
|
|
70c4a775e3 | ||
|
|
978e858592 | ||
|
|
eca15317ce | ||
|
|
a9961c2cc1 | ||
|
|
557cbffe48 | ||
|
|
31258a75fa | ||
|
|
f884874d43 | ||
|
|
762ccc1f31 | ||
|
|
10b3268d43 | ||
|
|
fd1c13830c | ||
|
|
6dc91ad518 | ||
|
|
720c9ae2d4 | ||
|
|
1159efde80 | ||
|
|
9507aeb28d | ||
|
|
95011e4a04 | ||
|
|
f40fd295b1 | ||
|
|
b26239f1ff | ||
|
|
ccfa7dacdf |
@@ -33,6 +33,7 @@ The app is currently available in the following languages:
|
|||||||
* English
|
* English
|
||||||
* Chinese (simplified)
|
* Chinese (simplified)
|
||||||
* Chinese (traditional)
|
* Chinese (traditional)
|
||||||
|
* French
|
||||||
* German
|
* German
|
||||||
* Korean
|
* Korean
|
||||||
* Romanian
|
* Romanian
|
||||||
@@ -44,7 +45,6 @@ More translations are welcome. See [instructions](https://github.com/tinode/chat
|
|||||||
|
|
||||||
## Not done yet
|
## Not done yet
|
||||||
|
|
||||||
* Video or audio calling.
|
|
||||||
* End-to-End encryption.
|
* End-to-End encryption.
|
||||||
* Emoji support is weak.
|
* Emoji support is weak.
|
||||||
* Mentions, hashtags.
|
* Mentions, hashtags.
|
||||||
|
|||||||
@@ -2463,7 +2463,7 @@ ul.tabbar li.active > a {
|
|||||||
font-size: 1.2rem;
|
font-size: 1.2rem;
|
||||||
}
|
}
|
||||||
.material-icons.big {
|
.material-icons.big {
|
||||||
font-size: 2.4rem;
|
font-size: 2.2rem;
|
||||||
}
|
}
|
||||||
.material-icons.huge {
|
.material-icons.huge {
|
||||||
font-size: 4rem;
|
font-size: 4rem;
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ const i18n = {
|
|||||||
'new_message': "New message",
|
'new_message': "New message",
|
||||||
'new_chat': "New chat",
|
'new_chat': "New chat",
|
||||||
},
|
},
|
||||||
|
'fr': {
|
||||||
|
'new_message': "Nouveau message",
|
||||||
|
'new_chat': "Nouvelle conversation",
|
||||||
|
},
|
||||||
'es': {
|
'es': {
|
||||||
'new_message': "Nuevo mensaje",
|
'new_message': "Nuevo mensaje",
|
||||||
'new_chat': "Nueva conversación",
|
'new_chat': "Nueva conversación",
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "verpasster",
|
"translation": "verpasster",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "abgelehnt",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "missed",
|
"translation": "missed",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "declined",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "perdida",
|
"translation": "perdida",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "rechazada",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,9 +127,13 @@
|
|||||||
"defaultMessage": "cancelled",
|
"defaultMessage": "cancelled",
|
||||||
"description": "Label for cancelled outgoing call"
|
"description": "Label for cancelled outgoing call"
|
||||||
},
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call"
|
||||||
|
},
|
||||||
"call_missed": {
|
"call_missed": {
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call"
|
"description": "Label for missed incoming call"
|
||||||
},
|
},
|
||||||
"calls_incoming": {
|
"calls_incoming": {
|
||||||
"defaultMessage": "Incoming call",
|
"defaultMessage": "Incoming call",
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "부재중",
|
"translation": "부재중",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "통화 거부",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "pierdut",
|
"translation": "pierdut",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "refuzat",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "пропущен",
|
"translation": "пропущен",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "отклонен",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "未接",
|
"translation": "未接",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "被拒",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1413,7 +1413,14 @@
|
|||||||
"call_missed": {
|
"call_missed": {
|
||||||
"translation": "未接",
|
"translation": "未接",
|
||||||
"defaultMessage": "missed",
|
"defaultMessage": "missed",
|
||||||
"description": "Label for cancelled incoming call",
|
"description": "Label for missed incoming call",
|
||||||
|
"missing": false,
|
||||||
|
"obsolete": false
|
||||||
|
},
|
||||||
|
"call_declined": {
|
||||||
|
"translation": "被拒",
|
||||||
|
"defaultMessage": "declined",
|
||||||
|
"description": "Label for declined incoming call",
|
||||||
"missing": false,
|
"missing": false,
|
||||||
"obsolete": false
|
"obsolete": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,17 +7,18 @@ import { secondsToTime } from '../lib/strformat.js';
|
|||||||
|
|
||||||
export default class CallMessage extends React.PureComponent {
|
export default class CallMessage extends React.PureComponent {
|
||||||
render() {
|
render() {
|
||||||
const isCallDropped = this.props.callState == 'disconnected';
|
const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);
|
||||||
const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');
|
const successClass = 'material-icons medium ' + (isCallDropped ? 'red' : 'green');
|
||||||
const callIcon = this.props.incoming ?
|
const callIcon = this.props.incoming ?
|
||||||
(isCallDropped ? 'call_missed' : 'call_received') :
|
(isCallDropped ? 'call_missed' : 'call_received') :
|
||||||
(isCallDropped ? 'call_missed_outgoing' : 'call_made');
|
(isCallDropped ? 'call_missed_outgoing' : 'call_made');
|
||||||
const duration = isCallDropped ? (
|
const duration = isCallDropped ? (
|
||||||
this.props.incoming ?
|
this.props.incoming ? (this.props.callState == 'declined' ?
|
||||||
<FormattedMessage id="call_missed" defaultMessage="missed" description="Label for cancelled incoming call" /> :
|
<FormattedMessage id="call_declined" defaultMessage="declined" description="Label for declined incoming call" /> :
|
||||||
|
<FormattedMessage id="call_missed" defaultMessage="missed" description="Label for missed incoming call" />
|
||||||
|
) :
|
||||||
<FormattedMessage id="call_cancelled" defaultMessage="cancelled" description="Label for cancelled outgoing call" />
|
<FormattedMessage id="call_cancelled" defaultMessage="cancelled" description="Label for cancelled outgoing call" />
|
||||||
) :
|
) : <span>{secondsToTime(this.props.duration / 1000)}</span>;
|
||||||
<span>{secondsToTime(this.props.duration / 1000)}</span>;
|
|
||||||
return <div className="call-message">
|
return <div className="call-message">
|
||||||
<div><i className="material-icons big gray">call</i></div>
|
<div><i className="material-icons big gray">call</i></div>
|
||||||
<div className="flex-column narrow">
|
<div className="flex-column narrow">
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ class CallPanel extends React.PureComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleVideoCallAccepted(info) {
|
handleVideoCallAccepted(info) {
|
||||||
|
RING_SOUND.pause();
|
||||||
const pc = this.createPeerConnection();
|
const pc = this.createPeerConnection();
|
||||||
const stream = this.state.localStream;
|
const stream = this.state.localStream;
|
||||||
stream.getTracks().forEach(track => {
|
stream.getTracks().forEach(track => {
|
||||||
|
|||||||
@@ -9,16 +9,17 @@ import { secondsToTime } from '../lib/strformat.js';
|
|||||||
// success: true | false.
|
// success: true | false.
|
||||||
export default class CallStatus extends React.PureComponent {
|
export default class CallStatus extends React.PureComponent {
|
||||||
render() {
|
render() {
|
||||||
const isCallDropped = this.props.callState == 'disconnected';
|
const isCallDropped = ['declined', 'disconnected', 'missed'].includes(this.props.callState);
|
||||||
const icon2 = this.props.incoming ?
|
const icon2 = this.props.incoming ?
|
||||||
(isCallDropped ? 'call_missed' : 'call_received') :
|
(isCallDropped ? 'call_missed' : 'call_received') :
|
||||||
(isCallDropped ? 'call_missed_outgoing' : 'call_made');
|
(isCallDropped ? 'call_missed_outgoing' : 'call_made');
|
||||||
const duration = isCallDropped ? (
|
const duration = isCallDropped ? (
|
||||||
this.props.incoming ?
|
this.props.incoming ? (this.props.callState == 'declined' ?
|
||||||
<FormattedMessage id="call_missed" defaultMessage="missed" description="Label for cancelled incoming call" /> :
|
<FormattedMessage id="call_declined" defaultMessage="declined" description="Label for declined incoming call" /> :
|
||||||
<FormattedMessage id="call_cancelled" defaultMessage="cancelled" description="Label for cancelled outgoing call" />
|
<FormattedMessage id="call_missed" defaultMessage="missed" description="Label for missed incoming call" />
|
||||||
) :
|
) :
|
||||||
<span>{secondsToTime(this.props.duration / 1000)}</span>;
|
<FormattedMessage id="call_cancelled" defaultMessage="cancelled" description="Label for cancelled outgoing call" />
|
||||||
|
) : <span>{secondsToTime(this.props.duration / 1000)}</span>;
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<div className="composed-material">
|
<div className="composed-material">
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 393 KiB After Width: | Height: | Size: 439 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 101 KiB |
|
Before Width: | Height: | Size: 181 KiB After Width: | Height: | Size: 194 KiB |
|
Before Width: | Height: | Size: 474 KiB After Width: | Height: | Size: 538 KiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 171 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 169 KiB |