bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/webcam/container.jsx
Tainan Felipe 3bc40df230
Add: useDeduplicatedSubscription hook (#20376)
* Add: useDeduplicatedSubscription hook

* Fix: TS error

* Add: components using useDeduplicatedSubscription

* Change: Move to useDeduplicatedSubscription

* Change: unsubscribe logic to own useEffect

* Change: remove file import over package

* Fix: TS errors

* Fix: private chat not loading

* Change: revert changes on queries

* Fix: eslint error

* Remove: html-webpack-plugin package

* Fix: external video

* Add: comment about the stringToHash function

* Fix: video player showing tools over presentation
2024-06-04 10:40:54 -03:00

101 lines
3.0 KiB
JavaScript

import React from 'react';
import { withTracker } from 'meteor/react-meteor-data';
import VideoService from '/imports/ui/components/video-provider/service';
import {
layoutSelect,
layoutSelectInput,
layoutSelectOutput,
layoutDispatch,
} from '../layout/context';
import WebcamComponent from '/imports/ui/components/webcam/component';
import { LAYOUT_TYPE } from '../layout/enums';
import { sortVideoStreams } from '/imports/ui/components/video-provider/stream-sorting';
import {
CURRENT_PRESENTATION_PAGE_SUBSCRIPTION,
} from '/imports/ui/components/whiteboard/queries';
import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser';
import WebcamContainerGraphql from './webcam-graphql/component';
import useDeduplicatedSubscription from '../../core/hooks/useDeduplicatedSubscription';
const WebcamContainer = ({
audioModalIsOpen,
usersVideo,
layoutType,
isLayoutSwapped,
}) => {
const fullscreen = layoutSelect((i) => i.fullscreen);
const isRTL = layoutSelect((i) => i.isRTL);
const cameraDockInput = layoutSelectInput((i) => i.cameraDock);
const presentation = layoutSelectOutput((i) => i.presentation);
const cameraDock = layoutSelectOutput((i) => i.cameraDock);
const layoutContextDispatch = layoutDispatch();
const { data: presentationPageData } = useDeduplicatedSubscription(
CURRENT_PRESENTATION_PAGE_SUBSCRIPTION,
);
const presentationPage = presentationPageData?.pres_page_curr[0] || {};
const hasPresentation = !!presentationPage?.presentationId;
const swapLayout = !hasPresentation || isLayoutSwapped;
let floatingOverlay = false;
let hideOverlay = false;
if (swapLayout) {
floatingOverlay = true;
hideOverlay = true;
}
const { cameraOptimalGridSize } = cameraDockInput;
const { display: displayPresentation } = presentation;
const { data: currentUserData } = useCurrentUser((user) => ({
presenter: user.presenter,
}));
const isGridEnabled = layoutType === LAYOUT_TYPE.VIDEO_FOCUS;
return !audioModalIsOpen
&& (usersVideo.length > 0 || isGridEnabled)
? (
<WebcamComponent
{...{
swapLayout,
usersVideo,
focusedId: cameraDock.focusedId,
cameraDock,
cameraOptimalGridSize,
layoutContextDispatch,
fullscreen,
isPresenter: currentUserData?.presenter,
displayPresentation,
isRTL,
isGridEnabled,
floatingOverlay,
hideOverlay,
}}
/>
)
: null;
};
withTracker(() => {
const data = {
audioModalIsOpen: Session.get('audioModalIsOpen'),
isMeteorConnected: Meteor.status().connected,
};
const { streams: usersVideo, gridUsers } = VideoService.getVideoStreams();
const { defaultSorting: DEFAULT_SORTING } = window.meetingClientSettings.public.kurento.cameraSortingModes;
if (gridUsers.length > 0) {
const items = usersVideo.concat(gridUsers);
data.usersVideo = sortVideoStreams(items, DEFAULT_SORTING);
} else {
data.usersVideo = usersVideo;
}
return data;
})(WebcamContainer);
export default WebcamContainerGraphql;