import { LatLngTuple } from 'leaflet'; import React, { useCallback } from 'react'; import { Marker, Popup } from 'react-leaflet'; import { useMapActions } from '@/contexts/MapContexts.tsx'; import { HistoricalLandmark } from '@/types.ts'; import { getCachedHistoricalIcon } from '@/utils/map/iconCache.ts'; interface HistoricalMarkersProps { landmarks: HistoricalLandmark[]; selectedLandmark: HistoricalLandmark | null; hoveredLandmarkId: string | null; } /** * Individual historical marker component memoized to prevent unnecessary re-renders */ const HistoricalMarker = React.memo<{ landmark: HistoricalLandmark; isSelected: boolean; isHovered: boolean; onSelect: (landmark: HistoricalLandmark) => void; onHover: (landmarkId: string | null) => void; }>(({ landmark, isSelected, isHovered, onSelect, onHover }) => { const position: LatLngTuple = [landmark.location.lat, landmark.location.lng]; const icon = getCachedHistoricalIcon(landmark.id, landmark, isSelected, isHovered); const handleClick = useCallback(() => { onSelect(landmark); }, [landmark, onSelect]); const handleMouseOver = useCallback(() => { onHover(landmark.id); }, [landmark.id, onHover]); const handleMouseOut = useCallback(() => { onHover(null); }, [onHover]); if (!landmark.location) return null; return (

{landmark.name}

{landmark.period}

); }); HistoricalMarker.displayName = 'HistoricalMarker'; const HistoricalMarkers: React.FC = ({ landmarks, selectedLandmark, hoveredLandmarkId, }) => { const { handleSelectLandmark, setHoveredLandmarkId } = useMapActions(); return ( <> {landmarks.map((landmark) => { if (!landmark.location) return null; const isSelected = selectedLandmark?.id === landmark.id; const isHovered = hoveredLandmarkId === landmark.id; return ( ); })} ); }; export default React.memo(HistoricalMarkers);