bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/waiting-users/component.jsx

243 lines
6.6 KiB
React
Raw Normal View History

import React, { useEffect, useState } from 'react';
import { Session } from 'meteor/session';
import { defineMessages, injectIntl } from 'react-intl';
import injectWbResizeEvent from '/imports/ui/components/presentation/resize-wrapper/component';
import UserAvatar from '/imports/ui/components/user-avatar/component';
import Button from '/imports/ui/components/button/component';
import { styles } from './styles';
const intlMessages = defineMessages({
waitingUsersTitle: {
id: 'app.userList.guest.waitingUsersTitle',
description: 'Title for the notes list',
},
title: {
id: 'app.userList.guest.waitingUsers',
description: 'Label for the waiting users',
},
2019-03-09 10:02:46 +08:00
optionTitle: {
id: 'app.userList.guest.optionTitle',
description: 'Label above the options',
},
allowAllAuthenticated: {
id: 'app.userList.guest.allowAllAuthenticated',
description: 'Title for the waiting users',
},
allowAllGuests: {
id: 'app.userList.guest.allowAllGuests',
description: 'Title for the waiting users',
},
allowEveryone: {
id: 'app.userList.guest.allowEveryone',
description: 'Title for the waiting users',
},
denyEveryone: {
id: 'app.userList.guest.denyEveryone',
description: 'Title for the waiting users',
},
pendingUsers: {
id: 'app.userList.guest.pendingUsers',
description: 'Title for the waiting users',
},
pendingGuestUsers: {
id: 'app.userList.guest.pendingGuestUsers',
description: 'Title for the waiting users',
},
rememberChoice: {
id: 'app.userList.guest.rememberChoice',
description: 'Remember label for checkbox',
},
});
const ALLOW_STATUS = 'ALLOW';
const DENY_STATUS = 'DENY';
2019-03-09 10:02:46 +08:00
const renderGuestUserItem = (name, color, handleAccept, handleDeny, role, sequence, userId) => (
<div key={`userlist-item-${userId}`} className={styles.listItem}>
<div key={`user-content-container-${userId}`} className={styles.userContentContainer}>
<div key={`user-avatar-container-${userId}`} className={styles.userAvatar}>
<UserAvatar
2019-03-09 10:02:46 +08:00
key={`user-avatar-${userId}`}
moderator={role === 'MODERATOR'}
color={color}
>
{name.slice(0, 2).toUpperCase()}
</UserAvatar>
</div>
2019-03-09 10:02:46 +08:00
<p key={`user-name-${userId}`} className={styles.userName}>
[
{sequence}
]
{name}
</p>
</div>
2019-03-09 10:02:46 +08:00
<div key={`userlist-btns-${userId}`} className={styles.buttonContainer}>
<Button
2019-03-09 10:02:46 +08:00
key={`userbtn-accept-${userId}`}
className={styles.button}
color="primary"
size="lg"
ghost
label="Accept"
onClick={handleAccept}
/>
|
<Button
2019-03-09 10:02:46 +08:00
key={`userbtn-deny-${userId}`}
className={styles.button}
color="primary"
size="lg"
ghost
label="Deny"
onClick={handleDeny}
/>
</div>
</div>
);
const renderPendingUsers = (message, usersArray, action) => {
if (!usersArray.length) return null;
return (
<div>
<p className={styles.mainTitle}>{message}</p>
{usersArray.map((user, idx) => renderGuestUserItem(
user.name,
user.color,
() => action([user], ALLOW_STATUS),
() => action([user], DENY_STATUS),
user.role,
idx + 1,
2019-03-09 10:02:46 +08:00
user.intId,
))}
</div>
);
};
const WaitingUsers = (props) => {
2019-04-04 04:21:48 +08:00
const [rememberChoice, setRememberChoice] = useState(false);
useEffect(() => {
const {
authenticatedUsers,
guestUsers,
} = props;
if (!authenticatedUsers.length && !guestUsers.length) Session.set('openPanel', 'userlist');
});
const {
intl,
authenticatedUsers,
guestUsers,
guestUsersCall,
changeGuestPolicy,
} = props;
const onCheckBoxChange = (e) => {
const { checked } = e.target;
2019-04-04 04:21:48 +08:00
setRememberChoice(checked);
};
const changePolicy = (shouldExecutePolicy, policyRule, cb) => () => {
if (shouldExecutePolicy) {
changeGuestPolicy(policyRule);
}
return cb();
};
const renderButton = (message, { key, policy, action }) => (
<Button
key={key}
color="primary"
label={message}
size="lg"
2019-04-04 04:21:48 +08:00
onClick={changePolicy(rememberChoice, policy, action)}
className={styles.customBtn}
/>
);
const buttonsData = [
{
messageId: intlMessages.allowAllAuthenticated,
action: () => guestUsersCall(authenticatedUsers, ALLOW_STATUS),
2019-03-09 10:02:46 +08:00
key: 'allow-all-auth',
policy: 'ALWAYS_ACCEPT_AUTH',
},
{
messageId: intlMessages.allowAllGuests,
action: () => guestUsersCall(
2019-04-04 04:21:48 +08:00
[...guestUsers].concat(rememberChoice ? authenticatedUsers : []),
ALLOW_STATUS,
),
2019-03-09 10:02:46 +08:00
key: 'allow-all-guest',
policy: 'ALWAYS_ACCEPT',
},
{
messageId: intlMessages.allowEveryone,
action: () => guestUsersCall([...guestUsers, ...authenticatedUsers], ALLOW_STATUS),
2019-03-09 10:02:46 +08:00
key: 'allow-everyone',
policy: 'ALWAYS_ACCEPT',
},
{
messageId: intlMessages.denyEveryone,
action: () => guestUsersCall([...guestUsers, ...authenticatedUsers], DENY_STATUS),
2019-03-09 10:02:46 +08:00
key: 'deny-everyone',
policy: 'ALWAYS_DENY',
},
];
return (
<div
data-test="note"
className={styles.panel}
>
<header className={styles.header}>
<div
data-test="noteTitle"
className={styles.title}
>
<Button
onClick={() => {
Session.set('openPanel', 'userlist');
}}
label={intl.formatMessage(intlMessages.title)}
icon="left_arrow"
className={styles.hideBtn}
/>
</div>
</header>
<main>
<div>
2019-03-09 10:02:46 +08:00
<p className={styles.mainTitle}>{intl.formatMessage(intlMessages.optionTitle)}</p>
{
2019-03-09 10:02:46 +08:00
buttonsData.map(buttonData => renderButton(
intl.formatMessage(buttonData.messageId),
buttonData,
))
}
</div>
<div>
2019-04-04 04:21:48 +08:00
<label htmlFor="remiderUsersId" className={styles.rememberContainer}>
<input id="remiderUsersId" type="checkbox" onChange={onCheckBoxChange} />
<p>{intl.formatMessage(intlMessages.rememberChoice)}</p>
</label>
</div>
{renderPendingUsers(
intl.formatMessage(intlMessages.pendingUsers,
{ 0: authenticatedUsers.length }),
authenticatedUsers,
guestUsersCall,
)}
{renderPendingUsers(
intl.formatMessage(intlMessages.pendingGuestUsers,
{ 0: guestUsers.length }),
guestUsers,
guestUsersCall,
)}
</main>
</div>
);
};
export default injectWbResizeEvent(injectIntl(WaitingUsers));