|
import type { Message } from 'ai'; |
|
import { toast } from 'react-toastify'; |
|
import { ImportFolderButton } from '~/components/chat/ImportFolderButton'; |
|
import { Button } from '~/components/ui/Button'; |
|
import { classNames } from '~/utils/classNames'; |
|
|
|
type ChatData = { |
|
messages?: Message[]; |
|
description?: string; |
|
}; |
|
|
|
export function ImportButtons(importChat: ((description: string, messages: Message[]) => Promise<void>) | undefined) { |
|
return ( |
|
<div className="flex flex-col items-center justify-center w-auto"> |
|
<input |
|
type="file" |
|
id="chat-import" |
|
className="hidden" |
|
accept=".json" |
|
onChange={async (e) => { |
|
const file = e.target.files?.[0]; |
|
|
|
if (file && importChat) { |
|
try { |
|
const reader = new FileReader(); |
|
|
|
reader.onload = async (e) => { |
|
try { |
|
const content = e.target?.result as string; |
|
const data = JSON.parse(content) as ChatData; |
|
|
|
// Standard format |
|
if (Array.isArray(data.messages)) { |
|
await importChat(data.description || 'Imported Chat', data.messages); |
|
toast.success('Chat imported successfully'); |
|
|
|
return; |
|
} |
|
|
|
toast.error('Invalid chat file format'); |
|
} catch (error: unknown) { |
|
if (error instanceof Error) { |
|
toast.error('Failed to parse chat file: ' + error.message); |
|
} else { |
|
toast.error('Failed to parse chat file'); |
|
} |
|
} |
|
}; |
|
reader.onerror = () => toast.error('Failed to read chat file'); |
|
reader.readAsText(file); |
|
} catch (error) { |
|
toast.error(error instanceof Error ? error.message : 'Failed to import chat'); |
|
} |
|
e.target.value = ''; // Reset file input |
|
} else { |
|
toast.error('Something went wrong'); |
|
} |
|
}} |
|
/> |
|
<div className="flex flex-col items-center gap-4 max-w-2xl text-center"> |
|
<div className="flex gap-2"> |
|
<Button |
|
onClick={() => { |
|
const input = document.getElementById('chat-import'); |
|
input?.click(); |
|
}} |
|
variant="outline" |
|
size="lg" |
|
className={classNames( |
|
'gap-2 bg-[#F5F5F5] dark:bg-[#252525]', |
|
'text-bolt-elements-textPrimary dark:text-white', |
|
'hover:bg-[#E5E5E5] dark:hover:bg-[#333333]', |
|
'border-[#E5E5E5] dark:border-[#333333]', |
|
'h-10 px-4 py-2 min-w-[120px] justify-center', |
|
'transition-all duration-200 ease-in-out', |
|
)} |
|
> |
|
<span className="i-ph:upload-simple w-4 h-4" /> |
|
Import Chat |
|
</Button> |
|
<ImportFolderButton |
|
importChat={importChat} |
|
className={classNames( |
|
'gap-2 bg-[#F5F5F5] dark:bg-[#252525]', |
|
'text-bolt-elements-textPrimary dark:text-white', |
|
'hover:bg-[#E5E5E5] dark:hover:bg-[#333333]', |
|
'border border-[#E5E5E5] dark:border-[#333333]', |
|
'h-10 px-4 py-2 min-w-[120px] justify-center', |
|
'transition-all duration-200 ease-in-out rounded-lg', |
|
)} |
|
/> |
|
</div> |
|
</div> |
|
</div> |
|
); |
|
} |
|
|