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, DialogTrigger } 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 ExportImportProps { memories: Memory[] onImportMemories: (memories: Memory[]) => void selectedMemories?: Set className?: string } export function ExportImport({ memories, onImportMemories, selectedMemories, className = "" }: ExportImportProps) { const [showExportDialog, setShowExportDialog] = useState(false) const [showImportDialog, setShowImportDialog] = useState(false) 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 = () => { try { const options: ExportOptions = { format: exportFormat, includeMetadata, filename: customFilename || undefined } const result = exportMemories(memoriesToExport, options) downloadFile(result.data, result.filename, result.mimeType) setShowExportDialog(false) } catch (error) { console.error('Export failed:', error) alert(`Export failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } } const handleFileUpload = (event: React.ChangeEvent) => { const file = event.target.files?.[0] if (!file) return setImportFile(file) const reader = new FileReader() reader.onload = (e) => { const content = e.target?.result as string setImportData(content) } reader.readAsText(file) } const handleImport = async () => { if (!importData.trim()) { setImportError("Please provide import data") setImportStatus('error') return } try { setImportStatus('idle') setImportError("") const parsedMemories = parseImportData(importData, importFormat) if (parsedMemories.length === 0) { throw new Error("No valid memories found in 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(() => { setShowImportDialog(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 */} { setShowImportDialog(open) if (!open) resetImportDialog() }}> Import Memories
{importFile && (
Selected: {importFile.name} ({(importFile.size / 1024).toFixed(1)} KB)
)}