<script>
(function() {
'use strict';
const CACHE_ENABLED = true;
const CACHE_HOURS = 24;
const NOCITY_TEXT = 'Ваш город';
const GEO_TIMEOUT = 15000;
function getCachedCity() {
if (!CACHE_ENABLED) return null;
try {
const cached = localStorage.getItem('tildaGeoCity');
if (!cached) return null;
const data = JSON.parse(cached);
const maxAge = CACHE_HOURS * 60 * 60 * 1000;
if (Date.now() - data.timestamp < maxAge) {
console.log('[TildaGeo] Город из кеша:', data.city);
return data.city;
}
localStorage.removeItem('tildaGeoCity');
} catch (e) {
localStorage.removeItem('tildaGeoCity');
}
return null;
}
function setCachedCity(city) {
if (!CACHE_ENABLED || !city) return;
try {
localStorage.setItem('tildaGeoCity', JSON.stringify({
city: city,
timestamp: Date.now()
}));
} catch (e) {}
}
function displayCity(city) {
const text = city || NOCITY_TEXT;
document.querySelectorAll('a[href="#yourcity"]').forEach(function(el) {
el.textContent = text;
});
}
function fetchGeo() {
return new Promise(function(resolve) {
var controller = new AbortController();
var timeoutId = setTimeout(function() {
controller.abort();
}, GEO_TIMEOUT);
fetch('https://geo.tildacdn.com/geo/full/', { signal: controller.signal })
.then(function(response) {
if (timeoutId) clearTimeout(timeoutId);
if (!response || !response.ok) return null;
return response.text();
})
.then(function(text) {
var parsed = text ? JSON.parse(text) : null;
resolve(parsed);
})
.catch(function() {
resolve(null);
});
});
}
function extractCity(data) {
if (!data) return null;
try {
var city = data.city && (data.city.name_ru || data.city.name_en);
if (!city && data.region) {
city = data.region.name_ru || data.region.name_en;
}
return city || null;
} catch (e) {
return null;
}
}
function init() {
var cached = getCachedCity();
if (cached) displayCity(cached);
fetchGeo().then(function(data) {
var city = extractCity(data);
if (city) {
setCachedCity(city);
displayCity(city);
console.log('[TildaGeo] Город:', city);
} else if (!cached) {
displayCity(null);
}
}).catch(function(err) {
console.error('[TildaGeo] Ошибка:', err);
if (!cached) displayCity(null);
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
</script>
<style>
a[href="#yourcity"] {
pointer-events: none;
}
</style>