import { useState } from "react" import { Button } from "@/components/ui/button" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Memory } from "@/types" import { exportMemories, parseImportData, downloadFile, ExportOptions } from "@/utils/export" import { Download, Upload, FileText, FileSpreadsheet, File, AlertCircle, CheckCircle } from "lucide-react" interface ExportImportDialogsProps { memories: Memory[] onImportMemories: (memories: Memory[]) => void selectedMemories?: Set showExportDialog: boolean showImportDialog: boolean onExportDialogChange: (open: boolean) => void onImportDialogChange: (open: boolean) => void } export function ExportImportDialogs({ memories, onImportMemories, selectedMemories, showExportDialog, showImportDialog, onExportDialogChange, onImportDialogChange }: ExportImportDialogsProps) { const [exportFormat, setExportFormat] = useState<'json' | 'csv' | 'markdown'>('json') const [includeMetadata, setIncludeMetadata] = useState(true) const [customFilename, setCustomFilename] = useState("") const [importFormat, setImportFormat] = useState<'json' | 'csv'>('json') const [importData, setImportData] = useState("") const [importFile, setImportFile] = useState(null) const [importStatus, setImportStatus] = useState<'idle' | 'success' | 'error'>('idle') const [importError, setImportError] = useState("") const exportFormats = [ { value: 'json', label: 'JSON', icon: File, description: 'Structured data format' }, { value: 'csv', label: 'CSV', icon: FileSpreadsheet, description: 'Spreadsheet format' }, { value: 'markdown', label: 'Markdown', icon: FileText, description: 'Readable text format' } ] const importFormats = [ { value: 'json', label: 'JSON', icon: File }, { value: 'csv', label: 'CSV', icon: FileSpreadsheet } ] const memoriesToExport = selectedMemories && selectedMemories.size > 0 ? memories.filter(memory => selectedMemories.has(memory.id)) : memories const handleExport = () => { const options: ExportOptions = { format: exportFormat, includeMetadata, filename: customFilename || undefined } const { data, filename } = exportMemories(memoriesToExport, options) downloadFile(data, filename, exportFormat === 'csv' ? 'text/csv' : exportFormat === 'markdown' ? 'text/markdown' : 'application/json') onExportDialogChange(false) } const handleFileSelect = (e: React.ChangeEvent) => { const file = e.target.files?.[0] if (file) { setImportFile(file) const reader = new FileReader() reader.onload = (e) => { setImportData(e.target?.result as string) } reader.readAsText(file) } } const handleImport = async () => { try { setImportStatus('idle') setImportError("") if (!importData.trim()) { throw new Error("Please provide data to import") } const parsedMemories = parseImportData(importData, importFormat) if (!Array.isArray(parsedMemories) || parsedMemories.length === 0) { throw new Error("No valid memories found in the import data") } // Assign new IDs to avoid conflicts const newMemories = parsedMemories.map(memory => ({ ...memory, id: Date.now().toString() + Math.random().toString(36).substr(2, 9), timestamp: memory.timestamp || new Date().toISOString() })) await onImportMemories(newMemories) setImportStatus('success') setTimeout(() => { onImportDialogChange(false) setImportData("") setImportFile(null) setImportStatus('idle') }, 2000) } catch (error) { console.error('Import failed:', error) setImportError(error instanceof Error ? error.message : 'Import failed') setImportStatus('error') } } const resetImportDialog = () => { setImportData("") setImportFile(null) setImportStatus('idle') setImportError("") } return ( <> {/* Export Dialog */} Export Memories
{selectedMemories && selectedMemories.size > 0 ? `Exporting ${selectedMemories.size} selected memories` : `Exporting all ${memories.length} memories` }
setIncludeMetadata(e.target.checked)} className="rounded" />
setCustomFilename(e.target.value)} placeholder={`memories-${new Date().toISOString().split('T')[0]}.${exportFormat}`} />
{/* Import Dialog */} { onImportDialogChange(open) if (!open) resetImportDialog() }}> Import Memories
{importFile && (

Selected: {importFile.name}

)}