mirror of
https://github.com/stackblitz/bolt.new
synced 2025-02-06 04:48:04 +00:00
47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
import type { Message } from 'ai';
|
|
import { toast } from 'react-toastify';
|
|
|
|
export interface ChatExportData {
|
|
messages: Message[];
|
|
description?: string;
|
|
exportDate: string;
|
|
}
|
|
|
|
export const exportChat = (messages: Message[], description?: string) => {
|
|
const chatData: ChatExportData = {
|
|
messages,
|
|
description,
|
|
exportDate: new Date().toISOString(),
|
|
};
|
|
|
|
const blob = new Blob([JSON.stringify(chatData, null, 2)], { type: 'application/json' });
|
|
const url = URL.createObjectURL(blob);
|
|
const a = document.createElement('a');
|
|
a.href = url;
|
|
a.download = `chat-${new Date().toISOString()}.json`;
|
|
document.body.appendChild(a);
|
|
a.click();
|
|
document.body.removeChild(a);
|
|
URL.revokeObjectURL(url);
|
|
};
|
|
|
|
export const importChat = async (file: File): Promise<ChatExportData> => {
|
|
return new Promise((resolve, reject) => {
|
|
const reader = new FileReader();
|
|
reader.onload = (e) => {
|
|
try {
|
|
const content = e.target?.result as string;
|
|
const data = JSON.parse(content);
|
|
if (!Array.isArray(data.messages)) {
|
|
throw new Error('Invalid chat file format');
|
|
}
|
|
resolve(data);
|
|
} catch (error) {
|
|
reject(new Error('Failed to parse chat file'));
|
|
}
|
|
};
|
|
reader.onerror = () => reject(new Error('Failed to read chat file'));
|
|
reader.readAsText(file);
|
|
});
|
|
};
|