From e3729a7bf35e0f43c06ffa601ca5bfdc5d1de736 Mon Sep 17 00:00:00 2001 From: Anton Georgiev <anto.georgiev@gmail.com> Date: Mon, 12 Nov 2018 22:09:04 +0000 Subject: [PATCH] better updates --- bbb-api-demo/src/main/webapp/demo_iframe.jsp | 52 ++++++++++++++----- .../actions-dropdown/component.jsx | 1 + .../ui/components/actions-bar/container.jsx | 16 +++++- .../ui/components/actions-bar/service.js | 27 +++++++--- 4 files changed, 77 insertions(+), 19 deletions(-) diff --git a/bbb-api-demo/src/main/webapp/demo_iframe.jsp b/bbb-api-demo/src/main/webapp/demo_iframe.jsp index f815961db0..96ca85ce66 100644 --- a/bbb-api-demo/src/main/webapp/demo_iframe.jsp +++ b/bbb-api-demo/src/main/webapp/demo_iframe.jsp @@ -134,13 +134,30 @@ if (request.getParameterMap().isEmpty()) { %> <script language="javascript" type="text/javascript"> + var recButton = document.createElement("button"); + var muteButton = document.createElement("button"); + //EventListener(Getting message from iframe) window.addEventListener('message', function(e) { - console.error('message: ', e); - document.getElementById("output-content").innerHTML = JSON.stringify(e.data.response); - // document.getElementById("output-content").innerHTML = e.data.response; + handleMessage(e.data.response); }); + function handleMessage(e) { + switch(e) { + case 'readyToConnect': { + console.error('readdddy'); + // get initial state + getInitialState(); break; } + case 'recordingStarted': { console.log('1'); recButton.innerHTML = "Stop Recording"; break;} + case 'recordingStopped': { console.log('2'); recButton.innerHTML = "Start Recording"; break;} + case 'selfMuted': { console.log('3'); muteButton.innerHTML = "Unmute me"; break;} + case 'selfUnmuted': { console.log('4'); muteButton.innerHTML = "Mute me"; break;} + default: console.log('neither', { e } ); + } + + + } + /********************functions for the controls************************/ //Toggle Recording function recToggle(){ @@ -153,9 +170,14 @@ if (request.getParameterMap().isEmpty()) { } /////////////////////////////////////////////////////////////////////// - //Clean up the body node before loading controls and the client - console.log("Join URL = <%=joinURL%>"); + function getInitialState() { + console.log('getting initial state'); + document.getElementById("client-content").contentWindow.postMessage("c_recording_status","*"); + } + /////////////////////////////////////////////////////////////////////// + + //Clean up the body node before loading controls and the client document.body.innerHTML = ""; //Node for the Client @@ -164,9 +186,12 @@ if (request.getParameterMap().isEmpty()) { var clientContent = document.createElement("iframe"); clientContent.setAttribute("id","client-content"); - clientContent.setAttribute("src","<%=joinURL%>"); + // clientContent.setAttribute("src","<%=joinURL%>"); // clientContent.setAttribute("src","https://MYDOMAIN.com/demo/demoHTML5.jsp"); // clientContent.setAttribute("allow","microphone https://MYDOMAIN.com; camera https://MYDOMAIN.com"); + clientContent.setAttribute("src","https://anton22.blindside-dev.com/demo/demoHTML5.jsp"); + clientContent.setAttribute("allow","microphone https://anton22.blindside-dev.com; camera https://anton22.blindside-dev.com"); + client.appendChild(clientContent); @@ -178,15 +203,13 @@ if (request.getParameterMap().isEmpty()) { /****************** Controls *****************************/ //Node for the control which controls recording functionality of the html5Client - var recButton = document.createElement("button"); - recButton.innerHTML = "Start/Stop Recording"; recButton.setAttribute("onClick","recToggle();"); controls.appendChild(recButton); - var muteButton = document.createElement("button"); - muteButton.innerHTML = "Toggle mute"; + // var muteButton = document.createElement("button"); + // muteButton.innerHTML = "Toggle mute"; muteButton.setAttribute("onClick","muteToggle();"); controls.appendChild(muteButton); @@ -200,11 +223,16 @@ if (request.getParameterMap().isEmpty()) { var outputContent = document.createElement("textarea"); outputContent.setAttribute("id","output-content"); - outputContent.setAttribute("rows","4"); + outputContent.setAttribute("rows","2"); outputContent.setAttribute("cols","50"); - output.appendChild(outputContent); + var currentStates = document.createElement("textarea"); + currentStates.setAttribute("id","current-states"); + currentStates.setAttribute("rows","2"); + currentStates.setAttribute("cols","50"); + output.appendChild(currentStates); + //Append the nodes of contents to the body node document.body.appendChild(controls); document.body.appendChild(output); diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx index 28092cf025..0da0a77e1c 100755 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/actions-dropdown/component.jsx @@ -93,6 +93,7 @@ class ActionsDropdown extends Component { componentDidMount() { if (Meteor.settings.public.allowOutsideCommands.toggleRecording || getFromUserSettings('outsideToggleRecording', false)) { + ActionBarService.connectRecordingObserver(); window.addEventListener('message', ActionBarService.processOutsideToggleRecording); } } diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx index c929503b17..da38b1bec2 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx @@ -2,6 +2,8 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import { Session } from 'meteor/session'; import getFromUserSettings from '/imports/ui/services/users-settings'; +import Meetings from '/imports/api/meetings'; +import Auth from '/imports/ui/services/auth'; import ActionsBar from './component'; import Service from './service'; import VideoService from '../video-provider/service'; @@ -9,7 +11,7 @@ import { shareScreen, unshareScreen, isVideoBroadcasting } from '../screenshare/ const ActionsBarContainer = props => <ActionsBar {...props} />; -export default withTracker(({ }) => { +export default withTracker(() => { const togglePollMenu = () => { const showPoll = Session.equals('isPollOpen', false) || !Session.get('isPollOpen'); @@ -27,6 +29,18 @@ export default withTracker(({ }) => { return showPoll ? show() : hide(); }; + Meetings.find({ meetingId: Auth.meetingID }).observeChanges({ + changed: (id, fields) => { + if (fields.recordProp && fields.recordProp.recording) { + this.window.parent.postMessage({ response: 'recordingStarted' }, '*'); + } + + if (fields.recordProp && !fields.recordProp.recording) { + this.window.parent.postMessage({ response: 'recordingStopped' }, '*'); + } + }, + }); + return { isUserPresenter: Service.isUserPresenter(), isUserModerator: Service.isUserModerator(), diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/service.js b/bigbluebutton-html5/imports/ui/components/actions-bar/service.js index 1d4c0babae..1e673ea031 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/service.js +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/service.js @@ -5,16 +5,31 @@ import Meetings from '/imports/api/meetings'; import Breakouts from '/imports/api/breakouts'; const processOutsideToggleRecording = (e) => { - if (e.data === 'c_record') { - const newRecordingState = Meetings.findOne({ meetingId: Auth.meetingID }).recordProp.recording; - makeCall('toggleRecording') - .then(() => { - this.window.parent.postMessage({ response: { newRecordingState } }, '*'); - }); + switch (e.data) { + case 'c_record': { + makeCall('toggleRecording'); + break; + } + case 'c_recording_status': { + const recordingState = Meetings.findOne({ meetingId: Auth.meetingID }).recordProp.recording; + const recordingMessage = recordingState ? 'recordingStarted' : 'recordingStopped'; + this.window.parent.postMessage({ response: recordingMessage }, '*'); + break; + } + default: { + // console.log(e.data); + } } }; +const connectRecordingObserver = () => { + // notify on load complete + this.window.parent.postMessage({ response: 'readyToConnect' }, '*'); +}; + + export default { + connectRecordingObserver: () => connectRecordingObserver(), isUserPresenter: () => Users.findOne({ userId: Auth.userID }).presenter, isUserModerator: () => Users.findOne({ userId: Auth.userID }).moderator, recordSettingsList: () => Meetings.findOne({ meetingId: Auth.meetingID }).recordProp, -- GitLab