diff --git a/lang/main.json b/lang/main.json index 80e64bf4fa..4803ab2234 100644 --- a/lang/main.json +++ b/lang/main.json @@ -577,5 +577,15 @@ "appNotInstalled": "You need the __app__ mobile app to join this meeting on your phone.", "downloadApp": "Download the app", "openApp": "Continue to the app" + }, + "presenceStatus": { + "invited": "Invited", + "ringing": "Ringing", + "calling": "Calling", + "connected": "Connected", + "connecting": "Connecting", + "busy": "Busy", + "rejected": "Rejected", + "ignored": "Ignored" } } diff --git a/modules/UI/videolayout/LargeVideoManager.js b/modules/UI/videolayout/LargeVideoManager.js index 9ddafa45ad..6d7ef3d62f 100644 --- a/modules/UI/videolayout/LargeVideoManager.js +++ b/modules/UI/videolayout/LargeVideoManager.js @@ -2,8 +2,10 @@ /* eslint-disable no-unused-vars */ import React from 'react'; import ReactDOM from 'react-dom'; +import { I18nextProvider } from 'react-i18next'; import { Provider } from 'react-redux'; +import { i18next } from '../../../react/features/base/i18n'; import { PresenceLabel } from '../../../react/features/presence-status'; /* eslint-enable no-unused-vars */ @@ -456,7 +458,9 @@ export default class LargeVideoManager { if (presenceLabelContainer.length) { ReactDOM.render( - + + + , presenceLabelContainer.get(0)); } diff --git a/modules/UI/videolayout/RemoteVideo.js b/modules/UI/videolayout/RemoteVideo.js index 2986c4c0b2..150818f466 100644 --- a/modules/UI/videolayout/RemoteVideo.js +++ b/modules/UI/videolayout/RemoteVideo.js @@ -609,7 +609,9 @@ RemoteVideo.prototype.addPresenceLabel = function() { if (presenceLabelContainer) { ReactDOM.render( - + + + , presenceLabelContainer); } diff --git a/react/features/base/media/components/AbstractAudio.js b/react/features/base/media/components/AbstractAudio.js index 7919bcc669..28c3d68535 100644 --- a/react/features/base/media/components/AbstractAudio.js +++ b/react/features/base/media/components/AbstractAudio.js @@ -7,6 +7,7 @@ import { Component } from 'react'; * playback. */ export type AudioElement = { + currentTime?: number, pause: () => void, play: () => void, setSinkId?: string => void @@ -32,7 +33,8 @@ type Props = { * @type {Object | string} */ src: Object | string, - stream: Object + stream: Object, + loop?: ?boolean } /** diff --git a/react/features/base/media/components/native/Audio.js b/react/features/base/media/components/native/Audio.js index fa2ee4109a..418c75ce7e 100644 --- a/react/features/base/media/components/native/Audio.js +++ b/react/features/base/media/components/native/Audio.js @@ -74,4 +74,17 @@ export default class Audio extends AbstractAudio { // writing to not render anything. return null; } + + /** + * Stops the sound if it's currently playing. + * + * @returns {void} + */ + stop() { + // Currently not implemented for mobile. If needed, a possible + // implementation is: + // if (this._sound) { + // this._sound.stop(); + // } + } } diff --git a/react/features/base/media/components/web/Audio.js b/react/features/base/media/components/web/Audio.js index bfba1365a9..1fc56aa69f 100644 --- a/react/features/base/media/components/web/Audio.js +++ b/react/features/base/media/components/web/Audio.js @@ -41,8 +41,11 @@ export default class Audio extends AbstractAudio { * @returns {ReactElement} */ render() { + const loop = this.props.loop ? 'true' : null; + return (