bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/plugins-engine/plugin-hooks-handler/use-current-user/container.tsx

99 lines
3.1 KiB
TypeScript

import { useEffect, useState } from 'react';
import useCurrentUser from '/imports/ui/core/hooks/useCurrentUser';
import * as PluginSdk from 'bigbluebutton-html-plugin-sdk';
import { User } from '/imports/ui/Types/user';
const projectCurrentUser = (
currentUser: Partial<User> | undefined,
): PluginSdk.User | undefined => {
let currentUserToPluginHookProjection: PluginSdk.User | undefined;
if (currentUser?.userId) {
currentUserToPluginHookProjection = {
userId: currentUser.userId,
extId: currentUser.extId,
name: currentUser.name,
isModerator: currentUser.isModerator,
isOnline: currentUser.isOnline,
role: currentUser.role,
color: currentUser.color,
avatar: currentUser.avatar,
emoji: currentUser.emoji,
presenter: currentUser.presenter,
pinned: currentUser.pinned,
guest: currentUser.guest,
mobile: currentUser.mobile,
whiteboardAccess: currentUser.whiteboardAccess,
voice: {
joined: currentUser.voice?.joined,
listenOnly: currentUser.voice?.listenOnly,
talking: currentUser.voice?.talking,
muted: currentUser.voice?.muted,
voiceUserId: currentUser.voice?.voiceUserId,
callerName: currentUser.voice?.callerName,
callerNum: currentUser.voice?.callerNum,
callingWith: currentUser.voice?.callingWith,
color: currentUser.voice?.color,
endTime: currentUser.voice?.endTime,
floor: currentUser.voice?.floor,
lastFloorTime: currentUser.voice?.lastFloorTime,
lastSpeakChangedAt: currentUser.voice?.lastSpeakChangedAt,
meetingId: currentUser.voice?.meetingId,
spoke: currentUser.voice?.spoke,
startTime: currentUser.voice?.startTime,
} as PluginSdk.Voice,
locked: currentUser.locked,
lastBreakoutRoom: currentUser.lastBreakoutRoom,
cameras: currentUser.cameras,
presPagesWritable: currentUser.presPagesWritable,
speechLocale: currentUser.speechLocale,
} as PluginSdk.User;
}
return currentUserToPluginHookProjection;
};
const CurrentUserHookContainer = () => {
const [sendSignal, setSendSignal] = useState(false);
const currentUser = useCurrentUser(
(currentUser: Partial<User>) => currentUser,
);
const updateUserForPlugin = () => {
const currentUserProjection:
PluginSdk.User | undefined = projectCurrentUser(currentUser);
window.dispatchEvent(
new CustomEvent(
PluginSdk.Internal.BbbHookEvents.Update,
{
detail: {
data: currentUserProjection,
hook: PluginSdk.Internal.BbbHooks.UseCurrentUser,
},
},
),
);
};
useEffect(() => {
updateUserForPlugin();
}, [currentUser, sendSignal]);
useEffect(() => {
const updateHookUseCurrentUser = () => {
setSendSignal(!sendSignal);
};
window.addEventListener(
PluginSdk.Internal.BbbHookEvents.Subscribe, updateHookUseCurrentUser,
);
return () => {
window.removeEventListener(
PluginSdk.Internal.BbbHookEvents.Subscribe, updateHookUseCurrentUser,
);
};
}, []);
return null;
};
export default CurrentUserHookContainer;