Skip to content

Commit e92007b

Browse files
committed
Gérer les erreurs de quota localStorage et ajouter l’option de nettoyage
Ajoute une gestion robuste pour QuotaExceededError lors de l’enregistrement de grandes images ou paramètres, y compris un mode d’initialisation de secours et une méthode cleanupLocalStorage. Introduit un bouton d’interface utilisateur permettant aux utilisateurs de nettoyer manuellement localStorage, libérant ainsi de l’espace en supprimant les données temporaires et anciennes. Met à jour la version vers 2.4.1 avec une entrée de changelog pour ce correctif.
1 parent 041d7cb commit e92007b

3 files changed

Lines changed: 156 additions & 5 deletions

File tree

contents/js/app.js

Lines changed: 48 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,37 @@ const app = {
298298
}, 100);
299299
},
300300

301+
// Méthode d'initialisation simplifiée en cas d'erreur de quota
302+
initWithDefaults() {
303+
console.log('🔄 Initialisation en mode récupération...');
304+
305+
try {
306+
// Initialisation basique sans accès au localStorage
307+
this.settingsManager = new SettingsManager();
308+
this.pluginManager = new PluginManager();
309+
TabManager.init(this);
310+
311+
// Event listeners essentiels seulement
312+
if (this.commandFormElement) {
313+
this.commandFormElement.addEventListener('submit', this.handleCommandSubmit.bind(this));
314+
}
315+
if (this.commandInputElement) {
316+
this.commandInputElement.addEventListener('keydown', this.handleKeyDown.bind(this));
317+
this.commandInputElement.focus();
318+
}
319+
320+
// Interface basique
321+
this.updatePrompt();
322+
this.initInodeSystem();
323+
324+
console.log('✅ Mode récupération activé - fonctionnalités de base disponibles');
325+
326+
} catch (error) {
327+
console.error('❌ Échec du mode récupération:', error);
328+
throw error;
329+
}
330+
},
331+
301332
// Méthodes pour gérer les commandes désactivées
302333
loadDisabledCommands() {
303334
try {
@@ -8924,8 +8955,7 @@ ${isSupported && permission === 'denied' ? '<span class="text-red-400">⚠️ Pe
89248955
// Utiliser le système unifié de sauvegarde
89258956
this.applySetting('console_bg_type', 'image');
89268957
this.applySetting('console_bg_image_url', value);
8927-
// Sauvegarde la dernière image utilisée pour compatibilité
8928-
localStorage.setItem('console_bg_last_image', value);
8958+
// Note: console_bg_last_image sera nettoyé par le système de cleanup
89298959
}
89308960
},
89318961
loadConsoleBackground() {
@@ -12111,5 +12141,21 @@ document.addEventListener('DOMContentLoaded', function () {
1211112141
console.log('App initialized successfully');
1211212142
} catch (error) {
1211312143
console.error('Error initializing app:', error);
12144+
12145+
// Gestion spécifique des erreurs de quota localStorage
12146+
if (error.name === 'QuotaExceededError') {
12147+
console.log('Tentative de nettoyage du localStorage pour résoudre l\'erreur de quota...');
12148+
try {
12149+
// Nettoyer le localStorage et réessayer
12150+
if (app.settingsManager) {
12151+
app.settingsManager.cleanupLocalStorage();
12152+
}
12153+
// Réessayer l'initialisation avec des paramètres par défaut
12154+
app.initWithDefaults();
12155+
} catch (retryError) {
12156+
console.error('Impossible de récupérer après l\'erreur de quota:', retryError);
12157+
alert('Erreur de stockage détectée. L\'application fonctionnera avec des paramètres par défaut pour cette session.');
12158+
}
12159+
}
1211412160
}
1211512161
});

contents/js/assets/settings-manager.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,16 +107,72 @@ export class SettingsManager {
107107

108108
// --- Core Settings Functions ---
109109
applySetting(key, value) {
110+
// Pour les URLs d'images très longues, les limiter
111+
if (key === 'console_bg_image_url' && typeof value === 'string' && value.length > 50000) {
112+
console.warn('URL d\'image trop longue, stockage en mémoire uniquement');
113+
this.settings[key] = value;
114+
return false;
115+
}
116+
110117
try {
111118
localStorage.setItem(key, JSON.stringify(value));
112119
this.settings[key] = value;
113120
return true;
114121
} catch (error) {
115122
console.warn('Erreur sauvegarde localStorage:', error);
123+
124+
// Si c'est une erreur de quota, essayer de nettoyer l'espace
125+
if (error.name === 'QuotaExceededError') {
126+
console.log('Quota localStorage dépassé, tentative de nettoyage...');
127+
this.cleanupLocalStorage();
128+
129+
// Essayer à nouveau après le nettoyage
130+
try {
131+
localStorage.setItem(key, JSON.stringify(value));
132+
this.settings[key] = value;
133+
console.log('Sauvegarde réussie après nettoyage');
134+
return true;
135+
} catch (secondError) {
136+
console.error('Impossible de sauvegarder même après nettoyage:', secondError);
137+
// En cas d'échec, stocker uniquement en mémoire
138+
this.settings[key] = value;
139+
return false;
140+
}
141+
}
116142
return false;
117143
}
118144
}
119145

146+
// --- Fonction de nettoyage du localStorage ---
147+
cleanupLocalStorage() {
148+
try {
149+
// Nettoyer les anciennes images de fond
150+
const keysToRemove = [];
151+
for (let i = 0; i < localStorage.length; i++) {
152+
const key = localStorage.key(i);
153+
if (key && (key.includes('console_bg_last_image') ||
154+
key.includes('temp_') ||
155+
key.includes('cache_') ||
156+
key.includes('_old') ||
157+
key.includes('backup_'))) {
158+
keysToRemove.push(key);
159+
}
160+
}
161+
162+
// Supprimer les clés identifiées
163+
keysToRemove.forEach(key => {
164+
localStorage.removeItem(key);
165+
console.log('Supprimé du localStorage:', key);
166+
});
167+
168+
console.log(`Nettoyage terminé: ${keysToRemove.length} éléments supprimés`);
169+
return keysToRemove.length;
170+
} catch (error) {
171+
console.error('Erreur lors du nettoyage du localStorage:', error);
172+
return 0;
173+
}
174+
}
175+
120176
getSetting(key, defaultValue = null) {
121177
if (this.settings[key] !== undefined) {
122178
return this.settings[key];
@@ -618,6 +674,14 @@ export class SettingsManager {
618674
Importer
619675
</button>
620676
</div>
677+
<div class="mt-4">
678+
<button id="cleanup-storage-btn" class="w-full flex items-center justify-center px-4 py-3 bg-yellow-500/20 text-yellow-400 border border-yellow-500/30 rounded-lg hover:bg-yellow-500/30 transition-colors">
679+
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
680+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path>
681+
</svg>
682+
Nettoyer le stockage local
683+
</button>
684+
</div>
621685
</div>
622686
</div>`;
623687
}
@@ -635,6 +699,41 @@ export class SettingsManager {
635699
if (importBtn) {
636700
importBtn.addEventListener('click', () => this.importSettings());
637701
}
702+
703+
// Nettoyage du stockage local
704+
const cleanupBtn = document.getElementById('cleanup-storage-btn');
705+
if (cleanupBtn) {
706+
cleanupBtn.addEventListener('click', () => this.cleanupStorageWithConfirmation());
707+
}
708+
}
709+
710+
// Nettoyage avec confirmation utilisateur
711+
cleanupStorageWithConfirmation() {
712+
if (confirm('⚠️ Êtes-vous sûr de vouloir nettoyer le stockage local ?\n\nCela supprimera les anciennes données temporaires et peut résoudre les problèmes de quota de stockage.\n\nVos paramètres principaux seront préservés.')) {
713+
const itemsRemoved = this.cleanupLocalStorage();
714+
715+
// Feedback visuel
716+
const cleanupBtn = document.getElementById('cleanup-storage-btn');
717+
if (cleanupBtn) {
718+
const originalText = cleanupBtn.innerHTML;
719+
cleanupBtn.innerHTML = `
720+
<svg class="w-4 h-4 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
721+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path>
722+
</svg>
723+
Nettoyage effectué (${itemsRemoved} éléments)
724+
`;
725+
cleanupBtn.classList.add('bg-green-500/20', 'text-green-400', 'border-green-500/30');
726+
cleanupBtn.classList.remove('bg-yellow-500/20', 'text-yellow-400', 'border-yellow-500/30');
727+
728+
setTimeout(() => {
729+
cleanupBtn.innerHTML = originalText;
730+
cleanupBtn.classList.remove('bg-green-500/20', 'text-green-400', 'border-green-500/30');
731+
cleanupBtn.classList.add('bg-yellow-500/20', 'text-yellow-400', 'border-yellow-500/30');
732+
}, 3000);
733+
}
734+
735+
alert(`✅ Nettoyage terminé !\n\n${itemsRemoved} éléments temporaires ont été supprimés.\nL'espace de stockage a été libéré.`);
736+
}
638737
}
639738

640739
exportSettings() {

version.json

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
{
2-
"version": "2.4.0",
3-
"date": "2025-09-03",
4-
"changelog": "Ajout des I-Nodes pour un meilleur files system",
2+
"version": "2.4.1",
3+
"date": "2025-09-05",
4+
"changelog": "Ajout Fix QuotaExceededError pour les images de fond",
55
"history": [
6+
{
7+
"version": "2.4.1",
8+
"date": "2025-09-05",
9+
"changelog": "Ajout Fix QuotaExceededError pour les images de fond",
10+
"type": "patch"
11+
},
612
{
713
"version": "2.4.0",
814
"date": "2025-09-03",

0 commit comments

Comments
 (0)