// js/storage.js // Gestion du stockage localStorage pour les conversations class StorageManager { constructor() { this.STORAGE_KEY = 'nixaura_conversations'; this.ACTIVE_KEY = 'nixaura_active_id'; } // Récupérer toutes les conversations getAllConversations() { try { const data = localStorage.getItem(this.STORAGE_KEY); return data ? JSON.parse(data) : []; } catch (e) { console.error('Erreur lecture localStorage:', e); return []; } } // Sauvegarder toutes les conversations saveAllConversations(conversations) { try { localStorage.setItem(this.STORAGE_KEY, JSON.stringify(conversations)); } catch (e) { console.error('Erreur écriture localStorage:', e); } } // Récupérer une conversation par son ID getConversation(id) { const conversations = this.getAllConversations(); return conversations.find(c => c.id === id) || null; } // Ajouter ou mettre à jour une conversation saveConversation(conversation) { const conversations = this.getAllConversations(); const index = conversations.findIndex(c => c.id === conversation.id); if (index >= 0) { conversations[index] = conversation; } else { conversations.push(conversation); } this.saveAllConversations(conversations); } // Supprimer une conversation deleteConversation(id) { let conversations = this.getAllConversations(); conversations = conversations.filter(c => c.id !== id); this.saveAllConversations(conversations); // Si on supprime la conversation active, on réinitialise const activeId = this.getActiveConversationId(); if (activeId === id) { this.setActiveConversationId(null); } } // ID de la conversation active getActiveConversationId() { return localStorage.getItem(this.ACTIVE_KEY) || null; } setActiveConversationId(id) { if (id === null) { localStorage.removeItem(this.ACTIVE_KEY); } else { localStorage.setItem(this.ACTIVE_KEY, id); } } // Créer une nouvelle conversation vide createNewConversation() { const newConv = { id: 'conv_' + Date.now() + '_' + Math.random().toString(36).substr(2, 6), title: 'Nouvelle conversation', messages: [], createdAt: new Date().toISOString(), updatedAt: new Date().toISOString(), }; this.saveConversation(newConv); return newConv; } // Générer un titre à partir du premier message generateTitle(messages) { if (!messages || messages.length === 0) return 'Nouvelle conversation'; const firstMsg = messages.find(m => m.role === 'user'); if (!firstMsg) return 'Nouvelle conversation'; const text = firstMsg.content; // Prendre les premiers mots (max 6) const words = text.split(' ').filter(w => w.length > 0); let title = words.slice(0, 6).join(' '); if (words.length > 6) title += '...'; if (title.length > 40) title = title.substring(0, 40) + '...'; return title || 'Nouvelle conversation'; } } // Instance unique const storage = new StorageManager(); export default storage;