diff --git a/admin.php b/admin.php index f69d959..eaddc8d 100644 --- a/admin.php +++ b/admin.php @@ -159,6 +159,41 @@ function showAdminInterface() {
Personnalisez le titre et la description de votre galerie.
+ + + + + + diff --git a/fonctions.php b/fonctions.php index 524b777..06ec5fd 100644 --- a/fonctions.php +++ b/fonctions.php @@ -392,4 +392,90 @@ function getSiteConfig() { return $config; } + +/** + * Récupère la dernière version disponible depuis Gitea + * @return array|false Tableau contenant ['version' => 'x.x.x', 'url' => 'url'] ou false en cas d'erreur + */ +function getLatestVersion() { + $ch = curl_init('https://git.crystalyx.net/api/v1/repos/camelia-studio/ICO/tags'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_USERAGENT, 'ICO Gallery Update Checker'); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); + + $response = curl_exec($ch); + $error = curl_error($ch); + curl_close($ch); + + if (!$response) { + error_log("Erreur lors de la vérification des mises à jour : " . $error); + return false; + } + + $tags = json_decode($response, true); + if (!$tags || !is_array($tags)) { + return false; + } + + // Trier les tags par date de création (le plus récent en premier) + usort($tags, function($a, $b) { + return strtotime($b['created_at']) - strtotime($a['created_at']); + }); + + if (empty($tags)) { + return false; + } + + // Récupérer le dernier tag + $latestTag = $tags[0]; + + // Construction de l'URL directe vers le tag sur Gitea + $tagUrl = 'https://git.crystalyx.net/camelia-studio/ICO/releases/tag/' . $latestTag['name']; + + return [ + 'version' => ltrim($latestTag['name'], 'v'), // Enlever le 'v' potentiel du numéro de version + 'url' => $tagUrl // Utiliser l'URL construite manuellement + ]; +} + +/** + * Compare deux numéros de version + * @param string $version1 Premier numéro de version + * @param string $version2 Second numéro de version + * @return int Retourne 1 si version1 > version2, -1 si version1 < version2, 0 si égales + */ +function compareVersions($version1, $version2) { + $v1 = array_map('intval', explode('.', $version1)); + $v2 = array_map('intval', explode('.', $version2)); + + for ($i = 0; $i < 3; $i++) { + $v1[$i] = $v1[$i] ?? 0; + $v2[$i] = $v2[$i] ?? 0; + + if ($v1[$i] > $v2[$i]) return 1; + if ($v1[$i] < $v2[$i]) return -1; + } + + return 0; +} + +/** + * Vérifie si une mise à jour est disponible + * @return array|false ['available' => bool, 'current' => string, 'latest' => string, 'url' => string] ou false + */ +function checkUpdate() { + $currentVersion = trim(file_get_contents(__DIR__ . '/version.txt')); + $latest = getLatestVersion(); + + if (!$latest) { + return false; + } + + return [ + 'available' => compareVersions($latest['version'], $currentVersion) > 0, + 'current' => $currentVersion, + 'latest' => $latest['version'], + 'url' => $latest['url'] + ]; +} ?> \ No newline at end of file diff --git a/styles-admin.css b/styles-admin.css index de3d997..dd97751 100644 --- a/styles-admin.css +++ b/styles-admin.css @@ -407,6 +407,86 @@ body { background-color: #333; } +/* Styles spécifiques pour l'onglet de mise à jour */ +.admin-menu-item.update-available { + position: relative; + overflow: visible; +} + +.admin-menu-item.update-available::after { + content: ""; + position: absolute; + top: -8px; + right: -8px; + width: 16px; + height: 16px; + background-color: #ff8c00; + border-radius: 50%; + border: 2px solid #1e1e1e; + animation: pulse 2s infinite; +} + +.admin-menu-item.disabled { + opacity: 0.5; + cursor: not-allowed; + pointer-events: none; +} + +.admin-menu-item.disabled .menu-icon svg { + stroke: #666; +} + +.admin-menu-item.disabled:hover { + transform: none; + border-color: #333; + box-shadow: none; +} + +/* Styles pour le contenu spécifique à la mise à jour */ +.admin-menu-item .update-status { + margin-top: 1rem; + padding: 1rem; + border-radius: 0.5rem; + background-color: rgba(255, 140, 0, 0.1); + border: 1px solid rgba(255, 140, 0, 0.3); +} + +.admin-menu-item .update-status.no-update { + background-color: rgba(40, 167, 69, 0.1); + border-color: rgba(40, 167, 69, 0.3); +} + +.admin-menu-item .update-info { + display: flex; + align-items: center; + gap: 1rem; + margin-top: 1rem; +} + +.admin-menu-item .version-label { + background-color: rgba(0, 0, 0, 0.2); + padding: 0.25rem 0.75rem; + border-radius: 1rem; + font-size: 0.9rem; +} + +@keyframes pulse { + 0% { + transform: scale(1); + box-shadow: 0 0 0 0 rgba(255, 140, 0, 0.7); + } + + 70% { + transform: scale(1.1); + box-shadow: 0 0 0 10px rgba(255, 140, 0, 0); + } + + 100% { + transform: scale(1); + box-shadow: 0 0 0 0 rgba(255, 140, 0, 0); + } +} + /* Messages */ .message { padding: 1rem;