bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/common/modal/random-user/container.jsx

107 lines
3.3 KiB
React
Raw Normal View History

import React, { useContext } from 'react';
import { withTracker } from 'meteor/react-meteor-data';
import Meetings from '/imports/api/meetings';
import Users from '/imports/api/users';
import Auth from '/imports/ui/services/auth';
import { makeCall } from '/imports/ui/services/api';
import RandomUserSelect from './component';
import { UsersContext } from '/imports/ui/components/components-data/users-context/context';
2021-11-04 23:16:47 +08:00
import logger from '/imports/startup/client/logger';
2021-03-20 02:52:03 +08:00
const SELECT_RANDOM_USER_ENABLED = Meteor.settings.public.selectRandomUser.enabled;
2021-11-04 23:16:47 +08:00
// A value that is used by component to remember
// whether it should be open or closed after a render
2021-10-28 02:47:48 +08:00
let keepModalOpen = true;
2021-11-04 23:16:47 +08:00
// A value that stores the previous indicator
2021-10-28 02:47:48 +08:00
let updateIndicator = 1;
2021-11-04 23:16:47 +08:00
const toggleKeepModalOpen = () => { keepModalOpen = ! keepModalOpen; };
2021-10-28 02:47:48 +08:00
const RandomUserSelectContainer = (props) => {
const usingUsersContext = useContext(UsersContext);
const { users } = usingUsersContext;
const { randomlySelectedUser } = props;
let mappedRandomlySelectedUsers = [];
2021-11-04 23:16:47 +08:00
const currentUser = {
userId: Auth.userID,
presenter: users[Auth.meetingID][Auth.userID].presenter
};
2021-10-28 02:47:48 +08:00
2021-11-04 23:16:47 +08:00
try {
if (!currentUser.presenter // this functionality does not bother presenter
&& (!keepModalOpen) // we only ween a change if modal has been closed before
&& (randomlySelectedUser[0][1] !== updateIndicator)// if tey are different, a user was generated
) { keepModalOpen = true; } // reopen modal
if (!currentUser.presenter) { updateIndicator = randomlySelectedUser[0][1]; } // keep indicator up to date
} catch (err) {
logger.error({
logCode: 'Random_USer_Error',
extraInfo: {
stackTrace: err,
},
},
'\nIssue in Random User Select container caused by back-end crash'
+ '\nValue of 6 randomly selected users was passed as '
+ `{${randomlySelectedUser}}`
+ '\nHowever, it is handled.'
+ '\nError message:'
+ `\n${err}`);
}
2021-10-28 02:47:48 +08:00
if (randomlySelectedUser) {
mappedRandomlySelectedUsers = randomlySelectedUser.map((ui) => {
const selectedUser = users[Auth.meetingID][ui[0]];
if (selectedUser){
return [{
userId: selectedUser.userId,
avatar: selectedUser.avatar,
color: selectedUser.color,
name: selectedUser.name,
}, ui[1]];
}
});
}
2021-11-04 23:16:47 +08:00
return (
<RandomUserSelect
{...props}
mappedRandomlySelectedUsers={mappedRandomlySelectedUsers}
currentUser={currentUser}
keepModalOpen={keepModalOpen}
/>
);
};
export default withTracker(() => {
const viewerPool = Users.find({
meetingId: Auth.meetingID,
presenter: { $ne: true },
role: { $eq: 'VIEWER' },
}, {
fields: {
userId: 1,
},
}).fetch();
const meeting = Meetings.findOne({ meetingId: Auth.meetingID }, {
fields: {
randomlySelectedUser: 1,
},
});
2021-03-20 02:52:03 +08:00
const randomUserReq = () => (SELECT_RANDOM_USER_ENABLED ? makeCall('setRandomUser') : null);
2021-03-20 02:52:03 +08:00
const clearRandomlySelectedUser = () => (SELECT_RANDOM_USER_ENABLED ? makeCall('clearRandomlySelectedUser') : null);
return ({
2021-10-28 02:47:48 +08:00
toggleKeepModalOpen,
numAvailableViewers: viewerPool.length,
randomUserReq,
clearRandomlySelectedUser,
randomlySelectedUser: meeting.randomlySelectedUser,
});
})(RandomUserSelectContainer);