feat(api): expose method for playing touch tones (#4584)
This commit is contained in:
parent
bd99108e8e
commit
55ff9dbe80
|
@ -197,6 +197,15 @@ api.executeCommand('displayName', 'New Nickname');
|
||||||
api.executeCommand('password', 'The Password');
|
api.executeCommand('password', 'The Password');
|
||||||
```
|
```
|
||||||
|
|
||||||
|
* **sendTones** - Play touch tones.
|
||||||
|
```javascript
|
||||||
|
api.executeCommand('sendTones', {
|
||||||
|
tones: string, // The dial pad touch tones to play. For example, '12345#'.
|
||||||
|
duration: number, // Optional. The number of milliseconds each tone should play. The default is 200.
|
||||||
|
pause: number // Optional. The number of milliseconds between each tone. The default is 200.
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
* **subject** - Sets the subject of the conference. This command requires one argument - the new subject to be set.
|
* **subject** - Sets the subject of the conference. This command requires one argument - the new subject to be set.
|
||||||
```javascript
|
```javascript
|
||||||
api.executeCommand('subject', 'New Conference Subject');
|
api.executeCommand('subject', 'New Conference Subject');
|
||||||
|
|
|
@ -5,7 +5,11 @@ import {
|
||||||
createApiEvent,
|
createApiEvent,
|
||||||
sendAnalytics
|
sendAnalytics
|
||||||
} from '../../react/features/analytics';
|
} from '../../react/features/analytics';
|
||||||
import { setPassword, setSubject } from '../../react/features/base/conference';
|
import {
|
||||||
|
sendTones,
|
||||||
|
setPassword,
|
||||||
|
setSubject
|
||||||
|
} from '../../react/features/base/conference';
|
||||||
import { parseJWTFromURLParams } from '../../react/features/base/jwt';
|
import { parseJWTFromURLParams } from '../../react/features/base/jwt';
|
||||||
import { invite } from '../../react/features/invite';
|
import { invite } from '../../react/features/invite';
|
||||||
import { toggleTileView } from '../../react/features/video-layout';
|
import { toggleTileView } from '../../react/features/video-layout';
|
||||||
|
@ -90,6 +94,11 @@ function initCommands() {
|
||||||
'proxy-connection-event': event => {
|
'proxy-connection-event': event => {
|
||||||
APP.conference.onProxyConnectionEvent(event);
|
APP.conference.onProxyConnectionEvent(event);
|
||||||
},
|
},
|
||||||
|
'send-tones': (options = {}) => {
|
||||||
|
const { duration, tones, pause } = options;
|
||||||
|
|
||||||
|
APP.store.dispatch(sendTones(tones, duration, pause));
|
||||||
|
},
|
||||||
'subject': subject => {
|
'subject': subject => {
|
||||||
sendAnalytics(createApiEvent('subject.changed'));
|
sendAnalytics(createApiEvent('subject.changed'));
|
||||||
APP.store.dispatch(setSubject(subject));
|
APP.store.dispatch(setSubject(subject));
|
||||||
|
|
|
@ -34,6 +34,7 @@ const commands = {
|
||||||
email: 'email',
|
email: 'email',
|
||||||
hangup: 'video-hangup',
|
hangup: 'video-hangup',
|
||||||
password: 'password',
|
password: 'password',
|
||||||
|
sendTones: 'send-tones',
|
||||||
subject: 'subject',
|
subject: 'subject',
|
||||||
submitFeedback: 'submit-feedback',
|
submitFeedback: 'submit-feedback',
|
||||||
toggleAudio: 'toggle-audio',
|
toggleAudio: 'toggle-audio',
|
||||||
|
|
|
@ -118,6 +118,18 @@ export const LOCK_STATE_CHANGED = 'LOCK_STATE_CHANGED';
|
||||||
*/
|
*/
|
||||||
export const P2P_STATUS_CHANGED = 'P2P_STATUS_CHANGED';
|
export const P2P_STATUS_CHANGED = 'P2P_STATUS_CHANGED';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The type of (redux) action which signals to play specified touch tones.
|
||||||
|
*
|
||||||
|
* {
|
||||||
|
* type: SEND_TONES,
|
||||||
|
* tones: string,
|
||||||
|
* duration: number,
|
||||||
|
* pause: number
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
export const SEND_TONES = 'SEND_TONES';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The type of (redux) action which sets the desktop sharing enabled flag for
|
* The type of (redux) action which sets the desktop sharing enabled flag for
|
||||||
* the current conference.
|
* the current conference.
|
||||||
|
|
|
@ -37,6 +37,7 @@ import {
|
||||||
KICKED_OUT,
|
KICKED_OUT,
|
||||||
LOCK_STATE_CHANGED,
|
LOCK_STATE_CHANGED,
|
||||||
P2P_STATUS_CHANGED,
|
P2P_STATUS_CHANGED,
|
||||||
|
SEND_TONES,
|
||||||
SET_DESKTOP_SHARING_ENABLED,
|
SET_DESKTOP_SHARING_ENABLED,
|
||||||
SET_FOLLOW_ME,
|
SET_FOLLOW_ME,
|
||||||
SET_MAX_RECEIVER_VIDEO_QUALITY,
|
SET_MAX_RECEIVER_VIDEO_QUALITY,
|
||||||
|
@ -520,6 +521,28 @@ export function p2pStatusChanged(p2p: boolean) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Signals to play touch tones.
|
||||||
|
*
|
||||||
|
* @param {string} tones - The tones to play.
|
||||||
|
* @param {number} [duration] - How long to play each tone.
|
||||||
|
* @param {number} [pause] - How long to pause between each tone.
|
||||||
|
* @returns {{
|
||||||
|
* type: SEND_TONES,
|
||||||
|
* tones: string,
|
||||||
|
* duration: number,
|
||||||
|
* pause: number
|
||||||
|
* }}
|
||||||
|
*/
|
||||||
|
export function sendTones(tones: string, duration: number, pause: number) {
|
||||||
|
return {
|
||||||
|
type: SEND_TONES,
|
||||||
|
tones,
|
||||||
|
duration,
|
||||||
|
pause
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the flag for indicating if desktop sharing is enabled.
|
* Sets the flag for indicating if desktop sharing is enabled.
|
||||||
*
|
*
|
||||||
|
|
|
@ -35,6 +35,7 @@ import {
|
||||||
CONFERENCE_SUBJECT_CHANGED,
|
CONFERENCE_SUBJECT_CHANGED,
|
||||||
CONFERENCE_WILL_LEAVE,
|
CONFERENCE_WILL_LEAVE,
|
||||||
DATA_CHANNEL_OPENED,
|
DATA_CHANNEL_OPENED,
|
||||||
|
SEND_TONES,
|
||||||
SET_PENDING_SUBJECT_CHANGE,
|
SET_PENDING_SUBJECT_CHANGE,
|
||||||
SET_ROOM
|
SET_ROOM
|
||||||
} from './actionTypes';
|
} from './actionTypes';
|
||||||
|
@ -89,6 +90,9 @@ MiddlewareRegistry.register(store => next => action => {
|
||||||
case PIN_PARTICIPANT:
|
case PIN_PARTICIPANT:
|
||||||
return _pinParticipant(store, next, action);
|
return _pinParticipant(store, next, action);
|
||||||
|
|
||||||
|
case SEND_TONES:
|
||||||
|
return _sendTones(store, next, action);
|
||||||
|
|
||||||
case SET_ROOM:
|
case SET_ROOM:
|
||||||
return _setRoom(store, next, action);
|
return _setRoom(store, next, action);
|
||||||
|
|
||||||
|
@ -446,6 +450,31 @@ function _pinParticipant({ getState }, next, action) {
|
||||||
return next(action);
|
return next(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Requests the specified tones to be played.
|
||||||
|
*
|
||||||
|
* @param {Store} store - The redux store in which the specified {@code action}
|
||||||
|
* is being dispatched.
|
||||||
|
* @param {Dispatch} next - The redux {@code dispatch} function to dispatch the
|
||||||
|
* specified {@code action} to the specified {@code store}.
|
||||||
|
* @param {Action} action - The redux action {@code SEND_TONES} which is
|
||||||
|
* being dispatched in the specified {@code store}.
|
||||||
|
* @private
|
||||||
|
* @returns {Object} The value returned by {@code next(action)}.
|
||||||
|
*/
|
||||||
|
function _sendTones({ getState }, next, action) {
|
||||||
|
const state = getState();
|
||||||
|
const { conference } = state['features/base/conference'];
|
||||||
|
|
||||||
|
if (conference) {
|
||||||
|
const { duration, tones, pause } = action;
|
||||||
|
|
||||||
|
conference.sendTones(tones, duration, pause);
|
||||||
|
}
|
||||||
|
|
||||||
|
return next(action);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper function for updating the preferred receiver video constraint, based
|
* Helper function for updating the preferred receiver video constraint, based
|
||||||
* on the user preference and the internal maximum.
|
* on the user preference and the internal maximum.
|
||||||
|
|
Loading…
Reference in New Issue