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
};