ajout d'un bouton signalant une nouvelle màj dispo

This commit is contained in:
Esenjin 2025-01-07 14:43:01 +01:00
parent a3a1819eb8
commit a05bbbd43d
3 changed files with 201 additions and 0 deletions

View File

@ -159,6 +159,41 @@ function showAdminInterface() {
<p>Personnalisez le titre et la description de votre galerie.</p>
</div>
</a>
<?php
$updateStatus = checkUpdate();
$updateAvailable = $updateStatus && $updateStatus['available'];
$menuItemClass = 'admin-menu-item' . ($updateAvailable ? ' update-available' : ' disabled');
?>
<?php if ($updateAvailable): ?>
<a href="https://git.crystalyx.net/camelia-studio/ICO/releases/tag/<?php echo htmlspecialchars($updateStatus['latest']); ?>"
class="<?php echo $menuItemClass; ?>"
target="_blank"
rel="noopener noreferrer">
<?php else: ?>
<div class="<?php echo $menuItemClass; ?>">
<?php endif; ?>
<div class="menu-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21.5 14.5v-2.9a1.6 1.6 0 0 0-1.6-1.6H16"></path>
<path d="M16 7V3.6a1.6 1.6 0 0 0-1.6-1.6H3.6A1.6 1.6 0 0 0 2 3.6v16.8a1.6 1.6 0 0 0 1.6 1.6h10.8a1.6 1.6 0 0 0 1.6-1.6V17"></path>
<path d="M17.8 9.2 15 12l2.8 2.8"></path>
<path d="M15 12h6.5"></path>
</svg>
</div>
<div class="menu-content">
<h2>Mise à jour</h2>
<?php if ($updateAvailable): ?>
<div class="update-status">
Version actuelle : <?php echo htmlspecialchars($updateStatus['current']); ?>
Dernière version : <?php echo htmlspecialchars($updateStatus['latest']); ?>
</div>
<?php endif; ?>
</div>
<?php if ($updateAvailable): ?>
</a>
<?php else: ?>
</div>
<?php endif; ?>
</div>
</div>
<?php include 'footer.php'; ?>

View File

@ -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']
];
}
?>

View File

@ -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;