Skip to content

Commit 1007ed3

Browse files
committed
feat: add DefaultMarker component and update MarkerMap to use it for improved marker rendering
1 parent 83d95fb commit 1007ed3

File tree

2 files changed

+49
-15
lines changed

2 files changed

+49
-15
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Box, useTheme } from "@tracktor/design-system";
2+
3+
const DefaultMarker = ({ color = "#1976d2" }) => {
4+
const { palette } = useTheme();
5+
6+
const centerColor = palette.mode === "dark" ? "#000000" : "#ffffff";
7+
8+
return (
9+
<Box
10+
component="div"
11+
style={{
12+
backgroundColor: centerColor,
13+
border: `7px solid ${color}`,
14+
borderRadius: "50%",
15+
boxShadow: "0 0 4px rgba(0,0,0,0.3)",
16+
height: 28,
17+
width: 28,
18+
}}
19+
/>
20+
);
21+
};
22+
23+
export default DefaultMarker;

src/components/MarkerMap/MarkerMap.tsx

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ import { memo, ReactElement, useMemo, useState } from "react";
33
import MapboxMap, { Marker, Popup } from "react-map-gl";
44
import { MarkerMapProps } from "@/types/MarkerMapProps";
55
import "mapbox-gl/dist/mapbox-gl.css";
6-
import { isArray } from "@tracktor/react-utils";
6+
import { isArray, isNumber } from "@tracktor/react-utils";
77
import FitBounds from "@/Features/Bounds/FitsBounds.ts";
8+
import DefaultMarker from "@/Features/Markers/DefaultMarkers.tsx";
89

910
const MarkerMap = ({
1011
containerStyle,
@@ -27,17 +28,22 @@ const MarkerMap = ({
2728
const theme = useTheme();
2829
const [selected, setSelected] = useState<string | number | null>(openPopup ?? null);
2930

30-
const selectedMarker = useMemo(() => (selected ? (markers.find((m) => m.id === selected) ?? null) : null), [selected, markers]);
31+
const selectedMarker = useMemo(() => {
32+
if (!selected) {
33+
return null;
34+
}
35+
return markers.find((m) => m.id === selected) ?? null;
36+
}, [selected, markers]);
3137

32-
const handleMarkerClick = (id: string | number) => {
33-
if (!openPopupOnHover) {
38+
const handleMarkerClick = (id: string | number, hasTooltip: boolean) => {
39+
if (!openPopupOnHover && hasTooltip) {
3440
setSelected(id);
3541
}
3642
};
3743

38-
const handleMarkerHover = (id: string | number | null) => {
44+
const handleMarkerHover = (id: string | number | null, hasTooltip?: boolean) => {
3945
if (openPopupOnHover) {
40-
setSelected(id);
46+
setSelected(hasTooltip ? id : null);
4147
}
4248
};
4349

@@ -72,26 +78,31 @@ const MarkerMap = ({
7278
{markers.map((m) => (
7379
<Marker
7480
key={m.id}
75-
longitude={m.lng}
76-
latitude={m.lat}
81+
longitude={isNumber(m.lng) ? m.lng : undefined}
82+
latitude={isNumber(m.lat) ? m.lat : undefined}
7783
anchor="bottom"
78-
onClick={() => handleMarkerClick(m.id)}
79-
onMouseEnter={() => handleMarkerHover(m.id)}
84+
onClick={() => handleMarkerClick(m.id, Boolean(m.Tooltip))}
85+
onMouseEnter={() => handleMarkerHover(m.id, Boolean(m.Tooltip))}
8086
onMouseLeave={() => handleMarkerHover(null)}
8187
>
82-
{m.IconComponent ? <m.IconComponent {...m.iconProps} /> : <div>📍</div>}
88+
{m.IconComponent ? (
89+
<m.IconComponent {...m.iconProps} />
90+
) : (
91+
<DefaultMarker color={m.type === "worksite" ? "#1976d2" : "#4caf50"} />
92+
)}
8393
</Marker>
8494
))}
8595

86-
{selectedMarker && (
96+
{selectedMarker?.Tooltip && (
8797
<Popup
88-
longitude={selectedMarker.lng}
89-
latitude={selectedMarker.lat}
98+
longitude={isNumber(selectedMarker.lng) ? selectedMarker.lng : 0}
99+
latitude={isNumber(selectedMarker.lat) ? selectedMarker.lat : 0}
90100
anchor="top"
91101
onClose={() => setSelected(null)}
92102
maxWidth={popupMaxWidth}
103+
closeOnClick={false}
93104
>
94-
{selectedMarker.Tooltip ?? <div>Marker {selectedMarker.id}</div>}
105+
{selectedMarker.Tooltip}
95106
</Popup>
96107
)}
97108

0 commit comments

Comments
 (0)