2024-04-20 04:34:43 +08:00
|
|
|
import React from 'react';
|
|
|
|
import { useMutation } from '@apollo/client';
|
|
|
|
import useMeeting from '/imports/ui/core/hooks/useMeeting';
|
|
|
|
import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser';
|
|
|
|
import {
|
|
|
|
useCurrentVideoPageIndex,
|
|
|
|
useExitVideo,
|
2024-05-02 03:48:12 +08:00
|
|
|
useInfo,
|
2024-04-20 04:34:43 +08:00
|
|
|
useIsUserLocked,
|
2024-05-02 03:48:12 +08:00
|
|
|
useLockUser,
|
|
|
|
useStopVideo,
|
2024-04-20 04:34:43 +08:00
|
|
|
useVideoStreams,
|
|
|
|
} from './hooks';
|
2024-05-02 03:30:29 +08:00
|
|
|
import { CAMERA_BROADCAST_START } from './mutations';
|
2024-04-20 04:34:43 +08:00
|
|
|
import VideoProvider from './component';
|
|
|
|
import VideoService from './service';
|
2024-05-02 03:48:12 +08:00
|
|
|
import { Output } from '/imports/ui/components/layout/layoutTypes';
|
|
|
|
import { VideoItem } from './types';
|
2024-05-17 22:17:27 +08:00
|
|
|
import useSettings from '/imports/ui/services/settings/hooks/useSettings';
|
|
|
|
import { SETTINGS } from '/imports/ui/services/settings/enums';
|
2024-04-20 04:34:43 +08:00
|
|
|
|
|
|
|
interface VideoProviderContainerGraphqlProps {
|
2024-05-02 03:48:12 +08:00
|
|
|
focusedId: string;
|
|
|
|
swapLayout: boolean;
|
|
|
|
isGridEnabled: boolean;
|
|
|
|
cameraDock: Output['cameraDock'];
|
|
|
|
handleVideoFocus:(id: string) => void;
|
2024-04-20 04:34:43 +08:00
|
|
|
}
|
|
|
|
|
2024-05-02 03:48:12 +08:00
|
|
|
const VideoProviderContainerGraphql: React.FC<VideoProviderContainerGraphqlProps> = (props) => {
|
2024-04-20 04:34:43 +08:00
|
|
|
const {
|
2024-05-02 03:48:12 +08:00
|
|
|
cameraDock,
|
|
|
|
focusedId,
|
|
|
|
handleVideoFocus,
|
|
|
|
isGridEnabled,
|
|
|
|
swapLayout,
|
2024-04-20 04:34:43 +08:00
|
|
|
} = props;
|
|
|
|
const [cameraBroadcastStart] = useMutation(CAMERA_BROADCAST_START);
|
|
|
|
|
|
|
|
const sendUserShareWebcam = (cameraId: string) => {
|
|
|
|
return cameraBroadcastStart({ variables: { cameraId } });
|
|
|
|
};
|
|
|
|
|
|
|
|
const playStart = (cameraId: string) => {
|
|
|
|
if (VideoService.isLocalStream(cameraId)) {
|
|
|
|
sendUserShareWebcam(cameraId).then(() => {
|
|
|
|
setTimeout(() => {
|
|
|
|
VideoService.joinedVideo();
|
|
|
|
}, 500);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
const { data: currentMeeting } = useMeeting((m) => ({
|
|
|
|
usersPolicies: m.usersPolicies,
|
|
|
|
}));
|
|
|
|
|
|
|
|
const { data: currentUser } = useCurrentUser((user) => ({
|
|
|
|
locked: user.locked,
|
2024-05-17 22:17:27 +08:00
|
|
|
userId: user.userId,
|
2024-04-20 04:34:43 +08:00
|
|
|
}));
|
|
|
|
|
2024-05-17 22:17:27 +08:00
|
|
|
const currentUserId = currentUser?.userId ?? '';
|
|
|
|
// @ts-ignore Untyped object
|
|
|
|
const { paginationEnabled } = useSettings(SETTINGS.APPLICATION);
|
|
|
|
// @ts-ignore Untyped object
|
|
|
|
const { viewParticipantsWebcams } = useSettings(SETTINGS.DATA_SAVING);
|
|
|
|
// TODO: Remove/Replace this
|
|
|
|
const isMeteorConnected = true;
|
|
|
|
|
2024-04-20 04:34:43 +08:00
|
|
|
const {
|
|
|
|
streams,
|
|
|
|
gridUsers,
|
|
|
|
totalNumberOfStreams,
|
|
|
|
users,
|
2024-05-02 03:48:12 +08:00
|
|
|
} = useVideoStreams(isGridEnabled, paginationEnabled, viewParticipantsWebcams);
|
2024-04-20 04:34:43 +08:00
|
|
|
|
2024-05-02 03:48:12 +08:00
|
|
|
let usersVideo: VideoItem[] = streams;
|
2024-04-20 04:34:43 +08:00
|
|
|
|
2024-05-02 03:48:12 +08:00
|
|
|
if (gridUsers.length > 0 && isGridEnabled) {
|
2024-04-20 04:34:43 +08:00
|
|
|
usersVideo = usersVideo.concat(gridUsers);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (
|
|
|
|
currentMeeting?.usersPolicies?.webcamsOnlyForModerator
|
|
|
|
&& currentUser?.locked
|
|
|
|
) {
|
2024-05-02 01:14:10 +08:00
|
|
|
usersVideo = usersVideo.filter(
|
|
|
|
(uv) => (uv.type !== 'connecting' && uv.isModerator) || uv.userId === currentUserId,
|
|
|
|
);
|
2024-04-20 04:34:43 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
const isUserLocked = useIsUserLocked();
|
|
|
|
const currentVideoPageIndex = useCurrentVideoPageIndex();
|
|
|
|
const exitVideo = useExitVideo();
|
2024-05-02 03:48:12 +08:00
|
|
|
const lockUser = useLockUser();
|
|
|
|
const stopVideo = useStopVideo();
|
|
|
|
const info = useInfo();
|
|
|
|
|
|
|
|
if (!usersVideo.length && !isGridEnabled) return null;
|
2024-04-20 04:34:43 +08:00
|
|
|
|
|
|
|
return (
|
2024-05-02 03:48:12 +08:00
|
|
|
<VideoProvider
|
|
|
|
cameraDock={cameraDock}
|
|
|
|
focusedId={focusedId}
|
|
|
|
handleVideoFocus={handleVideoFocus}
|
2024-05-02 03:30:29 +08:00
|
|
|
isGridEnabled={isGridEnabled}
|
2024-05-02 03:48:12 +08:00
|
|
|
isMeteorConnected={isMeteorConnected}
|
|
|
|
swapLayout={swapLayout}
|
|
|
|
currentUserId={currentUserId}
|
|
|
|
paginationEnabled={paginationEnabled}
|
|
|
|
viewParticipantsWebcams={viewParticipantsWebcams}
|
|
|
|
totalNumberOfStreams={totalNumberOfStreams}
|
|
|
|
isUserLocked={isUserLocked}
|
|
|
|
currentVideoPageIndex={currentVideoPageIndex}
|
|
|
|
streams={usersVideo}
|
|
|
|
users={users}
|
|
|
|
info={info}
|
|
|
|
playStart={playStart}
|
|
|
|
exitVideo={exitVideo}
|
|
|
|
lockUser={lockUser}
|
|
|
|
stopVideo={stopVideo}
|
|
|
|
/>
|
2024-04-20 04:34:43 +08:00
|
|
|
);
|
|
|
|
};
|
|
|
|
|
2024-05-17 22:17:27 +08:00
|
|
|
export default VideoProviderContainerGraphql;
|