docs.pyserve.org/scripts/version-fetcher.js
Илья Глазунов 58660ec8d4
All checks were successful
Deploy to Production / deploy (push) Successful in 6s
updated documentation
2025-12-08 01:01:45 +03:00

138 lines
4.2 KiB
JavaScript

// Version Fetcher - Displays latest pyserveX version from Gitea API
(function() {
'use strict';
const API_URL = '/api/version';
const VERSION_ELEMENT_ID = 'current-version';
const CACHE_KEY = 'pyserve_version_cache';
const CACHE_DURATION = 3600000; // 1 hour
const FALLBACK_VERSION = '0.9.10';
async function fetchLatestVersion() {
try {
const response = await fetch(API_URL, {
method: 'GET',
headers: {
'Accept': 'application/json'
}
});
if (!response.ok) {
console.warn(`API request failed: ${response.status}`);
return null;
}
const data = await response.json();
if (data.tag_name) {
const version = data.tag_name.replace(/^v/, '');
console.log(`✓ Version fetched from API: ${version}`);
return version;
}
console.warn('tag_name not found in API response');
return null;
} catch (error) {
console.error('API fetch error:', error.message);
return null;
}
}
function getCachedVersion() {
try {
const cached = localStorage.getItem(CACHE_KEY);
if (!cached) return null;
const data = JSON.parse(cached);
const now = Date.now();
if (now - data.timestamp < CACHE_DURATION) {
return data.version;
}
localStorage.removeItem(CACHE_KEY);
return null;
} catch (error) {
console.error('Cache read error:', error);
return null;
}
}
function cacheVersion(version) {
try {
const data = {
version: version,
timestamp: Date.now()
};
localStorage.setItem(CACHE_KEY, JSON.stringify(data));
} catch (error) {
console.error('Cache write error:', error);
}
}
function updateVersionDisplay(version) {
const element = document.getElementById(VERSION_ELEMENT_ID);
if (!element) {
console.warn('Version element not found');
return;
}
const versionLink = document.createElement('a');
versionLink.href = 'https://git.pyserve.org/Shifty/pyserveX/releases/tag/v' + version;
versionLink.textContent = version;
versionLink.target = '_blank';
versionLink.rel = 'noopener noreferrer';
versionLink.className = 'version-link';
element.innerHTML = '';
element.appendChild(versionLink);
const badge = document.createElement('span');
badge.textContent = 'latest';
badge.className = 'version-badge';
badge.title = 'Fetched from Git repository';
element.appendChild(document.createTextNode(' '));
element.appendChild(badge);
element.style.opacity = '1';
}
function showLoadingState() {
const element = document.getElementById(VERSION_ELEMENT_ID);
if (element) {
element.style.opacity = '0.6';
}
}
async function init() {
showLoadingState();
const cachedVersion = getCachedVersion();
if (cachedVersion) {
updateVersionDisplay(cachedVersion);
}
const latestVersion = await fetchLatestVersion();
if (latestVersion) {
cacheVersion(latestVersion);
updateVersionDisplay(latestVersion);
} else if (!cachedVersion) {
const element = document.getElementById(VERSION_ELEMENT_ID);
if (element) {
element.textContent = FALLBACK_VERSION;
element.style.opacity = '1';
element.style.color = '#c9c9c9';
element.title = 'Version fetch failed (CORS or network issue)';
}
}
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();