summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src/components/app/map/layers/HoverLayerComponent.js
blob: 08d31dacc922a7e4b7f2a46237783f2c9c662fd1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import PropTypes from 'prop-types'
import React, { useEffect, useState } from 'react'
import { Layer } from 'react-konva'
import HoverTile from '../elements/HoverTile'
import { TILE_SIZE_IN_PIXELS } from '../MapConstants'

function HoverLayerComponent({ mouseX, mouseY, mapPosition, mapScale, isEnabled, isValid, onClick, children }) {
    const [pos, setPos] = useState([-1, -1])
    const [x, y] = pos
    const [valid, setValid] = useState(false)

    useEffect(() => {
        if (!isEnabled()) {
            return
        }

        const positionX = Math.floor((mouseX - mapPosition.x) / (mapScale * TILE_SIZE_IN_PIXELS))
        const positionY = Math.floor((mouseY - mapPosition.y) / (mapScale * TILE_SIZE_IN_PIXELS))

        if (positionX !== x || positionY !== y) {
            setPos([positionX, positionY])
            setValid(isValid(positionX, positionY))
        }
    }, [mouseX, mouseY, mapPosition, mapScale])

    if (!isEnabled()) {
        return <Layer />
    }

    const pixelX = mapScale * x * TILE_SIZE_IN_PIXELS + mapPosition.x
    const pixelY = mapScale * y * TILE_SIZE_IN_PIXELS + mapPosition.y

    return (
        <Layer opacity={0.6}>
            <HoverTile
                pixelX={pixelX}
                pixelY={pixelY}
                scale={mapScale}
                isValid={valid}
                onClick={() => (valid ? onClick(x, y) : undefined)}
            />
            {children
                ? React.cloneElement(children, {
                      pixelX,
                      pixelY,
                      scale: mapScale,
                  })
                : undefined}
        </Layer>
    )
}

HoverLayerComponent.propTypes = {
    mouseX: PropTypes.number.isRequired,
    mouseY: PropTypes.number.isRequired,
    mapPosition: PropTypes.object.isRequired,
    mapScale: PropTypes.number.isRequired,
    isEnabled: PropTypes.func.isRequired,
    isValid: PropTypes.func.isRequired,
    onClick: PropTypes.func.isRequired,
}

export default HoverLayerComponent