@rio-cloud/rio-uikit 2.3.0-beta.2 → 2.3.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Marker.js +9 -5
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.d.ts +38 -3
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js +104 -109
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisBanner.js.map +1 -1
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.d.ts +24 -5
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js +60 -56
- package/components/analyticsAnalysisOverlay/AnalyticsAnalysisOverlay.js.map +1 -1
- package/components/datepicker/DayPicker.js +72 -70
- package/components/datepicker/DayPicker.js.map +1 -1
- package/components/datepicker/DayPickerDropdown.d.ts +1 -0
- package/components/datepicker/DayPickerDropdown.js +61 -48
- package/components/datepicker/DayPickerDropdown.js.map +1 -1
- package/components/datepicker/useStackedDayPickerCalendars.js +26 -26
- package/components/datepicker/useStackedDayPickerCalendars.js.map +1 -1
- package/components/listMenu/ListMenu.d.ts +8 -0
- package/components/listMenu/ListMenu.js +74 -66
- package/components/listMenu/ListMenu.js.map +1 -1
- package/components/map/components/Map.js +189 -157
- package/components/map/components/Map.js.map +1 -1
- package/components/map/components/MapContext.d.ts +1 -0
- package/components/map/components/MapContext.js +8 -7
- package/components/map/components/MapContext.js.map +1 -1
- package/components/map/components/features/Route.d.ts +65 -1
- package/components/map/components/features/Route.js +184 -98
- package/components/map/components/features/Route.js.map +1 -1
- package/components/map/components/features/basics/Marker.d.ts +21 -1
- package/components/map/components/features/basics/Marker.js +99 -40
- package/components/map/components/features/basics/Marker.js.map +1 -1
- package/components/map/components/features/basics/Polygon.d.ts +24 -1
- package/components/map/components/features/basics/Polygon.js +72 -19
- package/components/map/components/features/basics/Polygon.js.map +1 -1
- package/components/map/components/features/basics/Polyline.d.ts +29 -0
- package/components/map/components/features/basics/Polyline.js +69 -39
- package/components/map/components/features/basics/Polyline.js.map +1 -1
- package/components/map/components/features/layers/MarkerLayer.js +8 -8
- package/components/map/components/features/layers/MarkerLayer.js.map +1 -1
- package/components/map/components/features/layers/clustering/SimpleClusterLayer.js +13 -6
- package/components/map/components/features/layers/clustering/SimpleClusterLayer.js.map +1 -1
- package/components/map/utils/clustering.d.ts +1 -1
- package/components/map/utils/clustering.js +30 -30
- package/components/map/utils/clustering.js.map +1 -1
- package/components/map/utils/mapTypes.d.ts +135 -0
- package/components/map/utils/mapTypes.js.map +1 -1
- package/components/mapMarker/ClusterMapMarker.d.ts +2 -0
- package/components/mapMarker/ClusterMapMarker.js.map +1 -1
- package/components/mapMarker/SingleMapMarker.d.ts +2 -0
- package/components/mapMarker/SingleMapMarker.js.map +1 -1
- package/components/selects/ClearButton.js +9 -7
- package/components/selects/ClearButton.js.map +1 -1
- package/components/table/Table.js +208 -205
- package/components/table/Table.js.map +1 -1
- package/components/table/Table.types.d.ts +13 -4
- package/components/table/TableColumn.d.ts +8 -1
- package/components/table/TableColumn.js +66 -64
- package/components/table/TableColumn.js.map +1 -1
- package/components/table/TableExpandedRow.js +11 -11
- package/components/table/TableExpandedRow.js.map +1 -1
- package/components/table/TableHeader.d.ts +17 -0
- package/components/table/TableHeader.js +89 -76
- package/components/table/TableHeader.js.map +1 -1
- package/components/table/TableHeaderColumn.d.ts +11 -1
- package/components/table/TableHeaderColumn.js +63 -58
- package/components/table/TableHeaderColumn.js.map +1 -1
- package/components/table/TableRow.d.ts +6 -0
- package/components/table/TableRow.js +49 -48
- package/components/table/TableRow.js.map +1 -1
- package/components/table/context/TableLayoutContext.d.ts +1 -0
- package/components/table/context/TableLayoutContext.js.map +1 -1
- package/components/table/layout/useHorizontalSectionSync.d.ts +2 -1
- package/components/table/layout/useHorizontalSectionSync.js +32 -31
- package/components/table/layout/useHorizontalSectionSync.js.map +1 -1
- package/components/table/layout/useTableLayout.d.ts +2 -1
- package/components/table/layout/useTableLayout.js +37 -30
- package/components/table/layout/useTableLayout.js.map +1 -1
- package/components/table/render/header/TableDraggableHeaderCell.js +38 -36
- package/components/table/render/header/TableDraggableHeaderCell.js.map +1 -1
- package/components/table/render/header/TableHeader.types.d.ts +2 -0
- package/components/table/render/header/TableHeaderCellContent.js +16 -16
- package/components/table/render/header/TableHeaderCellContent.js.map +1 -1
- package/components/table/render/header/TableStaticHeaderCell.js +31 -29
- package/components/table/render/header/TableStaticHeaderCell.js.map +1 -1
- package/components/table/render/header/resolveHeaderCellClassName.d.ts +1 -0
- package/components/table/render/header/resolveHeaderCellClassName.js +10 -9
- package/components/table/render/header/resolveHeaderCellClassName.js.map +1 -1
- package/components/table/runtime/useResolvedRenderColumns.d.ts +4 -4
- package/components/table/runtime/useResolvedRenderColumns.js +13 -13
- package/components/table/runtime/useResolvedRenderColumns.js.map +1 -1
- package/components/table/runtime/useResolvedRenderHeader.d.ts +1 -1
- package/components/table/runtime/useResolvedRenderHeader.js.map +1 -1
- package/hooks/useDraggableElement.d.ts +27 -5
- package/hooks/useDraggableElement.js +100 -23
- package/hooks/useDraggableElement.js.map +1 -1
- package/hooks/usePopperDropdown.d.ts +1 -0
- package/hooks/usePopperDropdown.js +15 -12
- package/hooks/usePopperDropdown.js.map +1 -1
- package/package.json +1 -1
- package/utils/analytics/createAnalyticsOverlayTooltip.js.map +1 -1
- package/utils/init/initConfig.js +5 -5
- package/utils/init/initConfig.js.map +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.js.map +1 -1
|
@@ -1,121 +1,207 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import { jsxs as K, jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as v, useMemo as p, useEffect as P } from "react";
|
|
3
|
+
import { isArray as V, isEmpty as x } from "es-toolkit/compat";
|
|
4
|
+
import N from "./basics/Polyline.js";
|
|
5
|
+
import b from "./basics/Marker.js";
|
|
6
|
+
import U from "../../exceptions/MapException.js";
|
|
7
|
+
import { EventUtils as s } from "../../utils/eventHandling.js";
|
|
8
|
+
import { useMapContext as X } from "../MapContext.js";
|
|
9
|
+
const J = "Route requires a minimum of 1 positions", q = "If isBorderIncludedInWidth is set to true than width has to be greater than twice of borderWidth", Y = "rgba(48, 194, 255, 1)", z = "rgba(48, 194, 255, 0.5)", Q = "rgb(200, 243, 247)", Z = "rgba(22, 100, 141, 1)", $ = "rgba(255, 255, 255, 0)", Ee = "#e22837", ue = "#ff8e3c", Re = "#5cb85c", ye = "rgba(255, 255, 255, 1)", _e = "rgba(167, 83, 25, 1)", j = 10, B = 5, ee = 2, M = {
|
|
10
|
+
width: B,
|
|
11
|
+
color: Y,
|
|
12
|
+
borderWidth: ee,
|
|
13
|
+
borderColor: Z,
|
|
12
14
|
isBorderIncludedInWidth: !1
|
|
13
|
-
},
|
|
14
|
-
...
|
|
15
|
+
}, te = {
|
|
16
|
+
...M,
|
|
15
17
|
color: Q
|
|
16
|
-
},
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
u(t), T(d, i, E);
|
|
33
|
-
}, []), O(() => {
|
|
34
|
-
u(t);
|
|
35
|
-
}, [t]), O(() => {
|
|
36
|
-
T(d, i, E);
|
|
37
|
-
}, [d, i, E]);
|
|
38
|
-
const u = (o) => {
|
|
39
|
-
if (j(o))
|
|
40
|
-
throw new g(X);
|
|
41
|
-
const e = new H.geo.LineString();
|
|
42
|
-
if (o.map((r) => e.pushLatLngAlt(r.lat, r.lng, 0)), o.length === 1) {
|
|
43
|
-
const [r] = o;
|
|
44
|
-
e.pushLatLngAlt(r.lat, r.lng, 0);
|
|
45
|
-
}
|
|
46
|
-
N(e);
|
|
47
|
-
}, T = (o, e, r) => {
|
|
48
|
-
const v = {
|
|
49
|
-
...r ? $ : b,
|
|
50
|
-
...o
|
|
18
|
+
}, re = (a) => {
|
|
19
|
+
if (x(a))
|
|
20
|
+
throw new U(J);
|
|
21
|
+
const l = new H.geo.LineString();
|
|
22
|
+
if (a.forEach((o) => {
|
|
23
|
+
l.pushLatLngAlt(o.lat, o.lng, 0);
|
|
24
|
+
}), a.length === 1) {
|
|
25
|
+
const [o] = a;
|
|
26
|
+
l.pushLatLngAlt(o.lat, o.lng, 0);
|
|
27
|
+
}
|
|
28
|
+
return l;
|
|
29
|
+
}, oe = (a) => {
|
|
30
|
+
const { style: l, hoverStyle: o, isReduced: d, isRouteAlternative: h, showHitArea: f } = a, n = (m) => {
|
|
31
|
+
const I = {
|
|
32
|
+
...h ? te : M,
|
|
33
|
+
...m
|
|
51
34
|
}, {
|
|
52
|
-
color:
|
|
53
|
-
width:
|
|
54
|
-
borderColor:
|
|
55
|
-
borderWidth:
|
|
56
|
-
isBorderIncludedInWidth:
|
|
57
|
-
lineDash:
|
|
58
|
-
} =
|
|
59
|
-
if (
|
|
60
|
-
throw new
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
35
|
+
color: T,
|
|
36
|
+
width: c = B,
|
|
37
|
+
borderColor: _,
|
|
38
|
+
borderWidth: r = 0,
|
|
39
|
+
isBorderIncludedInWidth: O,
|
|
40
|
+
lineDash: i
|
|
41
|
+
} = I;
|
|
42
|
+
if (O && r >= c)
|
|
43
|
+
throw new U(q);
|
|
44
|
+
return {
|
|
45
|
+
borderWidth: d ? 0 : r,
|
|
46
|
+
routeStyle: new H.map.SpatialStyle({
|
|
47
|
+
strokeColor: d ? z : T,
|
|
48
|
+
lineWidth: d ? r + c : c,
|
|
65
49
|
lineCap: "round",
|
|
66
50
|
lineJoin: "bevel",
|
|
67
|
-
...
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
lineWidth: l + s,
|
|
51
|
+
...i && { lineDash: i }
|
|
52
|
+
}),
|
|
53
|
+
borderStyle: new H.map.SpatialStyle({
|
|
54
|
+
strokeColor: d ? $ : _,
|
|
55
|
+
lineWidth: r + c,
|
|
73
56
|
lineCap: "round",
|
|
74
57
|
lineJoin: "bevel",
|
|
75
|
-
...
|
|
58
|
+
...i && { lineDash: i }
|
|
59
|
+
}),
|
|
60
|
+
hitAreaStyle: new H.map.SpatialStyle({
|
|
61
|
+
strokeColor: f ? "rgba(255, 0, 0, 0.35)" : "rgba(255, 255, 255, 0.001)",
|
|
62
|
+
lineWidth: r + c + j,
|
|
63
|
+
lineCap: "round",
|
|
64
|
+
lineJoin: "round"
|
|
76
65
|
})
|
|
66
|
+
};
|
|
67
|
+
}, R = n(l), y = o ? n({ ...l, ...o }) : R;
|
|
68
|
+
return {
|
|
69
|
+
...R,
|
|
70
|
+
hoverRouteStyle: y.routeStyle,
|
|
71
|
+
hoverBorderStyle: y.borderStyle
|
|
72
|
+
};
|
|
73
|
+
}, Oe = (a) => {
|
|
74
|
+
const {
|
|
75
|
+
style: l,
|
|
76
|
+
hoverStyle: o,
|
|
77
|
+
showHitArea: d = !1,
|
|
78
|
+
isReduced: h = !1,
|
|
79
|
+
isRouteAlternative: f = !1,
|
|
80
|
+
positions: n,
|
|
81
|
+
startIcon: R,
|
|
82
|
+
middleIcon: y,
|
|
83
|
+
endIcon: m,
|
|
84
|
+
arrowStyle: I = {},
|
|
85
|
+
hasArrows: T = !0,
|
|
86
|
+
markers: c = [],
|
|
87
|
+
customData: _,
|
|
88
|
+
eventListenerMap: r,
|
|
89
|
+
cursor: O
|
|
90
|
+
} = a, { api: i } = X(), D = v(), L = v(), S = v(!1), E = p(() => {
|
|
91
|
+
if (O)
|
|
92
|
+
return O;
|
|
93
|
+
if (r?.[s.TAP] || r?.[s.DBL_TAP] || r?.[s.CONTEXTMENU])
|
|
94
|
+
return "pointer";
|
|
95
|
+
}, [O, r]), C = p(() => re(n), [n]), t = p(
|
|
96
|
+
() => oe({
|
|
97
|
+
style: l,
|
|
98
|
+
hoverStyle: o,
|
|
99
|
+
isReduced: h,
|
|
100
|
+
isRouteAlternative: f,
|
|
101
|
+
showHitArea: d
|
|
102
|
+
}),
|
|
103
|
+
[l, o, h, f, d]
|
|
104
|
+
), W = (e) => {
|
|
105
|
+
if (!i.map)
|
|
106
|
+
return;
|
|
107
|
+
const G = i.map.getElement(), k = i.map.getViewPort().element;
|
|
108
|
+
G.style.cursor = e, k.style.cursor = e;
|
|
109
|
+
}, A = (e) => {
|
|
110
|
+
D.current?.line.setStyle(e ? t.hoverRouteStyle : t.routeStyle), L.current && L.current.line.setStyle(
|
|
111
|
+
e ? t.hoverBorderStyle : t.borderStyle
|
|
77
112
|
);
|
|
113
|
+
}, F = () => {
|
|
114
|
+
S.current = !0, A(!0), E && W(E);
|
|
115
|
+
}, g = () => {
|
|
116
|
+
S.current = !1, A(!1), E && W("");
|
|
78
117
|
};
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
118
|
+
P(() => {
|
|
119
|
+
A(S.current);
|
|
120
|
+
}, [
|
|
121
|
+
t.routeStyle,
|
|
122
|
+
t.borderStyle,
|
|
123
|
+
t.hoverRouteStyle,
|
|
124
|
+
t.hoverBorderStyle
|
|
125
|
+
]), P(
|
|
126
|
+
() => () => {
|
|
127
|
+
S.current = !1, g();
|
|
128
|
+
},
|
|
129
|
+
[i.map, E]
|
|
130
|
+
);
|
|
131
|
+
const w = p(() => {
|
|
132
|
+
if (r || o || E)
|
|
133
|
+
return {
|
|
134
|
+
...r,
|
|
135
|
+
[s.POINTER_ENTER]: (...e) => {
|
|
136
|
+
F(), r?.[s.POINTER_ENTER]?.(...e);
|
|
137
|
+
},
|
|
138
|
+
[s.POINTER_LEAVE]: (...e) => {
|
|
139
|
+
g(), r?.[s.POINTER_LEAVE]?.(...e);
|
|
140
|
+
},
|
|
141
|
+
[s.POINTER_CANCEL]: (...e) => {
|
|
142
|
+
g(), r?.[s.POINTER_CANCEL]?.(...e);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}, [r, o, E, t]);
|
|
146
|
+
return /* @__PURE__ */ K("div", { children: [
|
|
147
|
+
t.borderWidth > 0 && /* @__PURE__ */ u(
|
|
148
|
+
N,
|
|
149
|
+
{
|
|
150
|
+
geometry: C,
|
|
151
|
+
style: t.borderStyle,
|
|
152
|
+
customData: _,
|
|
153
|
+
onReady: (e) => {
|
|
154
|
+
L.current = e, e && e.line.setStyle(
|
|
155
|
+
S.current ? t.hoverBorderStyle : t.borderStyle
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
),
|
|
160
|
+
/* @__PURE__ */ u(
|
|
161
|
+
N,
|
|
82
162
|
{
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
163
|
+
hasArrows: T,
|
|
164
|
+
arrowStyle: I,
|
|
165
|
+
geometry: C,
|
|
166
|
+
style: t.routeStyle,
|
|
167
|
+
customData: _,
|
|
168
|
+
onReady: (e) => {
|
|
169
|
+
D.current = e, e && e.line.setStyle(
|
|
170
|
+
S.current ? t.hoverRouteStyle : t.routeStyle
|
|
171
|
+
);
|
|
172
|
+
}
|
|
87
173
|
}
|
|
88
174
|
),
|
|
89
|
-
|
|
90
|
-
|
|
175
|
+
w && // Keep interaction on a single invisible polyline so hover/cursor/click stay stable
|
|
176
|
+
// even though the visible route may consist of multiple rendered polylines.
|
|
177
|
+
/* @__PURE__ */ u(
|
|
178
|
+
N,
|
|
91
179
|
{
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
style: U,
|
|
97
|
-
customData: h
|
|
180
|
+
eventListenerMap: w,
|
|
181
|
+
geometry: C,
|
|
182
|
+
style: t.hitAreaStyle,
|
|
183
|
+
customData: _
|
|
98
184
|
}
|
|
99
185
|
),
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
] })
|
|
186
|
+
R && /* @__PURE__ */ u(b, { position: n[0], icon: R }, "startIcon"),
|
|
187
|
+
y && /* @__PURE__ */ u(b, { position: n[Math.floor(n.length / 2)], icon: y }, "middleIcon"),
|
|
188
|
+
m && /* @__PURE__ */ u(b, { position: n[n.length - 1], icon: m }, "endIcon"),
|
|
189
|
+
V(c) && c.map((e) => e)
|
|
190
|
+
] });
|
|
105
191
|
};
|
|
106
192
|
export {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
193
|
+
_e as ARROW_COLOR_WARNING,
|
|
194
|
+
Z as DEFAULT_BORDER_STROKE_COLOR,
|
|
195
|
+
$ as DEFAULT_BORDER_STROKE_COLOR_REDUCED,
|
|
196
|
+
Y as DEFAULT_LINE_STROKE_COLOR,
|
|
111
197
|
Q as DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE,
|
|
112
198
|
z as DEFAULT_LINE_STROKE_COLOR_REDUCED,
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
199
|
+
J as MISSING_POSITIONS_EXCEPTION_MSG,
|
|
200
|
+
Ee as ROUTE_COLOR_DANGER,
|
|
201
|
+
Re as ROUTE_COLOR_SUCCESS,
|
|
202
|
+
ue as ROUTE_COLOR_WARNING,
|
|
203
|
+
ye as ROUTE_COLOR_WHITE,
|
|
118
204
|
q as TO_LESS_LINE_WIDTH_EXCEPTION_MSG,
|
|
119
|
-
|
|
205
|
+
Oe as default
|
|
120
206
|
};
|
|
121
207
|
//# sourceMappingURL=Route.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Route.js","sources":["../../../../../src/components/map/components/features/Route.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { isArray, isEmpty } from 'es-toolkit/compat';\n\nimport Polyline, { type ArrowStyle } from './basics/Polyline';\nimport Marker from './basics/Marker';\nimport MapException from '../../exceptions/MapException';\nimport type { Position } from '../../utils/mapTypes';\nimport type { EventListenerMap } from '../../utils/eventHandling';\n\nexport const MISSING_POSITIONS_EXCEPTION_MSG = 'Route requires a minimum of 1 positions';\n\nexport const TO_LESS_LINE_WIDTH_EXCEPTION_MSG =\n 'If isBorderIncludedInWidth is set to true than width has to be greater than twice of borderWidth';\n\nexport const DEFAULT_LINE_STROKE_COLOR = 'rgba(48, 194, 255, 1)';\nexport const DEFAULT_LINE_STROKE_COLOR_REDUCED = 'rgba(48, 194, 255, 0.5)';\nexport const DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE = 'rgb(200, 243, 247)';\n\nexport const DEFAULT_BORDER_STROKE_COLOR = 'rgba(22, 100, 141, 1)';\nexport const DEFAULT_BORDER_STROKE_COLOR_REDUCED = 'rgba(255, 255, 255, 0)';\n\n// Both works, rgb or hex - keep in mind that these state colors may change\n// so use this constants instead of actual color values in the service\nexport const ROUTE_COLOR_DANGER = '#e22837';\nexport const ROUTE_COLOR_WARNING = '#ff8e3c';\nexport const ROUTE_COLOR_SUCCESS = '#5cb85c';\nexport const ROUTE_COLOR_WHITE = 'rgba(255, 255, 255, 1)';\n\nexport const ARROW_COLOR_WARNING = 'rgba(167, 83, 25, 1)';\n\nexport type RouteStyle = {\n width?: number;\n color?: string;\n borderWidth?: number;\n borderColor?: string;\n isBorderIncludedInWidth?: boolean;\n lineDash?: number[];\n};\n\nexport type RouteProps = {\n arrowStyle?: ArrowStyle;\n hasArrows?: boolean;\n positions: Position[];\n style?: RouteStyle;\n eventListenerMap?: EventListenerMap;\n isReduced?: boolean;\n isRouteAlternative?: boolean;\n startIcon?: JSX.Element;\n middleIcon?: JSX.Element;\n endIcon?: JSX.Element;\n markers?: JSX.Element[];\n customData?: object;\n};\n\nconst DEFAULT_WIDTH = 5;\nconst DEFAULT_BORDER_WIDTH = 2;\n\nconst defaultStyle: RouteStyle = {\n width: DEFAULT_WIDTH,\n color: DEFAULT_LINE_STROKE_COLOR,\n borderWidth: DEFAULT_BORDER_WIDTH,\n borderColor: DEFAULT_BORDER_STROKE_COLOR,\n isBorderIncludedInWidth: false,\n};\n\nconst alternativeRouteStyle = {\n ...defaultStyle,\n color: DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE,\n};\n\nconst Route = (props: RouteProps) => {\n const {\n style,\n isReduced = false,\n isRouteAlternative = false,\n positions,\n startIcon,\n middleIcon,\n endIcon,\n arrowStyle = {},\n hasArrows = true,\n markers = [],\n customData,\n eventListenerMap,\n } = props;\n\n const [lineString, setLineString] = useState<H.geo.LineString>();\n const [routeStyle, setRouteStyle] = useState<H.map.SpatialStyle>();\n const [borderStyle, setBorderStyle] = useState<H.map.SpatialStyle>();\n const [borderWidth, setBorderWidth] = useState<number>(DEFAULT_BORDER_WIDTH);\n\n useEffect(() => {\n updateGeometry(positions);\n updateStyle(style, isReduced, isRouteAlternative);\n }, []);\n\n useEffect(() => {\n updateGeometry(positions);\n }, [positions]);\n\n useEffect(() => {\n updateStyle(style, isReduced, isRouteAlternative);\n }, [style, isReduced, isRouteAlternative]);\n\n const updateGeometry = (pos: Position[]) => {\n if (isEmpty(pos)) {\n throw new MapException(MISSING_POSITIONS_EXCEPTION_MSG);\n }\n\n /* keep reference to shared geometry to prevent recalculation if other values than points change */\n const lineStringData = new H.geo.LineString();\n pos.map((singlePos: Position) => lineStringData.pushLatLngAlt(singlePos.lat, singlePos.lng, 0));\n\n if (pos.length === 1) {\n const [position] = pos;\n lineStringData.pushLatLngAlt(position.lat, position.lng, 0);\n }\n\n setLineString(lineStringData);\n };\n\n const updateStyle = (\n updatedStyle: RouteStyle | undefined,\n isReducedStyle: boolean,\n isRouteAlternativeStyle: boolean\n ) => {\n const mergedStyle = {\n ...(isRouteAlternativeStyle ? alternativeRouteStyle : defaultStyle),\n ...updatedStyle,\n };\n\n const {\n color,\n width = DEFAULT_WIDTH,\n borderColor,\n borderWidth: mergedBorderWidth = 0,\n isBorderIncludedInWidth,\n lineDash,\n } = mergedStyle;\n\n setBorderWidth(isReducedStyle ? 0 : mergedBorderWidth);\n\n if (isBorderIncludedInWidth && mergedBorderWidth >= width) {\n throw new MapException(TO_LESS_LINE_WIDTH_EXCEPTION_MSG);\n }\n\n setRouteStyle(\n new H.map.SpatialStyle({\n strokeColor: isReducedStyle ? DEFAULT_LINE_STROKE_COLOR_REDUCED : color,\n lineWidth: isReducedStyle ? mergedBorderWidth + width : width,\n lineCap: 'round',\n lineJoin: 'bevel',\n ...(lineDash && { lineDash }),\n })\n );\n\n setBorderStyle(\n new H.map.SpatialStyle({\n strokeColor: isReduced ? DEFAULT_BORDER_STROKE_COLOR_REDUCED : borderColor,\n lineWidth: mergedBorderWidth + width,\n lineCap: 'round',\n lineJoin: 'bevel',\n ...(lineDash && { lineDash }),\n })\n );\n };\n\n if (!lineString) {\n return null;\n }\n\n return (\n <div>\n {borderWidth > 0 && (\n <Polyline\n eventListenerMap={eventListenerMap}\n geometry={lineString}\n style={borderStyle}\n customData={customData}\n />\n )}\n <Polyline\n hasArrows={hasArrows}\n arrowStyle={arrowStyle}\n eventListenerMap={eventListenerMap}\n geometry={lineString}\n style={routeStyle}\n customData={customData}\n />\n {startIcon && <Marker key='startIcon' position={positions[0]} icon={startIcon} />}\n {middleIcon && (\n <Marker key='middleIcon' position={positions[Math.floor(positions.length / 2)]} icon={middleIcon} />\n )}\n {endIcon && <Marker key='endIcon' position={positions[positions.length - 1]} icon={endIcon} />}\n {isArray(markers) && markers.map(marker => marker)}\n </div>\n );\n};\n\nexport default Route;\n"],"names":["MISSING_POSITIONS_EXCEPTION_MSG","TO_LESS_LINE_WIDTH_EXCEPTION_MSG","DEFAULT_LINE_STROKE_COLOR","DEFAULT_LINE_STROKE_COLOR_REDUCED","DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE","DEFAULT_BORDER_STROKE_COLOR","DEFAULT_BORDER_STROKE_COLOR_REDUCED","ROUTE_COLOR_DANGER","ROUTE_COLOR_WARNING","ROUTE_COLOR_SUCCESS","ROUTE_COLOR_WHITE","ARROW_COLOR_WARNING","DEFAULT_WIDTH","DEFAULT_BORDER_WIDTH","defaultStyle","alternativeRouteStyle","Route","props","style","isReduced","isRouteAlternative","positions","startIcon","middleIcon","endIcon","arrowStyle","hasArrows","markers","customData","eventListenerMap","lineString","setLineString","useState","routeStyle","setRouteStyle","borderStyle","setBorderStyle","borderWidth","setBorderWidth","useEffect","updateGeometry","updateStyle","pos","isEmpty","MapException","lineStringData","singlePos","position","updatedStyle","isReducedStyle","isRouteAlternativeStyle","mergedStyle","color","width","borderColor","mergedBorderWidth","isBorderIncludedInWidth","lineDash","jsx","Polyline","Marker","isArray","marker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Route.js","sources":["../../../../../src/components/map/components/features/Route.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, type CSSProperties } from 'react';\nimport { isArray, isEmpty } from 'es-toolkit/compat';\n\nimport Polyline, { type ArrowStyle, type PolylineObjects } from './basics/Polyline';\nimport Marker from './basics/Marker';\nimport MapException from '../../exceptions/MapException';\nimport type { Position } from '../../utils/mapTypes';\nimport { EventUtils, type EventListenerMap } from '../../utils/eventHandling';\nimport { useMapContext } from '../MapContext';\n\nexport const MISSING_POSITIONS_EXCEPTION_MSG = 'Route requires a minimum of 1 positions';\n\nexport const TO_LESS_LINE_WIDTH_EXCEPTION_MSG =\n 'If isBorderIncludedInWidth is set to true than width has to be greater than twice of borderWidth';\n\nexport const DEFAULT_LINE_STROKE_COLOR = 'rgba(48, 194, 255, 1)';\nexport const DEFAULT_LINE_STROKE_COLOR_REDUCED = 'rgba(48, 194, 255, 0.5)';\nexport const DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE = 'rgb(200, 243, 247)';\n\nexport const DEFAULT_BORDER_STROKE_COLOR = 'rgba(22, 100, 141, 1)';\nexport const DEFAULT_BORDER_STROKE_COLOR_REDUCED = 'rgba(255, 255, 255, 0)';\n\n// Both works, rgb or hex - keep in mind that these state colors may change\n// so use this constants instead of actual color values in the service\nexport const ROUTE_COLOR_DANGER = '#e22837';\nexport const ROUTE_COLOR_WARNING = '#ff8e3c';\nexport const ROUTE_COLOR_SUCCESS = '#5cb85c';\nexport const ROUTE_COLOR_WHITE = 'rgba(255, 255, 255, 1)';\n\nexport const ARROW_COLOR_WARNING = 'rgba(167, 83, 25, 1)';\nconst HIT_POLYLINE_EXTRA_WIDTH = 10;\n\nexport type RouteStyle = {\n width?: number;\n color?: string;\n borderWidth?: number;\n borderColor?: string;\n isBorderIncludedInWidth?: boolean;\n lineDash?: number[];\n};\n\nexport type RouteProps = {\n /**\n * Defines the arrow appearance when arrows are rendered on the route.\n *\n * @default {}\n */\n arrowStyle?: ArrowStyle;\n\n /**\n * Controls whether directional arrows are rendered on the route line.\n *\n * @default true\n */\n hasArrows?: boolean;\n\n /**\n * Ordered geographic positions that define the route geometry.\n */\n positions: Position[];\n\n /**\n * Overrides the default route styling for line and border.\n *\n * @default { width: 5, color: 'rgba(48, 194, 255, 1)', borderWidth: 2, borderColor: 'rgba(22, 100, 141, 1)', isBorderIncludedInWidth: false }\n */\n style?: RouteStyle;\n\n /**\n * Style overrides applied while the route is hovered via its hit area.\n */\n hoverStyle?: RouteStyle;\n\n /**\n * Shows the internal hit area polyline in red for debugging.\n *\n * @default false\n */\n showHitArea?: boolean;\n\n /**\n * Event handlers attached to the interactive route hit area.\n */\n eventListenerMap?: EventListenerMap;\n\n /**\n * Renders the route in its reduced visual style.\n *\n * @default false\n */\n isReduced?: boolean;\n\n /**\n * Applies the alternative route base styling.\n *\n * @default false\n */\n isRouteAlternative?: boolean;\n\n /**\n * Icon rendered at the first route position.\n */\n startIcon?: JSX.Element;\n\n /**\n * Icon rendered at the middle route position.\n */\n middleIcon?: JSX.Element;\n\n /**\n * Icon rendered at the last route position.\n */\n endIcon?: JSX.Element;\n\n /**\n * Additional markers rendered alongside the route.\n *\n * @default []\n */\n markers?: JSX.Element[];\n\n /**\n * Custom payload forwarded to the rendered route polylines and their events.\n */\n customData?: object;\n\n /**\n * Cursor shown while hovering the interactive route hit area.\n * If omitted, clickable routes automatically use `pointer`.\n */\n cursor?: CSSProperties['cursor'];\n};\n\nconst DEFAULT_WIDTH = 5;\nconst DEFAULT_BORDER_WIDTH = 2;\n\nconst defaultStyle: RouteStyle = {\n width: DEFAULT_WIDTH,\n color: DEFAULT_LINE_STROKE_COLOR,\n borderWidth: DEFAULT_BORDER_WIDTH,\n borderColor: DEFAULT_BORDER_STROKE_COLOR,\n isBorderIncludedInWidth: false,\n};\n\nconst alternativeRouteStyle = {\n ...defaultStyle,\n color: DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE,\n};\n\nconst createLineString = (positions: Position[]) => {\n if (isEmpty(positions)) {\n throw new MapException(MISSING_POSITIONS_EXCEPTION_MSG);\n }\n\n const lineString = new H.geo.LineString();\n\n positions.forEach(position => {\n lineString.pushLatLngAlt(position.lat, position.lng, 0);\n });\n\n if (positions.length === 1) {\n const [position] = positions;\n lineString.pushLatLngAlt(position.lat, position.lng, 0);\n }\n\n return lineString;\n};\n\nconst createResolvedRouteStyles = (options: {\n style?: RouteStyle;\n hoverStyle?: RouteStyle;\n isReduced: boolean;\n isRouteAlternative: boolean;\n showHitArea: boolean;\n}) => {\n const { style, hoverStyle, isReduced, isRouteAlternative, showHitArea } = options;\n\n const createStyleSet = (updatedStyle?: RouteStyle) => {\n const mergedStyle = {\n ...(isRouteAlternative ? alternativeRouteStyle : defaultStyle),\n ...updatedStyle,\n };\n\n const {\n color,\n width = DEFAULT_WIDTH,\n borderColor,\n borderWidth: mergedBorderWidth = 0,\n isBorderIncludedInWidth,\n lineDash,\n } = mergedStyle;\n\n if (isBorderIncludedInWidth && mergedBorderWidth >= width) {\n throw new MapException(TO_LESS_LINE_WIDTH_EXCEPTION_MSG);\n }\n\n return {\n borderWidth: isReduced ? 0 : mergedBorderWidth,\n routeStyle: new H.map.SpatialStyle({\n strokeColor: isReduced ? DEFAULT_LINE_STROKE_COLOR_REDUCED : color,\n lineWidth: isReduced ? mergedBorderWidth + width : width,\n lineCap: 'round',\n lineJoin: 'bevel',\n ...(lineDash && { lineDash }),\n }),\n borderStyle: new H.map.SpatialStyle({\n strokeColor: isReduced ? DEFAULT_BORDER_STROKE_COLOR_REDUCED : borderColor,\n lineWidth: mergedBorderWidth + width,\n lineCap: 'round',\n lineJoin: 'bevel',\n ...(lineDash && { lineDash }),\n }),\n hitAreaStyle: new H.map.SpatialStyle({\n strokeColor: showHitArea ? 'rgba(255, 0, 0, 0.35)' : 'rgba(255, 255, 255, 0.001)',\n lineWidth: mergedBorderWidth + width + HIT_POLYLINE_EXTRA_WIDTH,\n lineCap: 'round',\n lineJoin: 'round',\n }),\n };\n };\n\n const baseStyleSet = createStyleSet(style);\n const hoverStyleSet = hoverStyle ? createStyleSet({ ...style, ...hoverStyle }) : baseStyleSet;\n\n return {\n ...baseStyleSet,\n hoverRouteStyle: hoverStyleSet.routeStyle,\n hoverBorderStyle: hoverStyleSet.borderStyle,\n };\n};\n\nconst Route = (props: RouteProps) => {\n const {\n style,\n hoverStyle,\n showHitArea = false,\n isReduced = false,\n isRouteAlternative = false,\n positions,\n startIcon,\n middleIcon,\n endIcon,\n arrowStyle = {},\n hasArrows = true,\n markers = [],\n customData,\n eventListenerMap,\n cursor,\n } = props;\n\n const { api } = useMapContext();\n const routePolylineRef = useRef<PolylineObjects>();\n const borderPolylineRef = useRef<PolylineObjects>();\n const isHoveredRef = useRef(false);\n\n const resolvedCursor = useMemo(() => {\n if (cursor) {\n return cursor;\n }\n\n if (\n eventListenerMap?.[EventUtils.TAP] ||\n eventListenerMap?.[EventUtils.DBL_TAP] ||\n eventListenerMap?.[EventUtils.CONTEXTMENU]\n ) {\n return 'pointer';\n }\n }, [cursor, eventListenerMap]);\n\n const lineString = useMemo(() => createLineString(positions), [positions]);\n const resolvedStyles = useMemo(\n () =>\n createResolvedRouteStyles({\n style,\n hoverStyle,\n isReduced,\n isRouteAlternative,\n showHitArea,\n }),\n [style, hoverStyle, isReduced, isRouteAlternative, showHitArea]\n );\n\n const applyCursor = (nextCursor: string) => {\n if (!api.map) {\n return;\n }\n\n const mapElement = api.map.getElement() as HTMLElement;\n const viewportElement = api.map.getViewPort().element as HTMLElement;\n\n mapElement.style.cursor = nextCursor;\n viewportElement.style.cursor = nextCursor;\n };\n\n const applyVisibleStyles = (hovered: boolean) => {\n routePolylineRef.current?.line.setStyle(hovered ? resolvedStyles.hoverRouteStyle : resolvedStyles.routeStyle);\n\n if (borderPolylineRef.current) {\n borderPolylineRef.current.line.setStyle(\n hovered ? resolvedStyles.hoverBorderStyle : resolvedStyles.borderStyle\n );\n }\n };\n\n const activateInteractionState = () => {\n isHoveredRef.current = true;\n applyVisibleStyles(true);\n\n if (resolvedCursor) {\n applyCursor(resolvedCursor);\n }\n };\n\n const clearInteractionState = () => {\n isHoveredRef.current = false;\n applyVisibleStyles(false);\n\n if (resolvedCursor) {\n applyCursor('');\n }\n };\n\n useEffect(() => {\n applyVisibleStyles(isHoveredRef.current);\n }, [\n resolvedStyles.routeStyle,\n resolvedStyles.borderStyle,\n resolvedStyles.hoverRouteStyle,\n resolvedStyles.hoverBorderStyle,\n ]);\n\n useEffect(\n () => () => {\n isHoveredRef.current = false;\n clearInteractionState();\n },\n [api.map, resolvedCursor]\n );\n\n const resolvedEventListenerMap = useMemo(() => {\n if (!(eventListenerMap || hoverStyle || resolvedCursor)) {\n return;\n }\n\n return {\n ...eventListenerMap,\n [EventUtils.POINTER_ENTER]: (...args: unknown[]) => {\n activateInteractionState();\n\n eventListenerMap?.[EventUtils.POINTER_ENTER]?.(...args);\n },\n [EventUtils.POINTER_LEAVE]: (...args: unknown[]) => {\n clearInteractionState();\n\n eventListenerMap?.[EventUtils.POINTER_LEAVE]?.(...args);\n },\n [EventUtils.POINTER_CANCEL]: (...args: unknown[]) => {\n clearInteractionState();\n\n eventListenerMap?.[EventUtils.POINTER_CANCEL]?.(...args);\n },\n } satisfies EventListenerMap;\n }, [eventListenerMap, hoverStyle, resolvedCursor, resolvedStyles]);\n\n return (\n <div>\n {resolvedStyles.borderWidth > 0 && (\n <Polyline\n geometry={lineString}\n style={resolvedStyles.borderStyle}\n customData={customData}\n onReady={objects => {\n borderPolylineRef.current = objects;\n\n if (objects) {\n objects.line.setStyle(\n isHoveredRef.current ? resolvedStyles.hoverBorderStyle : resolvedStyles.borderStyle\n );\n }\n }}\n />\n )}\n <Polyline\n hasArrows={hasArrows}\n arrowStyle={arrowStyle}\n geometry={lineString}\n style={resolvedStyles.routeStyle}\n customData={customData}\n onReady={objects => {\n routePolylineRef.current = objects;\n\n if (objects) {\n objects.line.setStyle(\n isHoveredRef.current ? resolvedStyles.hoverRouteStyle : resolvedStyles.routeStyle\n );\n }\n }}\n />\n {resolvedEventListenerMap && (\n // Keep interaction on a single invisible polyline so hover/cursor/click stay stable\n // even though the visible route may consist of multiple rendered polylines.\n <Polyline\n eventListenerMap={resolvedEventListenerMap}\n geometry={lineString}\n style={resolvedStyles.hitAreaStyle}\n customData={customData}\n />\n )}\n {startIcon && <Marker key='startIcon' position={positions[0]} icon={startIcon} />}\n {middleIcon && (\n <Marker key='middleIcon' position={positions[Math.floor(positions.length / 2)]} icon={middleIcon} />\n )}\n {endIcon && <Marker key='endIcon' position={positions[positions.length - 1]} icon={endIcon} />}\n {isArray(markers) && markers.map(marker => marker)}\n </div>\n );\n};\n\nexport default Route;\n"],"names":["MISSING_POSITIONS_EXCEPTION_MSG","TO_LESS_LINE_WIDTH_EXCEPTION_MSG","DEFAULT_LINE_STROKE_COLOR","DEFAULT_LINE_STROKE_COLOR_REDUCED","DEFAULT_LINE_STROKE_COLOR_ALTERNATIVE","DEFAULT_BORDER_STROKE_COLOR","DEFAULT_BORDER_STROKE_COLOR_REDUCED","ROUTE_COLOR_DANGER","ROUTE_COLOR_WARNING","ROUTE_COLOR_SUCCESS","ROUTE_COLOR_WHITE","ARROW_COLOR_WARNING","HIT_POLYLINE_EXTRA_WIDTH","DEFAULT_WIDTH","DEFAULT_BORDER_WIDTH","defaultStyle","alternativeRouteStyle","createLineString","positions","isEmpty","MapException","lineString","position","createResolvedRouteStyles","options","style","hoverStyle","isReduced","isRouteAlternative","showHitArea","createStyleSet","updatedStyle","mergedStyle","color","width","borderColor","mergedBorderWidth","isBorderIncludedInWidth","lineDash","baseStyleSet","hoverStyleSet","Route","props","startIcon","middleIcon","endIcon","arrowStyle","hasArrows","markers","customData","eventListenerMap","cursor","api","useMapContext","routePolylineRef","useRef","borderPolylineRef","isHoveredRef","resolvedCursor","useMemo","EventUtils","resolvedStyles","applyCursor","nextCursor","mapElement","viewportElement","applyVisibleStyles","hovered","activateInteractionState","clearInteractionState","useEffect","resolvedEventListenerMap","args","jsx","Polyline","objects","Marker","isArray","marker"],"mappings":";;;;;;;;AAUO,MAAMA,IAAkC,2CAElCC,IACT,oGAESC,IAA4B,yBAC5BC,IAAoC,2BACpCC,IAAwC,sBAExCC,IAA8B,yBAC9BC,IAAsC,0BAItCC,KAAqB,WACrBC,KAAsB,WACtBC,KAAsB,WACtBC,KAAoB,0BAEpBC,KAAsB,wBAC7BC,IAA2B,IAuG3BC,IAAgB,GAChBC,KAAuB,GAEvBC,IAA2B;AAAA,EAC7B,OAAOF;AAAA,EACP,OAAOX;AAAA,EACP,aAAaY;AAAA,EACb,aAAaT;AAAA,EACb,yBAAyB;AAC7B,GAEMW,KAAwB;AAAA,EAC1B,GAAGD;AAAA,EACH,OAAOX;AACX,GAEMa,KAAmB,CAACC,MAA0B;AAChD,MAAIC,EAAQD,CAAS;AACjB,UAAM,IAAIE,EAAapB,CAA+B;AAG1D,QAAMqB,IAAa,IAAI,EAAE,IAAI,WAAA;AAM7B,MAJAH,EAAU,QAAQ,CAAAI,MAAY;AAC1B,IAAAD,EAAW,cAAcC,EAAS,KAAKA,EAAS,KAAK,CAAC;AAAA,EAC1D,CAAC,GAEGJ,EAAU,WAAW,GAAG;AACxB,UAAM,CAACI,CAAQ,IAAIJ;AACnB,IAAAG,EAAW,cAAcC,EAAS,KAAKA,EAAS,KAAK,CAAC;AAAA,EAC1D;AAEA,SAAOD;AACX,GAEME,KAA4B,CAACC,MAM7B;AACF,QAAM,EAAE,OAAAC,GAAO,YAAAC,GAAY,WAAAC,GAAW,oBAAAC,GAAoB,aAAAC,MAAgBL,GAEpEM,IAAiB,CAACC,MAA8B;AAClD,UAAMC,IAAc;AAAA,MAChB,GAAIJ,IAAqBZ,KAAwBD;AAAA,MACjD,GAAGgB;AAAA,IAAA,GAGD;AAAA,MACF,OAAAE;AAAA,MACA,OAAAC,IAAQrB;AAAA,MACR,aAAAsB;AAAA,MACA,aAAaC,IAAoB;AAAA,MACjC,yBAAAC;AAAA,MACA,UAAAC;AAAA,IAAA,IACAN;AAEJ,QAAIK,KAA2BD,KAAqBF;AAChD,YAAM,IAAId,EAAanB,CAAgC;AAG3D,WAAO;AAAA,MACH,aAAa0B,IAAY,IAAIS;AAAA,MAC7B,YAAY,IAAI,EAAE,IAAI,aAAa;AAAA,QAC/B,aAAaT,IAAYxB,IAAoC8B;AAAA,QAC7D,WAAWN,IAAYS,IAAoBF,IAAQA;AAAA,QACnD,SAAS;AAAA,QACT,UAAU;AAAA,QACV,GAAII,KAAY,EAAE,UAAAA,EAAA;AAAA,MAAS,CAC9B;AAAA,MACD,aAAa,IAAI,EAAE,IAAI,aAAa;AAAA,QAChC,aAAaX,IAAYrB,IAAsC6B;AAAA,QAC/D,WAAWC,IAAoBF;AAAA,QAC/B,SAAS;AAAA,QACT,UAAU;AAAA,QACV,GAAII,KAAY,EAAE,UAAAA,EAAA;AAAA,MAAS,CAC9B;AAAA,MACD,cAAc,IAAI,EAAE,IAAI,aAAa;AAAA,QACjC,aAAaT,IAAc,0BAA0B;AAAA,QACrD,WAAWO,IAAoBF,IAAQtB;AAAA,QACvC,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACb;AAAA,IAAA;AAAA,EAET,GAEM2B,IAAeT,EAAeL,CAAK,GACnCe,IAAgBd,IAAaI,EAAe,EAAE,GAAGL,GAAO,GAAGC,EAAA,CAAY,IAAIa;AAEjF,SAAO;AAAA,IACH,GAAGA;AAAA,IACH,iBAAiBC,EAAc;AAAA,IAC/B,kBAAkBA,EAAc;AAAA,EAAA;AAExC,GAEMC,KAAQ,CAACC,MAAsB;AACjC,QAAM;AAAA,IACF,OAAAjB;AAAA,IACA,YAAAC;AAAA,IACA,aAAAG,IAAc;AAAA,IACd,WAAAF,IAAY;AAAA,IACZ,oBAAAC,IAAqB;AAAA,IACrB,WAAAV;AAAA,IACA,WAAAyB;AAAA,IACA,YAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC,IAAa,CAAA;AAAA,IACb,WAAAC,IAAY;AAAA,IACZ,SAAAC,IAAU,CAAA;AAAA,IACV,YAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,QAAAC;AAAA,EAAA,IACAT,GAEE,EAAE,KAAAU,EAAA,IAAQC,EAAA,GACVC,IAAmBC,EAAA,GACnBC,IAAoBD,EAAA,GACpBE,IAAeF,EAAO,EAAK,GAE3BG,IAAiBC,EAAQ,MAAM;AACjC,QAAIR;AACA,aAAOA;AAGX,QACID,IAAmBU,EAAW,GAAG,KACjCV,IAAmBU,EAAW,OAAO,KACrCV,IAAmBU,EAAW,WAAW;AAEzC,aAAO;AAAA,EAEf,GAAG,CAACT,GAAQD,CAAgB,CAAC,GAEvB7B,IAAasC,EAAQ,MAAM1C,GAAiBC,CAAS,GAAG,CAACA,CAAS,CAAC,GACnE2C,IAAiBF;AAAA,IACnB,MACIpC,GAA0B;AAAA,MACtB,OAAAE;AAAA,MACA,YAAAC;AAAA,MACA,WAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,aAAAC;AAAA,IAAA,CACH;AAAA,IACL,CAACJ,GAAOC,GAAYC,GAAWC,GAAoBC,CAAW;AAAA,EAAA,GAG5DiC,IAAc,CAACC,MAAuB;AACxC,QAAI,CAACX,EAAI;AACL;AAGJ,UAAMY,IAAaZ,EAAI,IAAI,WAAA,GACrBa,IAAkBb,EAAI,IAAI,YAAA,EAAc;AAE9C,IAAAY,EAAW,MAAM,SAASD,GAC1BE,EAAgB,MAAM,SAASF;AAAA,EACnC,GAEMG,IAAqB,CAACC,MAAqB;AAC7C,IAAAb,EAAiB,SAAS,KAAK,SAASa,IAAUN,EAAe,kBAAkBA,EAAe,UAAU,GAExGL,EAAkB,WAClBA,EAAkB,QAAQ,KAAK;AAAA,MAC3BW,IAAUN,EAAe,mBAAmBA,EAAe;AAAA,IAAA;AAAA,EAGvE,GAEMO,IAA2B,MAAM;AACnC,IAAAX,EAAa,UAAU,IACvBS,EAAmB,EAAI,GAEnBR,KACAI,EAAYJ,CAAc;AAAA,EAElC,GAEMW,IAAwB,MAAM;AAChC,IAAAZ,EAAa,UAAU,IACvBS,EAAmB,EAAK,GAEpBR,KACAI,EAAY,EAAE;AAAA,EAEtB;AAEA,EAAAQ,EAAU,MAAM;AACZ,IAAAJ,EAAmBT,EAAa,OAAO;AAAA,EAC3C,GAAG;AAAA,IACCI,EAAe;AAAA,IACfA,EAAe;AAAA,IACfA,EAAe;AAAA,IACfA,EAAe;AAAA,EAAA,CAClB,GAEDS;AAAA,IACI,MAAM,MAAM;AACR,MAAAb,EAAa,UAAU,IACvBY,EAAA;AAAA,IACJ;AAAA,IACA,CAACjB,EAAI,KAAKM,CAAc;AAAA,EAAA;AAG5B,QAAMa,IAA2BZ,EAAQ,MAAM;AAC3C,QAAMT,KAAoBxB,KAAcgC;AAIxC,aAAO;AAAA,QACH,GAAGR;AAAA,QACH,CAACU,EAAW,aAAa,GAAG,IAAIY,MAAoB;AAChD,UAAAJ,EAAA,GAEAlB,IAAmBU,EAAW,aAAa,IAAI,GAAGY,CAAI;AAAA,QAC1D;AAAA,QACA,CAACZ,EAAW,aAAa,GAAG,IAAIY,MAAoB;AAChD,UAAAH,EAAA,GAEAnB,IAAmBU,EAAW,aAAa,IAAI,GAAGY,CAAI;AAAA,QAC1D;AAAA,QACA,CAACZ,EAAW,cAAc,GAAG,IAAIY,MAAoB;AACjD,UAAAH,EAAA,GAEAnB,IAAmBU,EAAW,cAAc,IAAI,GAAGY,CAAI;AAAA,QAC3D;AAAA,MAAA;AAAA,EAER,GAAG,CAACtB,GAAkBxB,GAAYgC,GAAgBG,CAAc,CAAC;AAEjE,2BACK,OAAA,EACI,UAAA;AAAA,IAAAA,EAAe,cAAc,KAC1B,gBAAAY;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,UAAUrD;AAAA,QACV,OAAOwC,EAAe;AAAA,QACtB,YAAAZ;AAAA,QACA,SAAS,CAAA0B,MAAW;AAChB,UAAAnB,EAAkB,UAAUmB,GAExBA,KACAA,EAAQ,KAAK;AAAA,YACTlB,EAAa,UAAUI,EAAe,mBAAmBA,EAAe;AAAA,UAAA;AAAA,QAGpF;AAAA,MAAA;AAAA,IAAA;AAAA,IAGR,gBAAAY;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,WAAA3B;AAAA,QACA,YAAAD;AAAA,QACA,UAAUzB;AAAA,QACV,OAAOwC,EAAe;AAAA,QACtB,YAAAZ;AAAA,QACA,SAAS,CAAA0B,MAAW;AAChB,UAAArB,EAAiB,UAAUqB,GAEvBA,KACAA,EAAQ,KAAK;AAAA,YACTlB,EAAa,UAAUI,EAAe,kBAAkBA,EAAe;AAAA,UAAA;AAAA,QAGnF;AAAA,MAAA;AAAA,IAAA;AAAA,IAEHU;AAAA;AAAA,IAGG,gBAAAE;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,kBAAkBH;AAAA,QAClB,UAAUlD;AAAA,QACV,OAAOwC,EAAe;AAAA,QACtB,YAAAZ;AAAA,MAAA;AAAA,IAAA;AAAA,IAGPN,uBAAciC,GAAA,EAAuB,UAAU1D,EAAU,CAAC,GAAG,MAAMyB,EAAA,GAA1C,WAAqD;AAAA,IAC9EC,KACG,gBAAA6B,EAACG,GAAA,EAAwB,UAAU1D,EAAU,KAAK,MAAMA,EAAU,SAAS,CAAC,CAAC,GAAG,MAAM0B,KAA1E,YAAsF;AAAA,IAErGC,KAAW,gBAAA4B,EAACG,GAAA,EAAqB,UAAU1D,EAAUA,EAAU,SAAS,CAAC,GAAG,MAAM2B,EAAA,GAA3D,SAAoE;AAAA,IAC3FgC,EAAQ7B,CAAO,KAAKA,EAAQ,IAAI,OAAU8B,CAAM;AAAA,EAAA,GACrD;AAER;"}
|
|
@@ -2,9 +2,29 @@ import { default as React } from 'react';
|
|
|
2
2
|
import { EventListenerMap } from '../../../utils/eventHandling';
|
|
3
3
|
import { Position } from '../../../utils/mapTypes';
|
|
4
4
|
export type MarkerIcon = string | React.ReactElement;
|
|
5
|
+
type GetOrCreateIconOptions = {
|
|
6
|
+
cacheEnabled?: boolean;
|
|
7
|
+
};
|
|
5
8
|
export declare const isHMapIcon: (icon: MarkerIcon | H.map.DomIcon | undefined) => icon is H.map.Icon;
|
|
6
9
|
export declare const isDomMakerNeeded: (icon: MarkerIcon | H.map.DomIcon | undefined) => boolean;
|
|
7
|
-
export declare const
|
|
10
|
+
export declare const getMarkerDebugStats: () => {
|
|
11
|
+
cacheEnabled: boolean;
|
|
12
|
+
domIconCreations: number;
|
|
13
|
+
markupCacheHits: number;
|
|
14
|
+
markupCacheMisses: number;
|
|
15
|
+
reactElementCacheHits: number;
|
|
16
|
+
reactElementCacheMisses: number;
|
|
17
|
+
uncachedDomIconCreations: number;
|
|
18
|
+
markerSetups: number;
|
|
19
|
+
markerDestroys: number;
|
|
20
|
+
markerIconUpdates: number;
|
|
21
|
+
markerIconRecreates: number;
|
|
22
|
+
markerSetIconCalls: number;
|
|
23
|
+
};
|
|
24
|
+
export declare const resetMarkerDebugStats: () => void;
|
|
25
|
+
export declare const setMarkerIconCacheEnabled: (enabled: boolean) => void;
|
|
26
|
+
export declare const clearMarkerIconCache: () => void;
|
|
27
|
+
export declare const getOrCreateIcon: (icon: MarkerIcon | H.map.DomIcon | undefined, options?: GetOrCreateIconOptions) => H.map.DomIcon | H.map.Icon;
|
|
8
28
|
export type MarkerProps = {
|
|
9
29
|
position: Position;
|
|
10
30
|
icon?: MarkerIcon;
|
|
@@ -1,46 +1,105 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { removeEventListenerMap as
|
|
4
|
-
import { useMapContext as
|
|
5
|
-
const
|
|
6
|
-
|
|
1
|
+
import w, { useRef as k, useEffect as l } from "react";
|
|
2
|
+
import O from "react-dom/server";
|
|
3
|
+
import { removeEventListenerMap as b, addEventListenerMap as g } from "../../../utils/eventHandling.js";
|
|
4
|
+
import { useMapContext as y } from "../../MapContext.js";
|
|
5
|
+
const v = (e) => e instanceof H.map.Icon, p = (e) => e ? !v(e) : !1, x = 500, u = /* @__PURE__ */ new Map();
|
|
6
|
+
let M = /* @__PURE__ */ new WeakMap(), C = !0;
|
|
7
|
+
const S = () => ({
|
|
8
|
+
cacheEnabled: C,
|
|
9
|
+
domIconCreations: 0,
|
|
10
|
+
markupCacheHits: 0,
|
|
11
|
+
markupCacheMisses: 0,
|
|
12
|
+
reactElementCacheHits: 0,
|
|
13
|
+
reactElementCacheMisses: 0,
|
|
14
|
+
uncachedDomIconCreations: 0,
|
|
15
|
+
markerSetups: 0,
|
|
16
|
+
markerDestroys: 0,
|
|
17
|
+
markerIconUpdates: 0,
|
|
18
|
+
markerIconRecreates: 0,
|
|
19
|
+
markerSetIconCalls: 0
|
|
20
|
+
}), r = S(), N = () => ({
|
|
21
|
+
...r,
|
|
22
|
+
cacheEnabled: C
|
|
23
|
+
}), W = () => {
|
|
24
|
+
Object.assign(r, S());
|
|
25
|
+
}, z = (e) => {
|
|
26
|
+
C = e;
|
|
27
|
+
}, G = () => {
|
|
28
|
+
u.clear(), M = /* @__PURE__ */ new WeakMap();
|
|
29
|
+
}, j = (e) => {
|
|
30
|
+
const n = e ?? C;
|
|
31
|
+
return r.cacheEnabled = n, n;
|
|
32
|
+
}, f = (e) => {
|
|
33
|
+
const n = u.get(e);
|
|
34
|
+
if (n)
|
|
35
|
+
return r.markupCacheHits += 1, u.delete(e), u.set(e, n), n;
|
|
36
|
+
r.markupCacheMisses += 1, r.domIconCreations += 1;
|
|
37
|
+
const o = new H.map.DomIcon(e);
|
|
38
|
+
if (u.set(e, o), u.size > x) {
|
|
39
|
+
const c = u.keys().next().value;
|
|
40
|
+
c !== void 0 && u.delete(c);
|
|
41
|
+
}
|
|
42
|
+
return o;
|
|
43
|
+
}, R = (e, n = {}) => {
|
|
44
|
+
if (!e || v(e) || e instanceof H.map.DomIcon)
|
|
7
45
|
return e || "";
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
46
|
+
const o = j(n.cacheEnabled);
|
|
47
|
+
if (w.isValidElement(e)) {
|
|
48
|
+
const i = O.renderToStaticMarkup(e);
|
|
49
|
+
if (!o)
|
|
50
|
+
return r.reactElementCacheMisses += 1, r.domIconCreations += 1, r.uncachedDomIconCreations += 1, new H.map.DomIcon(i);
|
|
51
|
+
const a = M.get(e);
|
|
52
|
+
if (a)
|
|
53
|
+
return r.reactElementCacheHits += 1, a;
|
|
54
|
+
r.reactElementCacheMisses += 1;
|
|
55
|
+
const m = f(i);
|
|
56
|
+
return M.set(e, m), m;
|
|
57
|
+
}
|
|
58
|
+
const c = e;
|
|
59
|
+
return o ? f(c) : (r.domIconCreations += 1, r.uncachedDomIconCreations += 1, new H.map.DomIcon(c));
|
|
60
|
+
}, D = (e, n, o) => {
|
|
61
|
+
const { position: c, customData: i, icon: a, draggable: m, eventListenerMap: t } = e;
|
|
62
|
+
r.markerSetups += 1;
|
|
63
|
+
const d = p(a) ? H.map.DomMarker : H.map.Marker, s = new d(c, {
|
|
64
|
+
icon: a && R(a, { cacheEnabled: o })
|
|
65
|
+
}), I = n.map;
|
|
66
|
+
return s.setData(i), s.draggable = !!m, I?.addObject(s), I && g(s, t, I), s;
|
|
67
|
+
}, E = (e, n) => {
|
|
68
|
+
r.markerDestroys += 1, b(e), n.map?.getObjects().includes(e) && n.map.removeObject(e), e.dispose();
|
|
69
|
+
}, K = (e) => {
|
|
70
|
+
const { position: n, customData: o, icon: c, eventListenerMap: i } = e, { api: a, enableMarkerIconCache: m } = y(), t = k(), d = k(p(c));
|
|
71
|
+
return l(() => (t.current = D(e, a, m), d.current = p(c), () => {
|
|
72
|
+
t.current && (E(t.current, a), t.current = void 0);
|
|
73
|
+
}), []), l(() => {
|
|
74
|
+
t.current && t.current.setGeometry(n);
|
|
75
|
+
}, [n, t.current]), l(() => {
|
|
76
|
+
t.current && t.current.setData(o);
|
|
77
|
+
}, [o, t.current]), l(() => {
|
|
78
|
+
if (t.current) {
|
|
79
|
+
const s = b(t.current);
|
|
80
|
+
g(t.current, i, s);
|
|
29
81
|
}
|
|
30
|
-
}, [
|
|
31
|
-
if (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
82
|
+
}, [i, t.current]), l(() => {
|
|
83
|
+
if (!(t.current && c))
|
|
84
|
+
return;
|
|
85
|
+
r.markerIconUpdates += 1;
|
|
86
|
+
const s = p(c);
|
|
87
|
+
if (d.current !== s)
|
|
88
|
+
r.markerIconRecreates += 1, E(t.current, a), t.current = D(e, a, m), d.current = s;
|
|
89
|
+
else {
|
|
90
|
+
const h = R(c, { cacheEnabled: m });
|
|
91
|
+
r.markerSetIconCalls += 1, h && t.current.setIcon(h);
|
|
92
|
+
}
|
|
93
|
+
}, [c, t.current, m]), null;
|
|
39
94
|
};
|
|
40
95
|
export {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
96
|
+
G as clearMarkerIconCache,
|
|
97
|
+
K as default,
|
|
98
|
+
N as getMarkerDebugStats,
|
|
99
|
+
R as getOrCreateIcon,
|
|
100
|
+
p as isDomMakerNeeded,
|
|
101
|
+
v as isHMapIcon,
|
|
102
|
+
W as resetMarkerDebugStats,
|
|
103
|
+
z as setMarkerIconCacheEnabled
|
|
45
104
|
};
|
|
46
105
|
//# sourceMappingURL=Marker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Marker.js","sources":["../../../../../../src/components/map/components/features/basics/Marker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport ReactDomServer from 'react-dom/server';\n\nimport { type EventListenerMap, addEventListenerMap, removeEventListenerMap } from '../../../utils/eventHandling';\nimport { useMapContext } from '../../MapContext';\nimport type { MapApi, Position } from '../../../utils/mapTypes';\n\nexport type MarkerIcon = string | React.ReactElement; // Element;\n\nexport const isHMapIcon = (icon: MarkerIcon | H.map.DomIcon | undefined) => icon instanceof H.map.Icon;\n\nexport const isDomMakerNeeded = (icon: MarkerIcon | H.map.DomIcon | undefined) => (!icon ? false : !isHMapIcon(icon));\n\n// Note:\n// H.map.Marker: A \"normal\" marker that uses a static image as an icon.\n// Large numbers of markers of this types can be added to the map very quickly and efficiently.\n// H.map.Dom: A marker which supports HTML (and SVG) content, which can be dynamic.\n// Markers of this type are best displayed individually or in small sets.\n// It is also important to note that Markers and DomMarkers are rendered in separate rendering steps.\n// Markers are rendered in the map scene and therefore appear behind any DomMarkers which are rendered\n// as an overlay on top of the map.\nexport const getOrCreateIcon = (icon: MarkerIcon | H.map.DomIcon | undefined) => {\n if (isHMapIcon(icon) || icon instanceof H.map.DomIcon) {\n return icon || '';\n }\n\n const renderedIcon = React.isValidElement(icon) ? ReactDomServer.renderToStaticMarkup(icon) : icon;\n\n return new H.map.DomIcon(renderedIcon as any);\n};\n\nconst setupMarker = (props: MarkerProps, api: MapApi) => {\n const { position, customData, icon, draggable, eventListenerMap } = props;\n\n const MarkerConstructor = isDomMakerNeeded(icon) ? H.map.DomMarker : H.map.Marker;\n\n const marker = new MarkerConstructor(position, {\n icon: icon && (getOrCreateIcon(icon) as any),\n });\n\n marker.setData(customData);\n marker.draggable = !!draggable;\n\n api.map?.addObject(marker);\n\n addEventListenerMap(marker, eventListenerMap, api.map!);\n\n return marker;\n};\n\nconst destroyMarker = (marker: H.map.DomMarker, api: MapApi) => {\n removeEventListenerMap(marker);\n if (api.map?.getObjects().includes(marker)) {\n api.map.removeObject(marker);\n }\n marker.dispose();\n};\n\nexport type MarkerProps = {\n position: Position;\n icon?: MarkerIcon;\n eventListenerMap?: EventListenerMap;\n customData?: object;\n draggable?: boolean;\n};\n\nconst Marker = (props: MarkerProps) => {\n const { position, customData, icon, eventListenerMap } = props;\n\n const { api } = useMapContext();\n\n const markerRef = useRef<H.map.DomMarker>();\n\n useEffect(() => {\n markerRef.current = setupMarker(props, api);\n\n return () => {\n if (markerRef.current) {\n destroyMarker(markerRef.current, api);\n markerRef.current = undefined;\n }\n };\n }, []);\n\n // Update marker position\n useEffect(() => {\n if (markerRef.current) {\n markerRef.current.setGeometry(position);\n }\n }, [position, markerRef.current]);\n\n // Update marker custom data\n useEffect(() => {\n if (markerRef.current) {\n markerRef.current.setData(customData);\n }\n }, [customData, markerRef.current]);\n\n // Update EventListenerMap\n useEffect(() => {\n if (markerRef.current) {\n // use exports to make methods accessible for stubbing\n const mapApi = removeEventListenerMap(markerRef.current);\n addEventListenerMap(markerRef.current, eventListenerMap, mapApi);\n }\n }, [eventListenerMap, markerRef.current]);\n\n // If icon type changed, we need to change the marker type\n useEffect(() => {\n if (!(markerRef.current && icon)) {\n return;\n }\n\n if (isDomMakerNeeded(icon)) {\n destroyMarker(markerRef.current, api);\n markerRef.current = setupMarker(props, api);\n } else {\n const domIcon = getOrCreateIcon(icon);\n domIcon && markerRef.current.setIcon(domIcon);\n }\n }, [icon, markerRef.current]);\n\n return null;\n};\n\nexport default Marker;\n"],"names":["isHMapIcon","icon","isDomMakerNeeded","getOrCreateIcon","renderedIcon","React","ReactDomServer","setupMarker","props","api","position","customData","draggable","eventListenerMap","MarkerConstructor","marker","addEventListenerMap","destroyMarker","removeEventListenerMap","Marker","useMapContext","markerRef","useRef","useEffect","mapApi","domIcon"],"mappings":";;;;AASO,MAAMA,IAAa,CAACC,MAAiDA,aAAgB,EAAE,IAAI,MAErFC,IAAmB,CAACD,MAAmDA,IAAe,CAACD,EAAWC,CAAI,IAAxB,IAU9EE,IAAkB,CAACF,MAAiD;AAC7E,MAAID,EAAWC,CAAI,KAAKA,aAAgB,EAAE,IAAI;AAC1C,WAAOA,KAAQ;AAGnB,QAAMG,IAAeC,EAAM,eAAeJ,CAAI,IAAIK,EAAe,qBAAqBL,CAAI,IAAIA;AAE9F,SAAO,IAAI,EAAE,IAAI,QAAQG,CAAmB;AAChD,GAEMG,IAAc,CAACC,GAAoBC,MAAgB;AACrD,QAAM,EAAE,UAAAC,GAAU,YAAAC,GAAY,MAAAV,GAAM,WAAAW,GAAW,kBAAAC,MAAqBL,GAE9DM,IAAoBZ,EAAiBD,CAAI,IAAI,EAAE,IAAI,YAAY,EAAE,IAAI,QAErEc,IAAS,IAAID,EAAkBJ,GAAU;AAAA,IAC3C,MAAMT,KAASE,EAAgBF,CAAI;AAAA,EAAA,CACtC;AAED,SAAAc,EAAO,QAAQJ,CAAU,GACzBI,EAAO,YAAY,CAAC,CAACH,GAErBH,EAAI,KAAK,UAAUM,CAAM,GAEzBC,EAAoBD,GAAQF,GAAkBJ,EAAI,GAAI,GAE/CM;AACX,GAEME,IAAgB,CAACF,GAAyBN,MAAgB;AAC5D,EAAAS,EAAuBH,CAAM,GACzBN,EAAI,KAAK,WAAA,EAAa,SAASM,CAAM,KACrCN,EAAI,IAAI,aAAaM,CAAM,GAE/BA,EAAO,QAAA;AACX,GAUMI,IAAS,CAACX,MAAuB;AACnC,QAAM,EAAE,UAAAE,GAAU,YAAAC,GAAY,MAAAV,GAAM,kBAAAY,MAAqBL,GAEnD,EAAE,KAAAC,EAAA,IAAQW,EAAA,GAEVC,IAAYC,EAAA;AAElB,SAAAC,EAAU,OACNF,EAAU,UAAUd,EAAYC,GAAOC,CAAG,GAEnC,MAAM;AACT,IAAIY,EAAU,YACVJ,EAAcI,EAAU,SAASZ,CAAG,GACpCY,EAAU,UAAU;AAAA,EAE5B,IACD,CAAA,CAAE,GAGLE,EAAU,MAAM;AACZ,IAAIF,EAAU,WACVA,EAAU,QAAQ,YAAYX,CAAQ;AAAA,EAE9C,GAAG,CAACA,GAAUW,EAAU,OAAO,CAAC,GAGhCE,EAAU,MAAM;AACZ,IAAIF,EAAU,WACVA,EAAU,QAAQ,QAAQV,CAAU;AAAA,EAE5C,GAAG,CAACA,GAAYU,EAAU,OAAO,CAAC,GAGlCE,EAAU,MAAM;AACZ,QAAIF,EAAU,SAAS;AAEnB,YAAMG,IAASN,EAAuBG,EAAU,OAAO;AACvD,MAAAL,EAAoBK,EAAU,SAASR,GAAkBW,CAAM;AAAA,IACnE;AAAA,EACJ,GAAG,CAACX,GAAkBQ,EAAU,OAAO,CAAC,GAGxCE,EAAU,MAAM;AACZ,QAAMF,EAAU,WAAWpB;AAI3B,UAAIC,EAAiBD,CAAI;AACrB,QAAAgB,EAAcI,EAAU,SAASZ,CAAG,GACpCY,EAAU,UAAUd,EAAYC,GAAOC,CAAG;AAAA,WACvC;AACH,cAAMgB,IAAUtB,EAAgBF,CAAI;AACpC,QAAAwB,KAAWJ,EAAU,QAAQ,QAAQI,CAAO;AAAA,MAChD;AAAA,EACJ,GAAG,CAACxB,GAAMoB,EAAU,OAAO,CAAC,GAErB;AACX;"}
|
|
1
|
+
{"version":3,"file":"Marker.js","sources":["../../../../../../src/components/map/components/features/basics/Marker.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport ReactDomServer from 'react-dom/server';\n\nimport { type EventListenerMap, addEventListenerMap, removeEventListenerMap } from '../../../utils/eventHandling';\nimport { useMapContext } from '../../MapContext';\nimport type { MapApi, Position } from '../../../utils/mapTypes';\n\nexport type MarkerIcon = string | React.ReactElement; // Element;\ntype MapMarkerObject = H.map.Marker | H.map.DomMarker;\ntype GetOrCreateIconOptions = {\n cacheEnabled?: boolean;\n};\n\nexport const isHMapIcon = (icon: MarkerIcon | H.map.DomIcon | undefined) => icon instanceof H.map.Icon;\n\nexport const isDomMakerNeeded = (icon: MarkerIcon | H.map.DomIcon | undefined) => (!icon ? false : !isHMapIcon(icon));\n\nconst DOM_ICON_CACHE_MAX_SIZE = 500;\nconst domIconCache = new Map<string, H.map.DomIcon>();\n\nlet reactElementIconCache = new WeakMap<React.ReactElement, H.map.DomIcon>();\nlet markerIconCacheEnabled = true;\n\ntype MarkerDebugStats = {\n cacheEnabled: boolean;\n domIconCreations: number;\n markupCacheHits: number;\n markupCacheMisses: number;\n reactElementCacheHits: number;\n reactElementCacheMisses: number;\n uncachedDomIconCreations: number;\n markerSetups: number;\n markerDestroys: number;\n markerIconUpdates: number;\n markerIconRecreates: number;\n markerSetIconCalls: number;\n};\n\nconst createMarkerDebugStats = (): MarkerDebugStats => ({\n cacheEnabled: markerIconCacheEnabled,\n domIconCreations: 0,\n markupCacheHits: 0,\n markupCacheMisses: 0,\n reactElementCacheHits: 0,\n reactElementCacheMisses: 0,\n uncachedDomIconCreations: 0,\n markerSetups: 0,\n markerDestroys: 0,\n markerIconUpdates: 0,\n markerIconRecreates: 0,\n markerSetIconCalls: 0,\n});\n\nconst markerDebugStats = createMarkerDebugStats();\n\nexport const getMarkerDebugStats = () => ({\n ...markerDebugStats,\n cacheEnabled: markerIconCacheEnabled,\n});\n\nexport const resetMarkerDebugStats = () => {\n Object.assign(markerDebugStats, createMarkerDebugStats());\n};\n\nexport const setMarkerIconCacheEnabled = (enabled: boolean) => {\n markerIconCacheEnabled = enabled;\n};\n\nexport const clearMarkerIconCache = () => {\n domIconCache.clear();\n reactElementIconCache = new WeakMap<React.ReactElement, H.map.DomIcon>();\n};\n\nconst resolveCacheEnabled = (cacheEnabled?: boolean) => {\n const resolvedCacheEnabled = cacheEnabled ?? markerIconCacheEnabled;\n markerDebugStats.cacheEnabled = resolvedCacheEnabled;\n return resolvedCacheEnabled;\n};\n\nconst getCachedDomIcon = (markup: string) => {\n const cachedIcon = domIconCache.get(markup);\n\n if (cachedIcon) {\n markerDebugStats.markupCacheHits += 1;\n // Refresh insertion order so frequently used icons stay in the cache longer.\n domIconCache.delete(markup);\n domIconCache.set(markup, cachedIcon);\n return cachedIcon;\n }\n\n markerDebugStats.markupCacheMisses += 1;\n markerDebugStats.domIconCreations += 1;\n\n const nextIcon = new H.map.DomIcon(markup);\n domIconCache.set(markup, nextIcon);\n\n if (domIconCache.size > DOM_ICON_CACHE_MAX_SIZE) {\n const oldestKey = domIconCache.keys().next().value;\n\n if (oldestKey !== undefined) {\n domIconCache.delete(oldestKey);\n }\n }\n\n return nextIcon;\n};\n\n// Note:\n// H.map.Marker: A \"normal\" marker that uses a static image as an icon.\n// Large numbers of markers of this types can be added to the map very quickly and efficiently.\n// H.map.Dom: A marker which supports HTML (and SVG) content, which can be dynamic.\n// Markers of this type are best displayed individually or in small sets.\n// It is also important to note that Markers and DomMarkers are rendered in separate rendering steps.\n// Markers are rendered in the map scene and therefore appear behind any DomMarkers which are rendered\n// as an overlay on top of the map.\nexport const getOrCreateIcon = (icon: MarkerIcon | H.map.DomIcon | undefined, options: GetOrCreateIconOptions = {}) => {\n if (!icon || isHMapIcon(icon) || icon instanceof H.map.DomIcon) {\n return icon || '';\n }\n\n const cacheEnabled = resolveCacheEnabled(options.cacheEnabled);\n\n if (React.isValidElement(icon)) {\n const renderedIcon = ReactDomServer.renderToStaticMarkup(icon);\n\n if (!cacheEnabled) {\n markerDebugStats.reactElementCacheMisses += 1;\n markerDebugStats.domIconCreations += 1;\n markerDebugStats.uncachedDomIconCreations += 1;\n return new H.map.DomIcon(renderedIcon);\n }\n\n const cachedElementIcon = reactElementIconCache.get(icon);\n\n if (cachedElementIcon) {\n markerDebugStats.reactElementCacheHits += 1;\n return cachedElementIcon;\n }\n\n markerDebugStats.reactElementCacheMisses += 1;\n const cachedMarkupIcon = getCachedDomIcon(renderedIcon);\n reactElementIconCache.set(icon, cachedMarkupIcon);\n\n return cachedMarkupIcon;\n }\n\n const stringIcon = icon as string;\n\n if (!cacheEnabled) {\n markerDebugStats.domIconCreations += 1;\n markerDebugStats.uncachedDomIconCreations += 1;\n return new H.map.DomIcon(stringIcon);\n }\n\n return getCachedDomIcon(stringIcon);\n};\n\nconst setupMarker = (props: MarkerProps, api: MapApi, cacheEnabled?: boolean) => {\n const { position, customData, icon, draggable, eventListenerMap } = props;\n\n markerDebugStats.markerSetups += 1;\n\n const MarkerConstructor = isDomMakerNeeded(icon) ? H.map.DomMarker : H.map.Marker;\n\n const marker = new MarkerConstructor(position, {\n icon: icon && getOrCreateIcon(icon, { cacheEnabled }),\n });\n\n const map = api.map;\n\n marker.setData(customData);\n marker.draggable = !!draggable;\n\n map?.addObject(marker);\n\n if (map) {\n addEventListenerMap(marker, eventListenerMap, map);\n }\n\n return marker;\n};\n\nconst destroyMarker = (marker: MapMarkerObject, api: MapApi) => {\n markerDebugStats.markerDestroys += 1;\n removeEventListenerMap(marker);\n if (api.map?.getObjects().includes(marker)) {\n api.map.removeObject(marker);\n }\n marker.dispose();\n};\n\nexport type MarkerProps = {\n position: Position;\n icon?: MarkerIcon;\n eventListenerMap?: EventListenerMap;\n customData?: object;\n draggable?: boolean;\n};\n\nconst Marker = (props: MarkerProps) => {\n const { position, customData, icon, eventListenerMap } = props;\n\n const { api, enableMarkerIconCache } = useMapContext();\n\n const markerRef = useRef<MapMarkerObject>();\n const markerUsesDomIconRef = useRef<boolean>(isDomMakerNeeded(icon));\n\n useEffect(() => {\n markerRef.current = setupMarker(props, api, enableMarkerIconCache);\n markerUsesDomIconRef.current = isDomMakerNeeded(icon);\n\n return () => {\n if (markerRef.current) {\n destroyMarker(markerRef.current, api);\n markerRef.current = undefined;\n }\n };\n }, []);\n\n // Update marker position\n useEffect(() => {\n if (markerRef.current) {\n markerRef.current.setGeometry(position);\n }\n }, [position, markerRef.current]);\n\n // Update marker custom data\n useEffect(() => {\n if (markerRef.current) {\n markerRef.current.setData(customData);\n }\n }, [customData, markerRef.current]);\n\n // Update EventListenerMap\n useEffect(() => {\n if (markerRef.current) {\n // use exports to make methods accessible for stubbing\n const mapApi = removeEventListenerMap(markerRef.current);\n addEventListenerMap(markerRef.current, eventListenerMap, mapApi);\n }\n }, [eventListenerMap, markerRef.current]);\n\n // If icon type changed, we need to change the marker type\n useEffect(() => {\n if (!(markerRef.current && icon)) {\n return;\n }\n\n markerDebugStats.markerIconUpdates += 1;\n\n const nextUsesDomIcon = isDomMakerNeeded(icon);\n const shouldRecreateMarker = markerUsesDomIconRef.current !== nextUsesDomIcon;\n\n if (shouldRecreateMarker) {\n markerDebugStats.markerIconRecreates += 1;\n destroyMarker(markerRef.current, api);\n markerRef.current = setupMarker(props, api, enableMarkerIconCache);\n markerUsesDomIconRef.current = nextUsesDomIcon;\n } else {\n const domIcon = getOrCreateIcon(icon, { cacheEnabled: enableMarkerIconCache });\n markerDebugStats.markerSetIconCalls += 1;\n domIcon && markerRef.current.setIcon(domIcon);\n }\n }, [icon, markerRef.current, enableMarkerIconCache]);\n\n return null;\n};\n\nexport default Marker;\n"],"names":["isHMapIcon","icon","isDomMakerNeeded","DOM_ICON_CACHE_MAX_SIZE","domIconCache","reactElementIconCache","markerIconCacheEnabled","createMarkerDebugStats","markerDebugStats","getMarkerDebugStats","resetMarkerDebugStats","setMarkerIconCacheEnabled","enabled","clearMarkerIconCache","resolveCacheEnabled","cacheEnabled","resolvedCacheEnabled","getCachedDomIcon","markup","cachedIcon","nextIcon","oldestKey","getOrCreateIcon","options","React","renderedIcon","ReactDomServer","cachedElementIcon","cachedMarkupIcon","stringIcon","setupMarker","props","api","position","customData","draggable","eventListenerMap","MarkerConstructor","marker","map","addEventListenerMap","destroyMarker","removeEventListenerMap","Marker","enableMarkerIconCache","useMapContext","markerRef","useRef","markerUsesDomIconRef","useEffect","mapApi","nextUsesDomIcon","domIcon"],"mappings":"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"}
|