import React from 'react'; import ReactDOM from 'react-dom'; import PropTypes from 'prop-types'; import Draggable from 'react-draggable'; import {FormattedMessage} from 'react-intl'; import {ContextMenuTrigger} from 'react-contextmenu'; import {BorderedMenuItem, ContextMenu, MenuItem} from '../context-menu/context-menu.jsx'; import Box from '../box/box.jsx'; import DefaultMonitor from './default-monitor.jsx'; import LargeMonitor from './large-monitor.jsx'; import SliderMonitor from '../../containers/slider-monitor.jsx'; import ListMonitor from '../../containers/list-monitor.jsx'; import {Theme} from '../../lib/themes/index.js'; import styles from './monitor.css'; // Map category name to color name used in scratch-blocks Blockly.Colours const categoryColorMap = { data: 'data', sensing: 'sensing', sound: 'sounds', looks: 'looks', motion: 'motion', list: 'data_lists', extension: 'pen' }; const modes = { default: DefaultMonitor, large: LargeMonitor, slider: SliderMonitor, list: ListMonitor }; const getCategoryColor = (theme, category) => { const colors = theme.getStageBlockColors(); return { background: colors[categoryColorMap[category]].primary, text: colors.text }; }; const MonitorComponent = props => ( <> {React.createElement(modes[props.mode], { categoryColor: getCategoryColor(props.theme, props.category), ...props })} {ReactDOM.createPortal(( // Use a portal to render the context menu outside the flow to avoid // positioning conflicts between the monitors `transform: scale` and // the context menus `position: fixed`. For more details, see // http://meyerweb.com/eric/thoughts/2011/09/12/un-fixing-fixed-elements-with-css-transforms/ {props.draggable && props.onSetModeToDefault && } {props.draggable && props.onSetModeToLarge && } {props.draggable && props.onSetModeToSlider && } {props.draggable && props.onSliderPromptOpen && props.mode === 'slider' && } {props.onImport && } {props.onExport && } {props.draggable && props.onHide && } ), document.body)} ); const monitorModes = Object.keys(modes); MonitorComponent.propTypes = { category: PropTypes.oneOf(Object.keys(categoryColorMap)), componentRef: PropTypes.func.isRequired, draggable: PropTypes.bool.isRequired, id: PropTypes.string.isRequired, label: PropTypes.string.isRequired, mode: PropTypes.oneOf(monitorModes), opcode: PropTypes.string.isRequired, onDragEnd: PropTypes.func.isRequired, onExport: PropTypes.func, onImport: PropTypes.func, onHide: PropTypes.func, onNextMode: PropTypes.func.isRequired, onSetModeToDefault: PropTypes.func, onSetModeToLarge: PropTypes.func, onSetModeToSlider: PropTypes.func, onSliderPromptOpen: PropTypes.func, theme: PropTypes.instanceOf(Theme).isRequired }; MonitorComponent.defaultProps = { category: 'extension', mode: 'default' }; export { MonitorComponent as default, monitorModes };