import PropTypes from 'prop-types' import React from 'react' import { Layer } from 'react-konva' import HoverTile from '../elements/HoverTile' import { TILE_SIZE_IN_PIXELS } from '../MapConstants' class HoverLayerComponent extends React.Component { static propTypes = { mouseX: PropTypes.number.isRequired, mouseY: PropTypes.number.isRequired, mapPosition: PropTypes.object.isRequired, mapScale: PropTypes.number.isRequired, isEnabled: PropTypes.func.isRequired, onClick: PropTypes.func.isRequired, } state = { positionX: -1, positionY: -1, validity: false, } componentDidUpdate() { if (!this.props.isEnabled()) { return } const positionX = Math.floor( (this.props.mouseX - this.props.mapPosition.x) / (this.props.mapScale * TILE_SIZE_IN_PIXELS), ) const positionY = Math.floor( (this.props.mouseY - this.props.mapPosition.y) / (this.props.mapScale * TILE_SIZE_IN_PIXELS), ) if ( positionX !== this.state.positionX || positionY !== this.state.positionY ) { this.setState({ positionX, positionY, validity: this.props.isValid(positionX, positionY), }) } } render() { if (!this.props.isEnabled()) { return } const pixelX = this.props.mapScale * this.state.positionX * TILE_SIZE_IN_PIXELS + this.props.mapPosition.x const pixelY = this.props.mapScale * this.state.positionY * TILE_SIZE_IN_PIXELS + this.props.mapPosition.y return ( this.state.validity ? this.props.onClick(this.state.positionX, this.state.positionY) : undefined} /> {this.props.children ? React.cloneElement(this.props.children, { pixelX, pixelY, scale: this.props.mapScale, }) : undefined} ) } } export default HoverLayerComponent