diff --git a/bigbluebutton-html5/imports/api/breakouts/server/handlers/breakoutJoinURL.js b/bigbluebutton-html5/imports/api/breakouts/server/handlers/breakoutJoinURL.js index d0d6975024916c57f1e89384e761ff48399f10ae..0b4e593134e900035ffa8793aa0070c021e14bf2 100644 --- a/bigbluebutton-html5/imports/api/breakouts/server/handlers/breakoutJoinURL.js +++ b/bigbluebutton-html5/imports/api/breakouts/server/handlers/breakoutJoinURL.js @@ -20,6 +20,7 @@ export default function handleBreakoutJoinURL({ body }) { users: { userId, redirectToHtml5JoinURL, + insertedTime: new Date().getTime(), }, }, }; diff --git a/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js b/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js index 971e43df2c788445f44ec6c0f0566c2ab218045f..f2da4d7d3208eeec9217d34d6477e0b569484530 100755 --- a/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js +++ b/bigbluebutton-html5/imports/api/breakouts/server/methods/requestJoinURL.js @@ -1,7 +1,6 @@ import { Meteor } from 'meteor/meteor'; import { check } from 'meteor/check'; import RedisPubSub from '/imports/startup/server/redis'; -import Breakouts from '/imports/api/breakouts'; export default function requestJoinURL(credentials, { breakoutId, userId: userIdToInvite }) { const REDIS_CONFIG = Meteor.settings.private.redis; @@ -13,10 +12,6 @@ export default function requestJoinURL(credentials, { breakoutId, userId: userId check(requesterUserId, String); check(requesterToken, String); const userId = userIdToInvite || requesterUserId; - const Breakout = Breakouts.findOne({ breakoutId }); - const BreakoutUser = Breakout.users.filter(user => user.userId === userId).shift(); - - if (BreakoutUser) return null; const eventName = 'RequestBreakoutJoinURLReqMsg'; return RedisPubSub.publishUserMessage( diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx index 73d2d3aa5eff6304e8dfb3eb2c40db21246b38fa..3f247837af1e7ae88fb030824f3ccdd8b0396e5b 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/component.jsx @@ -128,6 +128,8 @@ class NavBar extends PureComponent { isBreakoutRoom, mountModal, recordProps, + currentBreakoutUser, + getBreakoutByUser, } = this.props; if (!recordProps.recording) { @@ -143,11 +145,21 @@ class NavBar extends PureComponent { const hadBreakouts = oldProps.breakouts.length; const hasBreakouts = breakouts.length; - if (!hasBreakouts && hadBreakouts) { closeBreakoutJoinConfirmation(mountModal); } + if (hasBreakouts && currentBreakoutUser) { + const currentIsertedTime = currentBreakoutUser.insertedTime; + const oldCurrentUser = oldProps.currentBreakoutUser || {}; + const oldInsertedTime = oldCurrentUser.insertedTime; + + if (currentIsertedTime !== oldInsertedTime) { + const breakoutRoom = getBreakoutByUser(currentBreakoutUser); + this.inviteUserToBreakout(breakoutRoom); + } + } + breakouts.forEach((breakout) => { if (!breakout.users) { return; @@ -157,7 +169,7 @@ class NavBar extends PureComponent { if (!userOnMeeting) return; - if (!didSendBreakoutInvite && !isBreakoutRoom) { + if ((!didSendBreakoutInvite && !isBreakoutRoom) ) { this.inviteUserToBreakout(breakout); } }); diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx index f38c89ad244d23d58ed71372704c81002e4d28b3..0da9d1c2f85bac3c4dfbd130649ddd30d8e9fd48 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx @@ -86,6 +86,8 @@ export default withTracker(() => { presentationTitle: meetingTitle, hasUnreadMessages: checkUnreadMessages(), isBreakoutRoom: meetingIsBreakout(), + getBreakoutByUser: Service.getBreakoutByUser, + currentBreakoutUser: Service.getBreakoutUserByUserId(Auth.userID), recordProps: meetingRecorded, toggleUserList: () => { Session.set('isUserListOpen', !isExpanded); diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/service.js b/bigbluebutton-html5/imports/ui/components/nav-bar/service.js index 857da9f7403f0b66d945b81dcbdc210e1721156e..44fa05bd3f47a4b95c88e0a38fe1283283e4e861 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/service.js +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/service.js @@ -2,6 +2,28 @@ import Auth from '/imports/ui/services/auth'; import Breakouts from '/imports/api/breakouts'; import { makeCall } from '/imports/ui/services/api'; import Meetings from '/imports/api/meetings'; +import fp from 'lodash/fp'; + +const getBreakoutByUserId = userId => Breakouts.find({ 'users.userId': userId }).fetch(); + +const getBreakoutByUser = user => Breakouts.findOne({ users: user }); + +const getUsersFromBreakouts = breakoutsArray => breakoutsArray + .map(breakout => breakout.users) + .flat(); + +const filterUserURLs = userId => breakoutUsersArray => breakoutUsersArray + .filter(user => user.userId === userId); + +const getLastURLInserted = breakoutURLArray => breakoutURLArray + .sort((a, b) => a.insertedTime - b.insertedTime).pop(); + +const getBreakoutUserByUserId = userId => fp.pipe( + getBreakoutByUserId, + getUsersFromBreakouts, + filterUserURLs(userId), + getLastURLInserted, +)(userId); const getBreakouts = () => Breakouts.find({}, { sort: { sequence: 1 } }).fetch(); @@ -32,6 +54,7 @@ const connectRecordingObserver = () => { export default { connectRecordingObserver: () => connectRecordingObserver(), processOutsideToggleRecording: arg => processOutsideToggleRecording(arg), + getBreakoutUserByUserId, + getBreakoutByUser, getBreakouts, }; -