2016-10-05 14:36:59 +00:00
|
|
|
import JitsiMeetJS from '../lib-jitsi-meet';
|
|
|
|
import {
|
|
|
|
changeParticipantEmail,
|
|
|
|
dominantSpeakerChanged,
|
|
|
|
participantJoined,
|
|
|
|
participantLeft,
|
|
|
|
participantRoleChanged
|
|
|
|
} from '../participants';
|
2016-12-05 15:14:50 +00:00
|
|
|
import { trackAdded, trackRemoved } from '../tracks';
|
2016-10-05 14:36:59 +00:00
|
|
|
|
|
|
|
import {
|
|
|
|
CONFERENCE_JOINED,
|
|
|
|
CONFERENCE_LEFT,
|
|
|
|
CONFERENCE_WILL_LEAVE,
|
|
|
|
SET_ROOM
|
|
|
|
} from './actionTypes';
|
|
|
|
import { EMAIL_COMMAND } from './constants';
|
|
|
|
import { _addLocalTracksToConference } from './functions';
|
|
|
|
import './middleware';
|
|
|
|
import './reducer';
|
|
|
|
|
|
|
|
/**
|
2016-12-12 00:29:13 +00:00
|
|
|
* Adds conference (event) listeners.
|
2016-10-05 14:36:59 +00:00
|
|
|
*
|
2016-12-12 00:29:13 +00:00
|
|
|
* @param {JitsiConference} conference - The JitsiConference instance.
|
|
|
|
* @param {Dispatch} dispatch - The Redux dispatch function.
|
|
|
|
* @private
|
|
|
|
* @returns {void}
|
2016-10-05 14:36:59 +00:00
|
|
|
*/
|
2016-12-12 00:29:13 +00:00
|
|
|
function _addConferenceListeners(conference, dispatch) {
|
|
|
|
const JitsiConferenceEvents = JitsiMeetJS.events.conference;
|
2016-10-05 14:36:59 +00:00
|
|
|
|
2016-12-12 00:29:13 +00:00
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.CONFERENCE_JOINED,
|
|
|
|
(...args) => dispatch(_conferenceJoined(conference, ...args)));
|
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.CONFERENCE_LEFT,
|
|
|
|
(...args) => dispatch(_conferenceLeft(conference, ...args)));
|
2016-10-05 14:36:59 +00:00
|
|
|
|
2016-12-12 00:29:13 +00:00
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.DOMINANT_SPEAKER_CHANGED,
|
|
|
|
(...args) => dispatch(dominantSpeakerChanged(...args)));
|
|
|
|
|
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.TRACK_ADDED,
|
|
|
|
t => t && !t.isLocal() && dispatch(trackAdded(t)));
|
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.TRACK_REMOVED,
|
|
|
|
t => t && !t.isLocal() && dispatch(trackRemoved(t)));
|
2016-10-05 14:36:59 +00:00
|
|
|
|
2016-12-12 00:29:13 +00:00
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.USER_JOINED,
|
|
|
|
(id, user) => dispatch(participantJoined({
|
|
|
|
id,
|
|
|
|
name: user.getDisplayName(),
|
|
|
|
role: user.getRole()
|
|
|
|
})));
|
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.USER_LEFT,
|
|
|
|
(...args) => dispatch(participantLeft(...args)));
|
|
|
|
conference.on(
|
|
|
|
JitsiConferenceEvents.USER_ROLE_CHANGED,
|
|
|
|
(...args) => dispatch(participantRoleChanged(...args)));
|
2016-10-05 14:36:59 +00:00
|
|
|
|
2016-12-12 00:29:13 +00:00
|
|
|
conference.addCommandListener(
|
|
|
|
EMAIL_COMMAND,
|
|
|
|
(data, id) => dispatch(changeParticipantEmail(id, data.value)));
|
2016-10-05 14:36:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Attach any pre-existing local media to the conference once the conference has
|
|
|
|
* been joined.
|
|
|
|
*
|
|
|
|
* @param {JitsiConference} conference - The JitsiConference instance which was
|
|
|
|
* joined by the local participant.
|
|
|
|
* @returns {Function}
|
|
|
|
*/
|
2016-12-05 15:14:50 +00:00
|
|
|
function _conferenceJoined(conference) {
|
2016-10-05 14:36:59 +00:00
|
|
|
return (dispatch, getState) => {
|
2016-12-05 15:14:50 +00:00
|
|
|
const localTracks
|
|
|
|
= getState()['features/base/tracks']
|
|
|
|
.filter(t => t.local)
|
|
|
|
.map(t => t.jitsiTrack);
|
2016-10-05 14:36:59 +00:00
|
|
|
|
|
|
|
if (localTracks.length) {
|
|
|
|
_addLocalTracksToConference(conference, localTracks);
|
|
|
|
}
|
|
|
|
|
|
|
|
dispatch({
|
|
|
|
type: CONFERENCE_JOINED,
|
2016-12-12 00:29:13 +00:00
|
|
|
conference
|
2016-10-05 14:36:59 +00:00
|
|
|
});
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-12-12 00:29:13 +00:00
|
|
|
* Signals that a specific conference has been left.
|
2016-10-05 14:36:59 +00:00
|
|
|
*
|
|
|
|
* @param {JitsiConference} conference - The JitsiConference instance which was
|
|
|
|
* left by the local participant.
|
|
|
|
* @returns {{
|
|
|
|
* type: CONFERENCE_LEFT,
|
2016-12-12 00:29:13 +00:00
|
|
|
* conference: JitsiConference
|
2016-10-05 14:36:59 +00:00
|
|
|
* }}
|
|
|
|
*/
|
2016-12-05 15:14:50 +00:00
|
|
|
function _conferenceLeft(conference) {
|
2016-10-05 14:36:59 +00:00
|
|
|
return {
|
|
|
|
type: CONFERENCE_LEFT,
|
2016-12-12 00:29:13 +00:00
|
|
|
conference
|
2016-10-05 14:36:59 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2016-12-12 00:29:13 +00:00
|
|
|
* Signals the intention of the application to have the local participant leave
|
|
|
|
* a specific conference. Similar in fashion to CONFERENCE_LEFT. Contrary to it
|
2016-10-05 14:36:59 +00:00
|
|
|
* though, it's not guaranteed because CONFERENCE_LEFT may be triggered by
|
|
|
|
* lib-jitsi-meet and not the application.
|
|
|
|
*
|
|
|
|
* @param {JitsiConference} conference - The JitsiConference instance which will
|
|
|
|
* be left by the local participant.
|
|
|
|
* @returns {{
|
|
|
|
* type: CONFERENCE_LEFT,
|
2016-12-12 00:29:13 +00:00
|
|
|
* conference: JitsiConference
|
2016-10-05 14:36:59 +00:00
|
|
|
* }}
|
|
|
|
*/
|
|
|
|
export function conferenceWillLeave(conference) {
|
|
|
|
return {
|
|
|
|
type: CONFERENCE_WILL_LEAVE,
|
2016-12-12 00:29:13 +00:00
|
|
|
conference
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes a new conference.
|
|
|
|
*
|
|
|
|
* @returns {Function}
|
|
|
|
*/
|
|
|
|
export function createConference() {
|
|
|
|
return (dispatch, getState) => {
|
|
|
|
const state = getState();
|
|
|
|
const connection = state['features/base/connection'].connection;
|
|
|
|
|
|
|
|
if (!connection) {
|
|
|
|
throw new Error('Cannot create conference without connection');
|
2016-10-05 14:36:59 +00:00
|
|
|
}
|
2016-12-12 00:29:13 +00:00
|
|
|
|
|
|
|
const room = state['features/base/conference'].room;
|
|
|
|
|
|
|
|
if (typeof room === 'undefined' || room === '') {
|
|
|
|
throw new Error('Cannot join conference without room name');
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO Take options from config.
|
|
|
|
const conference
|
|
|
|
= connection.initJitsiConference(room, { openSctp: true });
|
|
|
|
|
|
|
|
_addConferenceListeners(conference, dispatch);
|
|
|
|
|
|
|
|
conference.join();
|
2016-10-05 14:36:59 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets (the name of) the room of the conference to be joined.
|
|
|
|
*
|
|
|
|
* @param {(string|undefined)} room - The name of the room of the conference to
|
|
|
|
* be joined.
|
|
|
|
* @returns {{
|
|
|
|
* type: SET_ROOM,
|
|
|
|
* room: string
|
|
|
|
* }}
|
|
|
|
*/
|
|
|
|
export function setRoom(room) {
|
|
|
|
return {
|
|
|
|
type: SET_ROOM,
|
|
|
|
room
|
|
|
|
};
|
|
|
|
}
|