mirror of
https://github.com/stackblitz-labs/bolt.diy
synced 2025-05-01 03:02:15 +00:00
* Update DataTab.tsx ## API Key Import Fix We identified and fixed an issue with the API key import functionality in the DataTab component. The problem was that API keys were being stored in localStorage instead of cookies, and the key format was being incorrectly processed. ### Changes Made: 1. **Updated `handleImportAPIKeys` function**: - Changed to store API keys in cookies instead of localStorage - Modified to use provider names directly as keys (e.g., "OpenAI", "Google") - Added logic to skip comment fields (keys starting with "_") - Added page reload after successful import to apply changes immediately 2. **Updated `handleDownloadTemplate` function**: - Changed template format to use provider names as keys - Added explanatory comment in the template - Removed URL-related keys that weren't being used properly 3. **Fixed template format**: - Template now uses the correct format with provider names as keys - Added support for all available providers including Hyperbolic These changes ensure that when users download the template, fill it with their API keys, and import it back, the keys are properly stored in cookies with the correct format that the application expects. * backwards compatible old import template * Update the export / import settings Settings Export/Import Improvements We've completely redesigned the settings export and import functionality to ensure all application settings are properly backed up and restored: Key Improvements Comprehensive Export Format: Now captures ALL settings from both localStorage and cookies, organized into logical categories (core, providers, features, UI, connections, debug, updates) Robust Import System: Automatically detects format version and handles both new and legacy formats with detailed error handling Complete Settings Coverage: Properly exports and imports settings from ALL tabs including: Local provider configurations (Ollama, LMStudio, etc.) Cloud provider API keys (OpenAI, Anthropic, etc.) Feature toggles and preferences UI configurations and tab settings Connection settings (GitHub, Netlify) Debug configurations and logs Technical Details Added version tracking to export files for better compatibility Implemented fallback mechanisms if primary import methods fail Added detailed logging for troubleshooting import/export issues Created helper functions for safer data handling Maintained backward compatibility with older export formats Feature Settings: Feature flags and viewed features Developer mode settings Energy saver mode configurations User Preferences: User profile information Theme settings Tab configurations Connection Settings: Netlify connections Git authentication credentials Any other service connections Debug and System Settings: Debug flags and acknowledged issues Error logs and event logs Update settings and preferences * Update DataTab.tsx * Update GithubConnection.tsx revert the code back as asked * feat: enhance style to match the project * feat:small improvements * feat: add major improvements * Update Dialog.tsx * Delete DataTab.tsx.bak * feat: small updates * Update DataVisualization.tsx * feat: dark mode fix
141 lines
3.7 KiB
TypeScript
141 lines
3.7 KiB
TypeScript
/**
|
|
* 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<Chat[]> {
|
|
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<Chat | null> {
|
|
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<void> {
|
|
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<void> {
|
|
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<void> {
|
|
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);
|
|
};
|
|
});
|
|
}
|