// 🌙 宵夜地圖 - 獨立 JS
const STORAGE_KEY = 'hesheeat_nightsnack';
let map;
let markers = [];
let shops = [];
// 初始化
document.addEventListener('DOMContentLoaded', () => {
initMap();
loadShops();
renderShops();
});
function initMap() {
map = L.map('map').setView([22.3193, 114.1694], 13);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© OpenStreetMap'
}).addTo(map);
// 嘗試獲取用戶位置
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(pos => {
map.setView([pos.coords.latitude, pos.coords.longitude], 15);
L.marker([pos.coords.latitude, pos.coords.longitude])
.addTo(map)
.bindPopup('📍 你的位置')
.openPopup();
});
}
}
function loadShops() {
try {
shops = JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];
} catch { shops = []; }
}
function saveShops() {
localStorage.setItem(STORAGE_KEY, JSON.stringify(shops));
}
function renderShops(filter = 'all') {
const list = document.getElementById('shopList');
const filtered = filter === 'all' ? shops : shops.filter(s => s.category === filter);
// 清除舊 markers
markers.forEach(m => map.removeLayer(m));
markers = [];
if (filtered.length === 0) {
list.innerHTML = '
暫無食店資料
點擊右上角「新增食店」添加
';
return;
}
list.innerHTML = filtered.map(shop => {
// 添加 marker
if (shop.lat && shop.lng) {
const marker = L.marker([shop.lat, shop.lng])
.addTo(map)
.bindPopup(`${shop.name}
${shop.category}
評分: ${shop.rating}/5`);
markers.push(marker);
}
const navLinks = generateNavLinks(shop.lat, shop.lng, shop.name);
return `
📍 ${shop.address || '未提供'}
🚗 ${shop.parking}
${shop.recommendFood ? `
🍴 推薦:${shop.recommendFood}
` : ''}
${shop.review ? `
"${shop.review}"
` : ''}
${navLinks}
`;
}).join('');
}
function generateNavLinks(lat, lng, name) {
if (!lat || !lng) return '';
const encodedName = encodeURIComponent(name || '宵夜店');
return `
🗺️ Google
📍 高德
🚗 Waze
🗺️ 百度
`;
}
function filterShops(category) {
document.querySelectorAll('.filter-btn').forEach(btn => btn.classList.remove('active'));
event.target.classList.add('active');
renderShops(category);
}
function openModal() {
document.getElementById('addModal').classList.add('show');
}
function closeModal() {
document.getElementById('addModal').classList.remove('show');
}
// 提交表單
document.getElementById('shopForm').addEventListener('submit', (e) => {
e.preventDefault();
const shop = {
id: Date.now(),
name: document.getElementById('shopName').value,
category: document.getElementById('shopCategory').value,
rating: parseFloat(document.getElementById('shopRating').value) || 4,
openTime: document.getElementById('openTime').value,
closeTime: document.getElementById('closeTime').value,
address: document.getElementById('shopAddress').value,
lat: parseFloat(document.getElementById('shopLat').value) || null,
lng: parseFloat(document.getElementById('shopLng').value) || null,
recommendFood: document.getElementById('recommendFood').value,
parking: document.getElementById('parking').value,
review: document.getElementById('shopReview').value,
created: new Date().toISOString()
};
shops.push(shop);
saveShops();
renderShops();
closeModal();
// 清空表單
document.getElementById('shopForm').reset();
document.getElementById('shopRating').value = '4';
alert('✅ 新增成功!');
});