-
Notifications
You must be signed in to change notification settings - Fork 433
/
Copy pathMarker.js
111 lines (98 loc) · 2.43 KB
/
Marker.js
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
import React, { useContext, useState, forwardRef } from "react"
import PropTypes from "prop-types"
import { MapContext } from "./MapProvider"
const Marker = forwardRef(
(
{
coordinates,
children,
onMouseEnter,
onMouseLeave,
onMouseDown,
onMouseUp,
onFocus,
onBlur,
style = {},
className = "",
...restProps
},
ref
) => {
const { projection } = useContext(MapContext)
const [isPressed, setPressed] = useState(false)
const [isFocused, setFocus] = useState(false)
const [x, y] = projection(coordinates) ?? [null, null]
function handleMouseEnter(evt) {
setFocus(true)
if (onMouseEnter) onMouseEnter(evt)
}
function handleMouseLeave(evt) {
setFocus(false)
if (isPressed) setPressed(false)
if (onMouseLeave) onMouseLeave(evt)
}
function handleFocus(evt) {
setFocus(true)
if (onFocus) onFocus(evt)
}
function handleBlur(evt) {
setFocus(false)
if (isPressed) setPressed(false)
if (onBlur) onBlur(evt)
}
function handleMouseDown(evt) {
setPressed(true)
if (onMouseDown) onMouseDown(evt)
}
function handleMouseUp(evt) {
setPressed(false)
if (onMouseUp) onMouseUp(evt)
}
return (
<>
{x && y &&
<g
ref={ref}
transform={`translate(${x}, ${y})`}
className={`rsm-marker ${className}`}
onMouseEnter={handleMouseEnter}
onMouseLeave={handleMouseLeave}
onFocus={handleFocus}
onBlur={handleBlur}
onMouseDown={handleMouseDown}
onMouseUp={handleMouseUp}
style={
style[
isPressed || isFocused
? isPressed
? "pressed"
: "hover"
: "default"
]
}
{...restProps}
>
{children}
</g>
}
</>
)
}
)
Marker.displayName = "Marker"
Marker.propTypes = {
coordinates: PropTypes.array,
children: PropTypes.oneOfType([
PropTypes.node,
PropTypes.arrayOf(PropTypes.node),
]),
onMouseEnter: PropTypes.func,
onMouseLeave: PropTypes.func,
onMouseDown: PropTypes.func,
onMouseUp: PropTypes.func,
onFocus: PropTypes.func,
onBlur: PropTypes.func,
style: PropTypes.object,
className: PropTypes.string,
}
export default Marker