import { forwardRef, useImperativeHandle, useRef } from 'react' import { useSettingsStore } from '../../store/settingsStore' import JourneyMap, { type JourneyMapHandle } from './JourneyMap' import JourneyMapGL, { type JourneyMapGLHandle } from './JourneyMapGL' // Unified handle — both providers expose the same three methods. export type JourneyMapAutoHandle = JourneyMapHandle interface MapEntry { id: string lat: number lng: number title?: string | null location_name?: string | null mood?: string | null entry_date: string dayColor?: string dayLabel?: number } interface Props { checkins: unknown[] entries: MapEntry[] trail?: { lat: number; lng: number }[] height?: number dark?: boolean activeMarkerId?: string | null onMarkerClick?: (id: string, type?: string) => void fullScreen?: boolean paddingBottom?: number } const JourneyMapAuto = forwardRef(function JourneyMapAuto(props, ref) { const provider = useSettingsStore(s => s.settings.map_provider) const token = useSettingsStore(s => s.settings.mapbox_access_token) const leafletRef = useRef(null) const glRef = useRef(null) // Fall back to Leaflet when the user selected Mapbox GL but hasn't // supplied a token yet — otherwise the map would just show a stub. const useGL = provider === 'mapbox-gl' && !!token useImperativeHandle(ref, () => ({ highlightMarker: (id) => (useGL ? glRef.current : leafletRef.current)?.highlightMarker(id), focusMarker: (id) => (useGL ? glRef.current : leafletRef.current)?.focusMarker(id), invalidateSize: () => (useGL ? glRef.current : leafletRef.current)?.invalidateSize(), }), [useGL]) if (useGL) { // eslint-disable-next-line @typescript-eslint/no-explicit-any return } // eslint-disable-next-line @typescript-eslint/no-explicit-any return }) export default JourneyMapAuto