{% block javascripts %}
<script src="{{ asset('bundles/tropicielweb/js/vendor/jquery-2.0.0.min.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/cookie.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/tether.min.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/bootstrap/bootstrap.min.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/jquery-file-upload/jquery.ui.widget.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/jquery-ui.min.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/datepicker-pl.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/vendor/handlebars.min-latest.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/main.js') }}"></script>
<script src="{{ asset('bundles/tropicielweb/js/kml.js') }}"></script>
<script>
const mapIdByDomain = {
'tropicielgps.pl': 'f2f24fc576e5624c',
'tropiciel.gps.ovh': '113fa8c9f989a437fac6974e',
'monitoringgps.pl': 'c678a6c60fe797c5bb6b82ec',
'obserwatorgps.pl': '6e32b9d71e7e2915137b168b',
'beta.tropicielgps.pl': '113fa8c9f989a437fac6974e',
};
var currentMapID = mapIdByDomain[window.location.hostname] ?? 'MAP_ID_UNKNOWN';
var jwtToken = "{{ app.session.get('jwt_token')|default('') }}";
var refreshToken = "{{ app.session.get('refresh_token')|default('') }}";
var lang = "{{ app.request.locale }}";
var currentPath = window.location.pathname;
if (!lang) {
lang = "pl";
}
var loginPath = "/" + lang + "/login";
var allowedLoginPaths = ["/pl/login", "/en/login"];
var isOnLoginPage = allowedLoginPaths.some(path => currentPath.startsWith(path));
if (!jwtToken && !isOnLoginPage) {
alert('Brak tokena JWT – zaloguj się ponownie.');
window.location.href = loginPath;
}
function parseJwt(token) {
try {
const base64Url = token.split('.')[1];
const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
return JSON.parse(atob(base64));
} catch (e) {
console.error("Błąd dekodowania JWT:", e);
return null;
}
}
function shouldRefreshToken(token) {
if (isOnLoginPage) return false;
const decoded = parseJwt(token);
if (!decoded || !decoded.exp) {
console.warn("JWT nie zawiera daty wygaśnięcia – odświeżenie wymagane.");
return true;
}
const now = Math.floor(Date.now() / 1000);
const timeLeft = decoded.exp - now;
console.log(`JWT ważny jeszcze przez ${timeLeft} sekund.`);
if (timeLeft < 1200) {
console.log("Token zostanie odświeżony – mniej niż 20 minut do wygaśnięcia.");
return true;
}
return false;
}
async function refreshTokenIfNeeded() {
if ((!jwtToken || !refreshToken) && !isOnLoginPage) {
console.warn("Brak tokenów – przekierowanie do logowania.");
window.location.href = loginPath;
return;
}
if (!jwtToken || !refreshToken) {
return;
}
if (!shouldRefreshToken(jwtToken)) {
return;
}
try {
let response = await fetch(`/${lang}/token/refresh`, {
method: "POST",
headers: {"Content-Type": "application/json"},
body: JSON.stringify({refresh_token: refreshToken})
});
if (response.ok) {
let data = await response.json();
jwtToken = data.token;
refreshToken = data.refresh_token;
localStorage.setItem("access_token", jwtToken);
localStorage.setItem("refresh_token", refreshToken);
document.cookie = "jwt_token=; path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC";
document.cookie = `jwt_token=${jwtToken}; path=/`;
document.cookie = `refresh_token=${refreshToken}; path=/`;
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + jwtToken);
}
});
} else {
console.error("Błąd podczas odświeżania tokena.");
window.location.href = loginPath;
}
} catch (error) {
console.error("Błąd sieci podczas odświeżania tokena:", error);
window.location.href = loginPath;
}
}
setInterval(refreshTokenIfNeeded, 300000);
if (jwtToken) {
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', 'Bearer ' + jwtToken);
}
});
}
refreshTokenIfNeeded();
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
console.log("[refresh] Powrót do zakładki – sprawdzam token...");
refreshTokenIfNeeded();
}
});
</script>
{% endblock %}