/** * Functions for managing chat data in IndexedDB */ import type { Message } from 'ai'; import type { IChatMetadata } from './db'; // Import IChatMetadata export interface ChatMessage { id: string; role: 'user' | 'assistant' | 'system'; content: string; timestamp: number; } export interface Chat { id: string; description?: string; messages: Message[]; timestamp: string; urlId?: string; metadata?: IChatMetadata; } /** * Get all chats from the database * @param db The IndexedDB database instance * @returns A promise that resolves to an array of chats */ export async function getAllChats(db: IDBDatabase): Promise { console.log(`getAllChats: Using database '${db.name}', version ${db.version}`); return new Promise((resolve, reject) => { try { const transaction = db.transaction(['chats'], 'readonly'); const store = transaction.objectStore('chats'); const request = store.getAll(); request.onsuccess = () => { const result = request.result || []; console.log(`getAllChats: Found ${result.length} chats in database '${db.name}'`); resolve(result); }; request.onerror = () => { console.error(`getAllChats: Error querying database '${db.name}':`, request.error); reject(request.error); }; } catch (err) { console.error(`getAllChats: Error creating transaction on database '${db.name}':`, err); reject(err); } }); } /** * Get a chat by ID * @param db The IndexedDB database instance * @param id The ID of the chat to get * @returns A promise that resolves to the chat or null if not found */ export async function getChatById(db: IDBDatabase, id: string): Promise { return new Promise((resolve, reject) => { const transaction = db.transaction(['chats'], 'readonly'); const store = transaction.objectStore('chats'); const request = store.get(id); request.onsuccess = () => { resolve(request.result || null); }; request.onerror = () => { reject(request.error); }; }); } /** * Save a chat to the database * @param db The IndexedDB database instance * @param chat The chat to save * @returns A promise that resolves when the chat is saved */ export async function saveChat(db: IDBDatabase, chat: Chat): Promise { return new Promise((resolve, reject) => { const transaction = db.transaction(['chats'], 'readwrite'); const store = transaction.objectStore('chats'); const request = store.put(chat); request.onsuccess = () => { resolve(); }; request.onerror = () => { reject(request.error); }; }); } /** * Delete a chat by ID * @param db The IndexedDB database instance * @param id The ID of the chat to delete * @returns A promise that resolves when the chat is deleted */ export async function deleteChat(db: IDBDatabase, id: string): Promise { return new Promise((resolve, reject) => { const transaction = db.transaction(['chats'], 'readwrite'); const store = transaction.objectStore('chats'); const request = store.delete(id); request.onsuccess = () => { resolve(); }; request.onerror = () => { reject(request.error); }; }); } /** * Delete all chats * @param db The IndexedDB database instance * @returns A promise that resolves when all chats are deleted */ export async function deleteAllChats(db: IDBDatabase): Promise { return new Promise((resolve, reject) => { const transaction = db.transaction(['chats'], 'readwrite'); const store = transaction.objectStore('chats'); const request = store.clear(); request.onsuccess = () => { resolve(); }; request.onerror = () => { reject(request.error); }; }); }