// src/js/map.js
/**
* Hämtar koordinater för en given plats via Nominatim API
* @async
* @param {string} query - Platsnamn att söka efter
* @returns {Promise<{lat: number, lon: number}>} Objekt med latitud och longitud
*/
async function fetchCoordinates(query) {
try {
const url = `https://nominatim.openstreetmap.org/search?format=json&q=${encodeURIComponent(query)}`;
const response = await fetch(url);
if (!response.ok) throw new Error('HTTP error ' + response.status);
const data = await response.json();
if (data.length === 0) throw new Error('Inga resultat för platsen');
return { lat: parseFloat(data[0].lat), lon: parseFloat(data[0].lon) };
} catch (error) {
console.error('Kunde inte hämta koordinater:', error);
return null;
}
}
/**
* Initierar Leaflet-kartan
* @param {number} lat - Startlatitud
* @param {number} lon - Startlongitud
* @param {number} zoom - Zoomnivå
* @returns {L.Map} Leaflet-kartobjekt
*/
function initMap(lat = 59.8586, lon = 17.6389, zoom = 13) {
const map = L.map('map').setView([lat, lon], zoom);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap contributors'
}).addTo(map);
return map;
}
/**
* Lägger till markör på kartan
* @param {L.Map} map - Leaflet-kartobjekt
* @param {number} lat - Latitud
* @param {number} lon - Longitud
* @param {string} [popupText] - Text som visas i popup
* @returns {L.Marker} Markörobjekt
*/
function addMarker(map, lat, lon, popupText = '') {
const marker = L.marker([lat, lon]).addTo(map);
if (popupText) marker.bindPopup(popupText).openPopup();
return marker;
}
/**
* Hämtar användarens position via webbläsarens geolokalisering
* @param {function({lat:number, lon:number}):void} callback - Funktion som körs vid lyckad position
*/
function getUserLocation(callback) {
if ('geolocation' in navigator) {
navigator.geolocation.getCurrentPosition(
(position) => {
callback({
lat: position.coords.latitude,
lon: position.coords.longitude
});
},
(error) => console.error('Kunde inte hämta användarens position:', error)
);
} else {
console.error('Geolokalisering stöds inte i denna webbläsare');
}
}
// === INITIERA KARTA ===
document.addEventListener('DOMContentLoaded', () => {
// Starta karta med standardposition (Mittuniversitetet, Sundsvall)
const map = initMap(62.3908, 17.3069, 13);
// Om användarens position finns, visa den
getUserLocation(({ lat, lon }) => {
map.setView([lat, lon], 13);
addMarker(map, lat, lon, 'Din plats');
});
// Koppla sök-knapp
const searchBtn = document.getElementById('searchBtn');
const searchInput = document.getElementById('searchInput');
searchBtn.addEventListener('click', async () => {
const query = searchInput.value.trim();
if (!query) return;
const coords = await fetchCoordinates(query);
if (coords) {
map.setView([coords.lat, coords.lon], 13);
addMarker(map, coords.lat, coords.lon, query);
}
});
});