@@ -3,8 +3,9 @@ import { memo, ReactElement, useMemo, useState } from "react";
33import MapboxMap , { Marker , Popup } from "react-map-gl" ;
44import { MarkerMapProps } from "@/types/MarkerMapProps" ;
55import "mapbox-gl/dist/mapbox-gl.css" ;
6- import { isArray } from "@tracktor/react-utils" ;
6+ import { isArray , isNumber } from "@tracktor/react-utils" ;
77import FitBounds from "@/Features/Bounds/FitsBounds.ts" ;
8+ import DefaultMarker from "@/Features/Markers/DefaultMarkers.tsx" ;
89
910const 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