bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/webcam/container.jsx

98 lines
3.1 KiB
React
Raw Normal View History

import React, { useContext } from 'react';
import { withModalMounter } from '/imports/ui/components/modal/service';
import { withTracker } from 'meteor/react-meteor-data';
import MediaService, { getSwapLayout, shouldEnableSwapLayout } from '/imports/ui/components/media/service';
import Auth from '/imports/ui/services/auth';
import breakoutService from '/imports/ui/components/breakout-room/service';
import VideoService from '/imports/ui/components/video-provider/service';
import { UsersContext } from '../components-data/users-context/context';
2021-08-05 19:03:24 +08:00
import LayoutContext from '../layout/context';
import WebcamComponent from '/imports/ui/components/webcam/component';
const WebcamContainer = ({
audioModalIsOpen,
swapLayout,
usersVideo,
}) => {
2021-08-05 19:03:24 +08:00
const layoutContext = useContext(LayoutContext);
const { layoutContextState, layoutContextDispatch } = layoutContext;
2021-10-13 20:30:08 +08:00
const {
fullscreen, output, input, isRTL,
} = layoutContextState;
const { cameraDock, presentation } = output;
2021-08-07 01:23:46 +08:00
const { cameraDock: cameraDockInput } = input;
const { cameraOptimalGridSize } = cameraDockInput;
const { display: displayPresentation } = presentation;
const usingUsersContext = useContext(UsersContext);
const { users } = usingUsersContext;
const currentUser = users[Auth.meetingID][Auth.userID];
2021-10-13 20:30:08 +08:00
return !audioModalIsOpen
&& usersVideo.length > 0
? (
<WebcamComponent
{...{
swapLayout,
usersVideo,
cameraDock,
cameraOptimalGridSize,
2021-08-05 19:03:24 +08:00
layoutContextDispatch,
fullscreen,
isPresenter: currentUser.presenter,
displayPresentation,
2021-08-07 01:23:46 +08:00
isRTL,
}}
/>
)
: null;
};
let userWasInBreakout = false;
export default withModalMounter(withTracker(() => {
const { current_presentation: hasPresentation } = MediaService.getPresentationInfo();
const data = {
audioModalIsOpen: Session.get('audioModalIsOpen'),
isMeteorConnected: Meteor.status().connected,
};
const userIsInBreakout = breakoutService.getBreakoutUserIsIn(Auth.userID);
let deviceIds = Session.get('deviceIds');
if (!userIsInBreakout && userWasInBreakout && deviceIds && deviceIds !== '') {
/* used when re-sharing cameras after leaving a breakout room.
it is needed in cases where the user has more than one active camera
so we only share the second camera after the first
has finished loading (can't share more than one at the same time) */
const canConnect = Session.get('canConnect');
deviceIds = deviceIds.split(',');
if (canConnect) {
const deviceId = deviceIds.shift();
Session.set('canConnect', false);
Session.set('WebcamDeviceId', deviceId);
Session.set('deviceIds', deviceIds.join(','));
VideoService.joinVideo(deviceId);
}
} else {
userWasInBreakout = userIsInBreakout;
}
const { streams: usersVideo } = VideoService.getVideoStreams();
data.usersVideo = usersVideo;
data.swapLayout = (getSwapLayout() || !hasPresentation) && shouldEnableSwapLayout();
if (data.swapLayout) {
data.floatingOverlay = true;
data.hideOverlay = true;
}
return data;
})(WebcamContainer));