@@ -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 ( ) {
0 commit comments