import './../../vendor/libs/leaflet/leaflet' export const LeafletMapHelper = (() => { let mapInstance, markerInstance; const DEFAULT_COORDS = [19.4326, -99.1332]; // Coordenadas de CDMX por defecto // Valida coordenadas const isValidCoordinate = (lat, lng) => { return lat && !isNaN(lat) && lat >= -90 && lat <= 90 && lat !== 0 && lng && !isNaN(lng) && lng >= -180 && lng <= 180 && lng !== 0; }; // Crea opciones del mapa según el modo const getMapOptions = (mode) => ({ scrollWheelZoom: mode !== 'delete', dragging: mode !== 'delete', doubleClickZoom: mode !== 'delete', boxZoom: mode !== 'delete', keyboard: mode !== 'delete', zoomControl: mode !== 'delete', touchZoom: mode !== 'delete' }); // Destruir el mapa existente const destroyMap = () => { if (mapInstance) { mapInstance.off(); mapInstance.remove(); mapInstance = null; } removeMarker(); }; // Crear marcador en el mapa const createMarker = (lat, lng, draggable = false, onDragEnd) => { if (isValidCoordinate(lat, lng)) { markerInstance = L.marker([lat, lng], { draggable }).addTo(mapInstance) .bindPopup('Ubicación seleccionada').openPopup(); if (draggable && onDragEnd) { markerInstance.on('dragend', (e) => { const { lat, lng } = e.target.getLatLng(); onDragEnd(lat, lng); }); } } }; // Eliminar marcador const removeMarker = () => { if (markerInstance) { markerInstance.remove(); markerInstance = null; } }; // Actualizar coordenadas en formulario const updateCoordinates = (lat, lng, latSelector, lngSelector, livewireInstance) => { const latInput = document.querySelector(latSelector); const lngInput = document.querySelector(lngSelector); if (!latInput || !lngInput) { console.warn(`⚠️ No se encontró el elemento del DOM para latitud (${latSelector}) o longitud (${lngSelector})`); return; } latInput.value = lat ? lat.toFixed(6) : ''; lngInput.value = lng ? lng.toFixed(6) : ''; if (livewireInstance) { livewireInstance.lat = lat ? lat.toFixed(6) : null; livewireInstance.lng = lng ? lng.toFixed(6) : null; } }; // Inicializar el mapa const initializeMap = (locationInputs, mode = 'create', livewireInstance = null) => { const mapElement = document.getElementById(locationInputs.mapId); if (!mapElement) { console.error(`❌ No se encontró el contenedor del mapa con ID: ${locationInputs.mapId}`); return; } let latElement = document.querySelector(locationInputs.lat); let lngElement = document.querySelector(locationInputs.lng); if (!latElement || !lngElement) { console.error(`❌ No se encontraron los campos de latitud (${locationInputs.lat}) o longitud (${locationInputs.lng})`); return; } let lat = parseFloat(latElement.value); let lng = parseFloat(lngElement.value); const mapCoords = isValidCoordinate(lat, lng) ? [lat, lng] : DEFAULT_COORDS; const zoomLevel = isValidCoordinate(lat, lng) ? 16 : 13; if (mapInstance) destroyMap(); mapInstance = L.map(locationInputs.mapId, getMapOptions(mode)).setView(mapCoords, zoomLevel); L.tileLayer('https://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(mapInstance); if (mode !== 'create') createMarker(lat, lng, mode === 'edit', (lat, lng) => updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance)); if (mode !== 'delete') { mapInstance.on('click', (e) => { const { lat, lng } = e.latlng; removeMarker(); createMarker(lat, lng, true, (lat, lng) => updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance)); updateCoordinates(lat, lng, locationInputs.lat, locationInputs.lng, livewireInstance); }); } /* const btnClearElement = document.querySelector(locationInputs.btnClear); if(!btnClearElement){ console.error(`❌ No se encontró el botón de limpiar con ID: ${locationInputs.btnClear}`);return; } */ }; return { initializeMap, clearCoordinates: () => { removeMarker(); }, }; })(); window.LeafletMapHelper = LeafletMapHelper;