mirror of
https://gitcode.com/GitHub_Trending/ji/jitsi-meet.git
synced 2025-12-30 11:22:31 +00:00
Convert some files to TS Remove unnecessary files Implement redesign Add noise suppression to picker menu Fix Popover placement on browser resize
188 lines
4.3 KiB
TypeScript
188 lines
4.3 KiB
TypeScript
import React, { ReactNode } from 'react';
|
|
import { useSelector } from 'react-redux';
|
|
import { makeStyles } from 'tss-react/mui';
|
|
|
|
import { showOverflowDrawer } from '../../../../toolbox/functions.web';
|
|
import Icon from '../../../icons/components/Icon';
|
|
import { withPixelLineHeight } from '../../../styles/functions.web';
|
|
|
|
export interface IProps {
|
|
|
|
/**
|
|
* Label used for accessibility.
|
|
*/
|
|
accessibilityLabel: string;
|
|
|
|
/**
|
|
* Component children.
|
|
*/
|
|
children?: ReactNode;
|
|
|
|
/**
|
|
* CSS class name used for custom styles.
|
|
*/
|
|
className?: string;
|
|
|
|
/**
|
|
* Custom icon. If used, the icon prop is ignored.
|
|
* Used to allow custom children instead of just the default icons.
|
|
*/
|
|
customIcon?: ReactNode;
|
|
|
|
/**
|
|
* Whether or not the action is disabled.
|
|
*/
|
|
disabled?: boolean;
|
|
|
|
/**
|
|
* Default icon for action.
|
|
*/
|
|
icon?: Function;
|
|
|
|
/**
|
|
* Id of the action container.
|
|
*/
|
|
id?: string;
|
|
|
|
/**
|
|
* Click handler.
|
|
*/
|
|
onClick?: (e?: React.MouseEvent) => void;
|
|
|
|
/**
|
|
* Keydown handler.
|
|
*/
|
|
onKeyDown?: (e?: React.KeyboardEvent) => void;
|
|
|
|
/**
|
|
* Keypress handler.
|
|
*/
|
|
onKeyPress?: (e?: React.KeyboardEvent) => void;
|
|
|
|
/**
|
|
* Whether the item is marked as selected.
|
|
*/
|
|
selected?: boolean;
|
|
|
|
/**
|
|
* TestId of the element, if any.
|
|
*/
|
|
testId?: string;
|
|
|
|
/**
|
|
* Action text.
|
|
*/
|
|
text?: string;
|
|
|
|
/**
|
|
* Class name for the text.
|
|
*/
|
|
textClassName?: string;
|
|
}
|
|
|
|
const useStyles = makeStyles()(theme => {
|
|
return {
|
|
contextMenuItem: {
|
|
alignItems: 'center',
|
|
cursor: 'pointer',
|
|
display: 'flex',
|
|
minHeight: '40px',
|
|
padding: '10px 16px',
|
|
boxSizing: 'border-box',
|
|
|
|
'& > *:not(:last-child)': {
|
|
marginRight: theme.spacing(3)
|
|
},
|
|
|
|
'&:hover': {
|
|
backgroundColor: theme.palette.ui02
|
|
},
|
|
|
|
'&:active': {
|
|
backgroundColor: theme.palette.ui03
|
|
},
|
|
|
|
'&:focus': {
|
|
boxShadow: `inset 0 0 0 2px ${theme.palette.action01Hover}`
|
|
}
|
|
},
|
|
|
|
selected: {
|
|
borderLeft: `3px solid ${theme.palette.action01Hover}`,
|
|
paddingLeft: '13px',
|
|
backgroundColor: theme.palette.ui02
|
|
},
|
|
|
|
contextMenuItemDisabled: {
|
|
pointerEvents: 'none'
|
|
},
|
|
|
|
contextMenuItemDrawer: {
|
|
padding: '13px 16px'
|
|
},
|
|
|
|
contextMenuItemIcon: {
|
|
'& svg': {
|
|
fill: theme.palette.icon01
|
|
}
|
|
},
|
|
|
|
text: {
|
|
...withPixelLineHeight(theme.typography.bodyShortRegular),
|
|
color: theme.palette.text01
|
|
},
|
|
|
|
drawerText: {
|
|
...withPixelLineHeight(theme.typography.bodyShortRegularLarge)
|
|
}
|
|
};
|
|
});
|
|
|
|
const ContextMenuItem = ({
|
|
accessibilityLabel,
|
|
children,
|
|
className,
|
|
customIcon,
|
|
disabled,
|
|
id,
|
|
icon,
|
|
onClick,
|
|
onKeyDown,
|
|
onKeyPress,
|
|
selected,
|
|
testId,
|
|
text,
|
|
textClassName }: IProps) => {
|
|
const { classes: styles, cx } = useStyles();
|
|
const _overflowDrawer: boolean = useSelector(showOverflowDrawer);
|
|
|
|
return (
|
|
<div
|
|
aria-disabled = { disabled }
|
|
aria-label = { accessibilityLabel }
|
|
className = { cx(styles.contextMenuItem,
|
|
_overflowDrawer && styles.contextMenuItemDrawer,
|
|
disabled && styles.contextMenuItemDisabled,
|
|
selected && styles.selected,
|
|
className
|
|
) }
|
|
data-testid = { testId }
|
|
id = { id }
|
|
key = { text }
|
|
onClick = { disabled ? undefined : onClick }
|
|
onKeyDown = { disabled ? undefined : onKeyDown }
|
|
onKeyPress = { disabled ? undefined : onKeyPress }
|
|
role = 'menuitem'>
|
|
{customIcon ? customIcon
|
|
: icon && <Icon
|
|
className = { styles.contextMenuItemIcon }
|
|
size = { 20 }
|
|
src = { icon } />}
|
|
{text && <span className = { cx(styles.text, textClassName) }>{text}</span>}
|
|
{children}
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default ContextMenuItem;
|