bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/menu/component.jsx
2021-08-13 22:20:49 -03:00

161 lines
4.6 KiB
JavaScript

import React from "react";
import PropTypes from "prop-types";
import { defineMessages, injectIntl } from "react-intl";
import Menu from "@material-ui/core/Menu";
import MenuItem from "@material-ui/core/MenuItem";
import { Divider } from "@material-ui/core";
import Icon from "/imports/ui/components/icon/component";
import Button from "/imports/ui/components/button/component";
import { styles } from "./styles";
const intlMessages = defineMessages({
close: {
id: 'app.dropdown.close',
description: 'Close button label',
},
});
//Used to switch to mobile view
const MAX_WIDTH = 640;
class BBBMenu extends React.Component {
constructor(props) {
super(props);
this.state = {
anchorEl: null,
};
this.setAnchorEl = this.setAnchorEl.bind(this);
this.handleClick = this.handleClick.bind(this);
this.handleClose = this.handleClose.bind(this);
}
handleClick(event) {
this.setState({ anchorEl: event.currentTarget });
};
handleClose() {
const { onCloseCallback } = this.props;
this.setState({ anchorEl: null }, onCloseCallback());
};
setAnchorEl(el) {
console.log(el)
debugger
this.setState({ anchorEl: el });
};
makeMenuItems() {
const { actions, selectedEmoji } = this.props;
return actions?.map(a => {
const { dataTest, label, onClick, key, disabled } = a;
const itemClasses = [styles.menuitem, a?.className];
if (key?.toLowerCase()?.includes(selectedEmoji?.toLowerCase())) itemClasses.push(styles.emojiSelected);
return [
a.dividerTop && <Divider disabled />,
<MenuItem
key={label}
data-test={dataTest}
className={itemClasses.join(' ')}
disableRipple={true}
disableGutters={true}
disabled={disabled}
style={{ paddingLeft: '4px',paddingRight: '4px',paddingTop: '8px', paddingBottom: '8px', marginLeft: '4px', marginRight: '4px' }}
onClick={() => {
onClick();
const close = !key.includes('setstatus') && !key.includes('back');
// prevent menu close for sub menu actions
if (close) this.handleClose();
}}>
<div style={{ display: 'flex', flexFlow: 'row', width: '100%'}}>
{a.icon ? <Icon iconName={a.icon} key="icon" /> : null}
<div className={styles.option}>{label}</div>
{a.iconRight ? <Icon iconName={a.iconRight} key="iconRight" className={styles.iRight} /> : null}
</div>
</MenuItem>,
a.divider && <Divider disabled />
];
});
}
render() {
const { anchorEl } = this.state;
const { trigger, intl, opts, wide, classes } = this.props;
const actionsItems = this.makeMenuItems();
const menuClasses = classes || [];
menuClasses.push(styles.menu);
if (wide) menuClasses.push(styles.wide);
return (
<div>
<div onClick={this.handleClick} accessKey={this.props?.accessKey}>{trigger}</div>
<Menu
{...opts}
anchorEl={anchorEl}
open={Boolean(anchorEl)}
onClose={this.handleClose}
className={menuClasses.join(' ')}
>
{actionsItems}
{anchorEl && window.innerWidth < MAX_WIDTH &&
<Button
className={styles.closeBtn}
label={intl.formatMessage(intlMessages.close)}
size="lg"
color="default"
onClick={this.handleClose}
/>
}
</Menu>
</div>
);
}
}
export default injectIntl(BBBMenu);
BBBMenu.defaultProps = {
opts: {
id: "default-dropdown-menu",
keepMounted: true,
transitionDuration: 0,
elevation: 3,
getContentAnchorEl: null,
fullwidth: "true",
anchorOrigin: { vertical: 'top', horizontal: 'right' },
transformorigin: { vertical: 'top', horizontal: 'right' },
},
onCloseCallback: () => {},
wide: false,
};
BBBMenu.propTypes = {
intl: PropTypes.shape({
formatMessage: PropTypes.func.isRequired,
}).isRequired,
trigger: PropTypes.element.isRequired,
actions: PropTypes.arrayOf(PropTypes.shape({
key: PropTypes.string.isRequired,
label: PropTypes.string.isRequired,
onClick: PropTypes.func.isRequired,
icon: PropTypes.string,
iconRight: PropTypes.string,
disabled: PropTypes.bool,
divider: PropTypes.bool,
dividerTop: PropTypes.bool,
accessKey: PropTypes.string,
})).isRequired,
onCloseCallback: PropTypes.func,
wide: PropTypes.bool,
};