import React, { useState, useRef, useCallback } from 'react'; import { Modal } from '@/components/ui/Modal'; import { Button } from '@/components/ui/Button'; import { useToast } from '@/components/ui/Toast'; import { useCompanyImport } from '@/api/hooks'; import { useTranslation } from 'react-i18next'; export interface CsvImportDialogProps { open: boolean; onClose: () => void; onSuccess?: () => void; } interface ParsedRow { [key: string]: string; } function parseCSV(text: string): { headers: string[]; rows: ParsedRow[] } { const lines = text.trim().split(/\n/); if (lines.length === 0) return { headers: [], rows: [] }; const headers = lines[0].split(',').map((h) => h.trim()); const rows: ParsedRow[] = []; for (let i = 1; i < lines.length; i++) { if (!lines[i].trim()) continue; const values = lines[i].split(',').map((v) => v.trim()); const row: ParsedRow = {}; headers.forEach((header, idx) => { row[header] = values[idx] || ''; }); rows.push(row); } return { headers, rows }; } export function CsvImportDialog({ open, onClose, onSuccess }: CsvImportDialogProps) { const { t } = useTranslation(); const toast = useToast(); const importMutation = useCompanyImport(); const fileInputRef = useRef(null); const [selectedFile, setSelectedFile] = useState(null); const [previewData, setPreviewData] = useState<{ headers: string[]; rows: ParsedRow[] } | null>(null); const [error, setError] = useState(null); const handleFileSelect = useCallback((e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (!file) return; if (!file.name.endsWith('.csv')) { setError('Bitte wählen Sie eine CSV-Datei aus.'); return; } setError(null); setSelectedFile(file); const reader = new FileReader(); reader.onload = (event) => { const text = event.target?.result as string; const parsed = parseCSV(text); setPreviewData(parsed); }; reader.readAsText(file); }, []); const handleImport = async () => { if (!selectedFile) return; try { await importMutation.mutateAsync(selectedFile); toast.success('Import erfolgreich abgeschlossen.'); setSelectedFile(null); setPreviewData(null); setError(null); onSuccess?.(); onClose(); } catch (err: any) { toast.error(err.message || 'Import fehlgeschlagen.'); } }; const handleClose = () => { setSelectedFile(null); setPreviewData(null); setError(null); onClose(); }; return (

Wählen Sie eine CSV-Datei mit Firmendaten. Erforderliche Spalte: name. Optionale Spalten: account_number, industry, phone, email, website, description.

{error &&

{error}

}
{previewData && previewData.rows.length > 0 && (

Vorschau ({previewData.rows.length} Datensätze)

{previewData.headers.map((header) => ( ))} {previewData.rows.slice(0, 10).map((row, idx) => ( {previewData.headers.map((header) => ( ))} ))}
{header}
{row[header]}
{previewData.rows.length > 10 && (

Zeige 10 von {previewData.rows.length} Datensätzen.

)}
)}
); }