diff --git a/app/features/conference/actionTypes.js b/app/features/conference/actionTypes.js new file mode 100644 index 0000000..865551a --- /dev/null +++ b/app/features/conference/actionTypes.js @@ -0,0 +1,18 @@ +/** + * The type of (redux) action that is dispatched when conference is joined. + * + * { + * type: CONFERENCE_JOINED, + * conference: Object + * } + */ +export const CONFERENCE_JOINED = Symbol('CONFERENCE_JOINED'); + +/** + * The type of (redux) action that is dispatched when conference ends. + * + * { + * type: CONFERENCE_ENDED, + * conference: Object + * } + */export const CONFERENCE_ENDED = Symbol('CONFERENCE_ENDED'); diff --git a/app/features/conference/actions.js b/app/features/conference/actions.js new file mode 100644 index 0000000..87afc00 --- /dev/null +++ b/app/features/conference/actions.js @@ -0,0 +1,35 @@ +// @flow + +import { CONFERENCE_JOINED, CONFERENCE_ENDED } from './actionTypes'; + +/** + * Notifies that conference is joined. + * + * @param {Object} conference - Conference Details. + * @returns {{ + * type: CONFERENCE_JOINED, + * conference: Object + * }} + */ +export function conferenceJoined(conference: Object) { + return { + type: CONFERENCE_JOINED, + conference + }; +} + +/** + * Notifies that conference is joined. + * + * @param {Object} conference - Conference Details. + * @returns {{ + * type: CONFERENCE_ENDED, + * conference: Object + * }} + */ +export function conferenceEnded(conference: Object) { + return { + type: CONFERENCE_ENDED, + conference + }; +} diff --git a/app/features/conference/components/Conference.js b/app/features/conference/components/Conference.js index 11a4728..bd35aa3 100644 --- a/app/features/conference/components/Conference.js +++ b/app/features/conference/components/Conference.js @@ -18,6 +18,7 @@ import { import config from '../../config'; import { setEmail, setName } from '../../settings'; +import { conferenceEnded, conferenceJoined } from '../actions'; import { LoadingIndicator, Wrapper } from '../styled'; import { getExternalApiURL } from '../../utils'; @@ -86,6 +87,11 @@ class Conference extends Component { */ _api: Object; + /** + * Conference Object. + */ + _conference: Object; + /** * Initializes a new {@code Conference} instance. * @@ -119,10 +125,15 @@ class Conference extends Component { || this.props._serverURL || config.defaultServerURL; + this._conference = { + room, + serverURL + }; + const script = document.createElement('script'); script.async = true; - script.onload = () => this._onScriptLoad(parentNode, room, serverURL); + script.onload = () => this._onScriptLoad(parentNode); script.onerror = (event: Event) => this._navigateToHome(event, room, serverURL); script.src = getExternalApiURL(serverURL); @@ -210,14 +221,12 @@ class Conference extends Component { * and attach utils from jitsi-meet-electron-utils. * * @param {Object} parentNode - Node to which iframe has to be attached. - * @param {string} roomName - Conference room name to be joined. - * @param {string} serverURL - Jitsi Meet server url. * @returns {void} */ - _onScriptLoad(parentNode: Object, roomName: string, serverURL: string) { + _onScriptLoad(parentNode: Object) { const JitsiMeetExternalAPI = window.JitsiMeetExternalAPI; - const host = serverURL.replace(/https?:\/\//, ''); + const host = this._conference.serverURL.replace(/https?:\/\//, ''); const configOverwrite = { startWithAudioMuted: this.props._startWithAudioMuted, @@ -228,7 +237,7 @@ class Conference extends Component { configOverwrite, onload: this._onIframeLoad, parentNode, - roomName + roomName: this._conference.room }); initPopupsConfigurationRender(this._api); @@ -239,11 +248,16 @@ class Conference extends Component { setupAlwaysOnTopRender(this._api); setupWiFiStats(iframe); - this._api.on('readyToClose', (event: Event) => - this._navigateToHome(event)); + this._api.on('readyToClose', (event: Event) => { + this.props.dispatch(conferenceEnded(this._conference)); + this._navigateToHome(event); + }); this._api.on('videoConferenceJoined', - (conferenceInfo: Object) => - this._onVideoConferenceJoined(conferenceInfo)); + (conferenceInfo: Object) => { + this.props.dispatch(conferenceJoined(this._conference)); + this._onVideoConferenceJoined(conferenceInfo); + } + ); } /** diff --git a/app/features/conference/index.js b/app/features/conference/index.js index 213d6c1..fc5420c 100644 --- a/app/features/conference/index.js +++ b/app/features/conference/index.js @@ -1,3 +1,4 @@ +export * from './actions'; +export * from './actionTypes'; export * from './components'; export * from './styled'; -