diff --git a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx index 646bae710f371ed62c7117dd63bde9a455019606..748d22edcbf0c0a2f8bbe70638bc465b8e440569 100644 --- a/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/actions-bar/container.jsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { Meteor } from 'meteor/meteor'; import { withTracker } from 'meteor/react-meteor-data'; import { injectIntl } from 'react-intl'; @@ -6,6 +6,7 @@ import getFromUserSettings from '/imports/ui/services/users-settings'; import Auth from '/imports/ui/services/auth'; import PresentationService from '/imports/ui/components/presentation/service'; import Presentations from '/imports/api/presentations'; +import { UsersContext } from '../components-data/users-context/context'; import ActionsBar from './component'; import Service from './service'; import UserListService from '/imports/ui/components/user-list/service'; @@ -17,7 +18,21 @@ import MediaService, { shouldEnableSwapLayout, } from '../media/service'; -const ActionsBarContainer = props => <ActionsBar {...props} />; +const ActionsBarContainer = (props) => { + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + return ( + <ActionsBar { + ...{ + ...props, + currentUser, + } + } + /> + ); +}; + const POLLING_ENABLED = Meteor.settings.public.poll.enabled; const PRESENTATION_DISABLED = Meteor.settings.public.layout.hidePresentation; const SELECT_RANDOM_USER_ENABLED = Meteor.settings.public.selectRandomUser.enabled; @@ -42,5 +57,4 @@ export default withTracker(() => ({ { fields: {} }), allowExternalVideo: Meteor.settings.public.externalVideoPlayer.enabled, setEmojiStatus: UserListService.setEmojiStatus, - currentUser: Service.currentUser(), }))(injectIntl(ActionsBarContainer)); diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx index c4c0149bfd41d821484259e20fa2c5f53f1657a9..872c7263c47f4697907809b8c24b9ed00c2013b6 100755 --- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx @@ -4,9 +4,9 @@ import { withModalMounter } from '/imports/ui/components/modal/service'; import AudioManager from '/imports/ui/services/audio-manager'; import { makeCall } from '/imports/ui/services/api'; import lockContextContainer from '/imports/ui/components/lock-viewers/context/container'; +import { withUsersConsumer } from '/imports/ui/components/components-data/users-context/context'; import logger from '/imports/startup/client/logger'; import Auth from '/imports/ui/services/auth'; -import Users from '/imports/api/users'; import Storage from '/imports/ui/services/storage/session'; import getFromUserSettings from '/imports/ui/services/users-settings'; import AudioControls from './component'; @@ -74,13 +74,8 @@ const { joinListenOnly, } = Service; -export default lockContextContainer(withModalMounter(withTracker(({ mountModal, userLocks }) => { - const currentUser = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, { - fields: { - role: 1, - presenter: 1, - }, - }); +export default withUsersConsumer(lockContextContainer(withModalMounter(withTracker(({ mountModal, userLocks, users }) => { + const currentUser = users[Auth.userID]; const isViewer = currentUser.role === ROLE_VIEWER; const isPresenter = currentUser.presenter; const { status } = Service.getBreakoutAudioTransferStatus(); @@ -108,4 +103,4 @@ export default lockContextContainer(withModalMounter(withTracker(({ mountModal, isViewer, isPresenter, }); -})(AudioControlsContainer))); +})(AudioControlsContainer)))); diff --git a/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx index dd0ad81433fb613244856c71d7022b1208e2570a..bf495ad4237aa1e713ab3f97fbdcecb096aae14f 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/chat/alert/container.jsx @@ -1,20 +1,24 @@ -import React, { memo } from 'react'; +import React, { memo, useContext } from 'react'; import { withTracker } from 'meteor/react-meteor-data'; -import UserListService from '/imports/ui/components/user-list/service'; import Settings from '/imports/ui/services/settings'; import ChatAlert from './component'; import Auth from '/imports/ui/services/auth'; -import Users from '/imports/api/users'; +import { UsersContext } from '/imports/ui/components/components-data/users-context/context'; -const ChatAlertContainer = props => ( - <ChatAlert {...props} /> -); +const ChatAlertContainer = (props) => { + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + const { authTokenValidatedTime } = currentUser; + return ( + <ChatAlert {...props} joinTimestamp={authTokenValidatedTime} /> + ); +}; export default withTracker(() => { const AppSettings = Settings.application; const activeChats = []; // UserListService.getActiveChats(); - const { loginTime } = Users.findOne({ userId: Auth.userID }, { fields: { loginTime: 1 } }); const openPanel = Session.get('openPanel'); let idChatOpen = Session.get('idChatOpen'); @@ -31,7 +35,6 @@ export default withTracker(() => { pushAlertDisabled: !AppSettings.chatPushAlerts, activeChats, publicUserId: Meteor.settings.public.chat.public_group_id, - joinTimestamp: loginTime, idChatOpen, }; })(memo(ChatAlertContainer)); diff --git a/bigbluebutton-html5/imports/ui/components/chat/component.jsx b/bigbluebutton-html5/imports/ui/components/chat/component.jsx index 8647e56b28f96af422f29a830076d83a6048734a..4746fc948186f3becc174c98b64d95a38406e932 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/chat/component.jsx @@ -143,12 +143,6 @@ export default withShortcutHelper(injectWbResizeEvent(injectIntl(memo(Chat))), [ const propTypes = { chatID: PropTypes.string.isRequired, title: PropTypes.string.isRequired, - messages: PropTypes.arrayOf(PropTypes.objectOf(PropTypes.oneOfType([ - PropTypes.array, - PropTypes.string, - PropTypes.number, - PropTypes.object, - ])).isRequired).isRequired, shortcuts: PropTypes.objectOf(PropTypes.string), partnerIsLoggedOut: PropTypes.bool.isRequired, isChatLocked: PropTypes.bool.isRequired, diff --git a/bigbluebutton-html5/imports/ui/components/chat/container.jsx b/bigbluebutton-html5/imports/ui/components/chat/container.jsx index 001b37f9ac0eb1931774b1823a7ca8d7c098a218..cb84a08ada09e0a0f47fdaed3430f62da6c99d5c 100755 --- a/bigbluebutton-html5/imports/ui/components/chat/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/chat/container.jsx @@ -8,7 +8,9 @@ import Storage from '/imports/ui/services/storage/session'; import { meetingIsBreakout } from '/imports/ui/components/app/service'; import { ChatContext, getLoginTime } from '../components-data/chat-context/context'; import { GroupChatContext } from '../components-data/group-chat-context/context'; +import { UsersContext } from '../components-data/users-context/context'; import ChatLogger from '/imports/ui/components/chat/chat-logger/ChatLogger'; +import lockContextContainer from '/imports/ui/components/lock-viewers/context/container'; import Chat from './component'; import ChatService from './service'; @@ -60,6 +62,7 @@ const throttledFunc = _.throttle(() => { }, DEBOUNCE_TIME, { trailing: true, leading: true }); const ChatContainer = (props) => { + useEffect(() => { ChatService.removeFromClosedChatsSession(); }, []); @@ -71,11 +74,13 @@ const ChatContainer = (props) => { children, unmounting, chatID, - amIModerator, loginTime, intl, + userLocks, + lockSettings, + users: propUsers, + ...restProps } = props; - ChatLogger.debug('ChatContainer::render::props', props); const isPublicChat = chatID === PUBLIC_CHAT_KEY; @@ -103,7 +108,10 @@ const ChatContainer = (props) => { sender: null, } }; - + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + const amIModerator = currentUser.role === ROLE_MODERATOR; const systemMessagesIds = [sysMessagesIds.welcomeId, amIModerator && modOnlyMessage && sysMessagesIds.moderatorId].filter(i => i); const usingChatContext = useContext(ChatContext); @@ -111,7 +119,7 @@ const ChatContainer = (props) => { const [stateLastMsg, setLastMsg] = useState(null); const [stateTimeWindows, setTimeWindows] = useState(isPublicChat ? [...systemMessagesIds.map((item) => systemMessages[item])] : []); const [lastTimeWindowValuesBuild, setLastTimeWindowValuesBuild] = useState(0); - + const { groupChat } = usingGroupChatContext; const participants = groupChat[chatID]?.participants; const chatName = participants?.filter((user) => user.id !== Auth.userID)[0]?.name; @@ -171,10 +179,10 @@ const ChatContainer = (props) => { ["ReactVirtualized__Grid", "ReactVirtualized__Grid__innerScrollContainer"], "role" ); - + return ( <Chat {...{ - ...props, + ...restProps, chatID, amIModerator, count: (contextChat?.unreadTimeWindows.size || 0), @@ -184,7 +192,6 @@ const ChatContainer = (props) => { syncing: contextChat?.syncing, syncedPercent: contextChat?.syncedPercent, chatName, - contextChat, lastTimeWindowValuesBuild, }}> {children} @@ -192,16 +199,11 @@ const ChatContainer = (props) => { ); }; -export default injectIntl(withTracker(({ intl }) => { +export default lockContextContainer(injectIntl(withTracker(({ intl, userLocks }) => { const chatID = Session.get('idChatOpen'); - let isChatLocked = ChatService.isChatLocked(chatID); - - // let chatName = title; + const isChatLocked = userLocks.userPrivateChat || userLocks.userPublicChat; let partnerIsLoggedOut = false; - const currentUser = ChatService.getUser(Auth.userID); - const amIModerator = currentUser.role === ROLE_MODERATOR; - if (!chatID) { // No chatID is set so the panel is closed, about to close, or wasn't opened correctly return { @@ -209,22 +211,18 @@ export default injectIntl(withTracker(({ intl }) => { }; } - - const { connected: isMeteorConnected } = Meteor.status(); return { chatID, intl, - messages: [], partnerIsLoggedOut, isChatLocked, isMeteorConnected, - amIModerator, meetingIsBreakout: meetingIsBreakout(), loginTime: getLoginTime(), actions: { handleClosePrivateChat: ChatService.closePrivateChat, }, }; -})(ChatContainer)); +})(ChatContainer))); diff --git a/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx b/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx index 18585a8b2a75a8f0fb46b10783c57581e794baf3..2b73a0d49ff226321e541e8673ab51fdf210a2e5 100644 --- a/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx +++ b/bigbluebutton-html5/imports/ui/components/components-data/users-context/context.jsx @@ -109,8 +109,9 @@ export const UsersContextConsumer = Component => props => ( </UsersContext.Consumer> ); +export const withUsersConsumer = Component => UsersContextConsumer(Component); + export default { UsersContextConsumer, UsersContextProvider, }; - diff --git a/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx b/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx index 33f8bc1bc1255e1fb71d093801ea08e788566a36..e3573e5ed5c03ff984d24fd5cab3e09e07c6da6f 100644 --- a/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/lock-viewers/context/container.jsx @@ -1,17 +1,17 @@ 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 { LockStruct } from './context'; +import { withUsersConsumer } from '/imports/ui/components/components-data/users-context/context'; import { withLockContext } from './withContext'; const ROLE_MODERATOR = Meteor.settings.public.user.role_moderator; -const lockContextContainer = component => withTracker(() => { +const lockContextContainer = component => withUsersConsumer(withTracker(({ users }) => { const lockSetting = new LockStruct(); const Meeting = Meetings.findOne({ meetingId: Auth.meetingID }, { fields: { lockSettingsProps: 1 } }); - const User = Users.findOne({ userId: Auth.userID }, { fields: { locked: 1, role: 1 } }); + const User = users[Auth.userID]; const userIsLocked = User.locked && User.role !== ROLE_MODERATOR; const lockSettings = Meeting.lockSettingsProps; @@ -25,6 +25,6 @@ const lockContextContainer = component => withTracker(() => { lockSetting.userLocks.userLockedLayout = userIsLocked && lockSettings.lockedLayout; return lockSetting; -})(withLockContext(component)); +})(withLockContext(component))); export default lockContextContainer; diff --git a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx index 7669d8c133ac59b89685485479e091e2be3b5fbb..e207de41f7204c94f6e9d5ce92526dc49d9cddc4 100755 --- a/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/nav-bar/container.jsx @@ -3,7 +3,6 @@ import { Meteor } from 'meteor/meteor'; import { withTracker } from 'meteor/react-meteor-data'; import { Session } from 'meteor/session'; import Meetings from '/imports/api/meetings'; -import Users from '/imports/api/users'; import Auth from '/imports/ui/services/auth'; import getFromUserSettings from '/imports/ui/services/users-settings'; import { ChatContext } from '/imports/ui/components/components-data/chat-context/context'; @@ -35,15 +34,16 @@ const NavBarContainer = ({ children, ...props }) => { const { groupChat: groupChats } = usingGroupChatContext; const hasUnreadMessages = checkUnreadMessages({ groupChatsMessages, groupChats, users }); + const currentUser = users[Auth.userID]; + const amIModerator = currentUser.role === ROLE_MODERATOR; + return ( - <NavBar {...props} hasUnreadMessages={hasUnreadMessages}> + <NavBar {...props} amIModerator={amIModerator} hasUnreadMessages={hasUnreadMessages}> {children} </NavBar> ); } - - export default withTracker(() => { const CLIENT_TITLE = getFromUserSettings('bbb_client_title', PUBLIC_CONFIG.app.clientTitle); @@ -66,15 +66,11 @@ export default withTracker(() => { } const { connectRecordingObserver, processOutsideToggleRecording } = Service; - const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { role: 1 } }); const openPanel = Session.get('openPanel'); const isExpanded = openPanel !== ''; - const amIModerator = currentUser.role === ROLE_MODERATOR; const hasUnreadNotes = NoteService.hasUnreadNotes(); - return { - amIModerator, isExpanded, currentUserId: Auth.userID, processOutsideToggleRecording, diff --git a/bigbluebutton-html5/imports/ui/components/presentation/container.jsx b/bigbluebutton-html5/imports/ui/components/presentation/container.jsx index 3a5d8790783f89f71d35d0e52c1bd81e1841914e..5a0cde5ea8f94a1237892099a2a5146ae5b11614 100755 --- a/bigbluebutton-html5/imports/ui/components/presentation/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/presentation/container.jsx @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import MediaService, { getSwapLayout, shouldEnableSwapLayout } from '/imports/ui/components/media/service'; import { notify } from '/imports/ui/services/notification'; @@ -6,17 +6,30 @@ import PresentationAreaService from './service'; import { Slides } from '/imports/api/slides'; import PresentationArea from './component'; import PresentationToolbarService from './presentation-toolbar/service'; +import { UsersContext } from '../components-data/users-context/context'; import Auth from '/imports/ui/services/auth'; import Meetings from '/imports/api/meetings'; -import Users from '/imports/api/users'; import getFromUserSettings from '/imports/ui/services/users-settings'; import WhiteboardService from '/imports/ui/components/whiteboard/service'; const ROLE_VIEWER = Meteor.settings.public.user.role_viewer; -const PresentationAreaContainer = ({ presentationPodIds, mountPresentationArea, ...props }) => ( - mountPresentationArea && <PresentationArea {...props} /> -); +const PresentationAreaContainer = ({ presentationPodIds, mountPresentationArea, ...props }) => { + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + return mountPresentationArea + && ( + <PresentationArea + { + ...{ + ...props, + isViewer: currentUser.role === ROLE_VIEWER, + } + } + /> + ); +}; const APP_CONFIG = Meteor.settings.public.app; const PRELOAD_NEXT_SLIDE = APP_CONFIG.preloadNextSlides; @@ -26,11 +39,6 @@ export default withTracker(({ podId }) => { const currentSlide = PresentationAreaService.getCurrentSlide(podId); const presentationIsDownloadable = PresentationAreaService.isPresentationDownloadable(podId); const layoutSwapped = getSwapLayout() && shouldEnableSwapLayout(); - const isViewer = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, { - fields: { - role: 1, - }, - }).role === ROLE_VIEWER; let slidePosition; if (currentSlide) { @@ -89,7 +97,6 @@ export default withTracker(({ podId }) => { publishedPoll: 1, }, }).publishedPoll, - isViewer, currentPresentationId: Session.get('currentPresentationId') || null, restoreOnUpdate: getFromUserSettings( 'bbb_force_restore_presentation_on_new_events', diff --git a/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx b/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx index ab6d34f43441cbe8ebf43faaea604bd0fee58940..efbbc1e1820f55bd8f705ce78ff0acaf1749c50d 100644 --- a/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/status-notifier/container.jsx @@ -1,18 +1,30 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import Auth from '/imports/ui/services/auth'; import Users from '/imports/api/users'; import Settings from '/imports/ui/services/settings'; +import { UsersContext } from '/imports/ui/components/components-data/users-context/context'; import { makeCall } from '/imports/ui/services/api'; import StatusNotifier from './component'; const ROLE_VIEWER = Meteor.settings.public.user.role_viewer; -const StatusNotifierContainer = ({ ...props }) => <StatusNotifier {...props} />; +const StatusNotifierContainer = (props) => { + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + const isViewer = currentUser.role === ROLE_VIEWER; + return ( + <StatusNotifier {...{ + ...props, + isViewer, + }} + /> + ); +}; export default withTracker((props) => { const AppSettings = Settings.application; - const currentUser = Users.findOne({ userId: Auth.userID }, { fields: { userId: 1, role: 1 } }); const { status } = props; const emojiUsers = Users.find({ meetingId: Auth.meetingID, emoji: status }, { fields: { @@ -20,11 +32,10 @@ export default withTracker((props) => { }, }) .fetch() - .filter(u => u.emoji === status && u.userId !== currentUser.userId); + .filter(u => u.emoji === status && u.userId !== Auth.userID); const clearUserStatus = userId => makeCall('setEmojiStatus', userId, 'none'); return { - isViewer: currentUser.role === ROLE_VIEWER, clearUserStatus, emojiUsers, status, diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx index b51e10cb1d030c0a31eb767c7ea8896b9d9deba1..9bcf276195d01657380d1d4cc63482f7e6721b28 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/container.jsx @@ -1,29 +1,25 @@ -import React from 'react'; +import React, { useContext } from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import { Session } from 'meteor/session'; import Auth from '/imports/ui/services/auth'; import Storage from '/imports/ui/services/storage/session'; import UserContent from './component'; import GuestUsers from '/imports/api/guest-users/'; -import Users from '/imports/api/users'; +import { UsersContext } from '/imports/ui/components/components-data/users-context/context'; const CLOSED_CHAT_LIST_KEY = 'closedChatList'; -const UserContentContainer = props => <UserContent {...props} />; +const UserContentContainer = (props) => { + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + return (<UserContent {...props} currentUser={currentUser} />); +} export default withTracker(() => ({ pollIsOpen: Session.equals('isPollOpen', true), forcePollOpen: Session.equals('forcePollOpen', true), currentClosedChats: Storage.getItem(CLOSED_CHAT_LIST_KEY) || [], - currentUser: Users.findOne({ userId: Auth.userID }, { - fields: { - userId: 1, - role: 1, - guest: 1, - locked: 1, - presenter: 1, - }, - }), pendingUsers: GuestUsers.find({ meetingId: Auth.meetingID, approved: false, diff --git a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx index 9090376936ff3e58ea762728529e335fd9397e7e..f6814b5a5648543bc4dadd774b2f9a96621535c7 100644 --- a/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/user-list/user-list-content/user-notes/container.jsx @@ -1,28 +1,16 @@ import React from 'react'; import { withTracker } from 'meteor/react-meteor-data'; import NoteService from '/imports/ui/components/note/service'; -import Meetings from '/imports/api/meetings'; -import Users from '/imports/api/users'; -import Auth from '/imports/ui/services/auth'; +import lockContextContainer from '/imports/ui/components/lock-viewers/context/container'; import UserNotes from './component'; -const ROLE_VIEWER = Meteor.settings.public.user.role_viewer; - const UserNotesContainer = props => <UserNotes {...props} />; -export default withTracker(() => { - const Meeting = Meetings.findOne({ meetingId: Auth.meetingID }, - { fields: { 'lockSettingsProps.disableNote': 1 } }); - const isViewer = Users.findOne({ meetingId: Auth.meetingID, userId: Auth.userID }, { - fields: { - role: 1, - }, - }).role === ROLE_VIEWER; - const shouldDisableNote = (Meeting.lockSettingsProps.disableNote) && isViewer; - +export default lockContextContainer(withTracker(({ userLocks }) => { + const shouldDisableNote = userLocks.userNote; return { isPanelOpened: NoteService.isPanelOpened(), revs: NoteService.getRevs(), disableNote: shouldDisableNote, }; -})(UserNotesContainer); +})(UserNotesContainer)); diff --git a/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx b/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx index b9def40f1d2df569f642068a60f5c8a77e561148..9e8db5573db62ec6de20bbe504a23c010b0c26cf 100644 --- a/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx +++ b/bigbluebutton-html5/imports/ui/components/waiting-users/alert/container.jsx @@ -1,21 +1,30 @@ -import React, { PureComponent } from 'react'; +import React, { useContext } from 'react'; import { Session } from 'meteor/session'; import { withTracker } from 'meteor/react-meteor-data'; import Auth from '/imports/ui/services/auth'; import GuestUsers from '/imports/api/guest-users/'; -import Users from '/imports/api/users/'; +import { UsersContext } from '/imports/ui/components/components-data/users-context/context'; import WaitingComponent from './component'; const USER_CONFIG = Meteor.settings.public.user; const ROLE_MODERATOR = USER_CONFIG.role_moderator; -class WaitingContainer extends PureComponent { - render() { - return ( - <WaitingComponent {...this.props} /> - ); - } -} +const WaitingContainer = (props) => { + const usingUsersContext = useContext(UsersContext); + const { users } = usingUsersContext; + const currentUser = users[Auth.userID]; + const currentUserIsModerator = currentUser.role === ROLE_MODERATOR; + const joinTime = currentUser.authTokenValidatedTime; + return ( + <WaitingComponent {...{ + ...props, + currentUserIsModerator, + joinTime, + }} + /> + ); +}; + export default withTracker(() => { const pendingUsers = GuestUsers.find({ @@ -25,12 +34,8 @@ export default withTracker(() => { }).fetch(); const managementPanelIsOpen = Session.get('openPanel') === 'waitingUsersPanel'; - const currentUser = Users.findOne({ userId: Auth.userID }, - { fields: { role: 1, loginTime: 1 } }); return { managementPanelIsOpen, pendingUsers, - currentUserIsModerator: currentUser.role === ROLE_MODERATOR, - joinTime: currentUser.loginTime, }; })(WaitingContainer);