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 styles from './monitor.css'; const categories = { data: '#FF8C1A', sensing: '#5CB1D6', sound: '#CF63CF', looks: '#9966FF', motion: '#4C97FF', list: '#FC662C', control: '#FFAB19', extension: '#0FBD8C' }; const modes = { default: DefaultMonitor, large: LargeMonitor, slider: SliderMonitor, list: ListMonitor }; const MonitorComponent = props => ( {React.createElement(modes[props.mode], { categoryColor: categories[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)} ); MonitorComponent.categories = categories; const monitorModes = Object.keys(modes); MonitorComponent.propTypes = { category: PropTypes.oneOf(Object.keys(categories)), 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 }; MonitorComponent.defaultProps = { category: 'extension', mode: 'default' }; export { MonitorComponent as default, monitorModes };