bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/components-data/voiceUserGraphQlMiniMongoAdapter/component.tsx

51 lines
1.5 KiB
TypeScript

import { useSubscription } from '@apollo/client';
import React, { useEffect, useRef, useState } from 'react';
import VoiceUsers from '/imports/api/voice-users/';
import logger from '/imports/startup/client/logger';
import { UserVoiceStreamResponse, voiceUserStream } from './queries';
import { AdapterProps } from '../graphqlToMiniMongoAdapterManager/component';
const VoiceUserGrapQlMiniMongoAdapter: React.FC<AdapterProps> = ({
onReady,
children,
}) => {
const ready = useRef(false);
const {
loading,
error,
data,
} = useSubscription<UserVoiceStreamResponse>(voiceUserStream);
const [voiceUserDataSetted, setVoiceUserDataSetted] = useState(false);
useEffect(() => {
if (error) {
logger.error('Error in VoiceUserGrapQlMiniMongoAdapter', error);
}
}, [error]);
useEffect(() => {
if (data && data.user_voice_mongodb_adapter_stream) {
const usersVoice = data.user_voice_mongodb_adapter_stream;
usersVoice.forEach((userVoice) => {
VoiceUsers.upsert({ userId: userVoice.userId }, userVoice);
});
}
}, [data]);
useEffect(() => {
if (loading) {
// loading turns false only first audio join of the meeting, probably because it's a stream
if (!ready.current) {
ready.current = true;
onReady('VoiceUserGrapQlMiniMongoAdapter');
}
if (!voiceUserDataSetted) {
setVoiceUserDataSetted(true);
}
}
}, [loading]);
return children;
};
export default VoiceUserGrapQlMiniMongoAdapter;