import React, { useRef, useState } from 'react'; import { Upload, FileText, X, Image as ImageIcon } from 'lucide-react'; import type { FileData } from '../types'; interface SourceInputProps { files: FileData[]; text: string; onFilesChange: (files: FileData[]) => void; onTextChange: (text: string) => void; } const ACCEPT = 'application/pdf,image/png,image/jpeg,image/webp'; function readFile(file: File): Promise { return new Promise((resolve, reject) => { const objectUrl = URL.createObjectURL(file); const reader = new FileReader(); reader.onload = () => { const dataUrl = reader.result as string; const base64 = dataUrl.split(',')[1]; resolve({ file, previewUrl: objectUrl, base64, type: file.type as FileData['type'], }); }; reader.onerror = () => reject(reader.error); reader.readAsDataURL(file); }); } export const SourceInput: React.FC = ({ files, text, onFilesChange, onTextChange, }) => { const inputRef = useRef(null); const [isDragging, setIsDragging] = useState(false); const handleIncoming = async (fileList: FileList | null) => { if (!fileList || fileList.length === 0) return; const incoming: FileData[] = []; for (const f of Array.from(fileList)) { if (!ACCEPT.split(',').includes(f.type)) continue; incoming.push(await readFile(f)); } onFilesChange([...files, ...incoming]); }; const removeAt = (index: number) => { const removed = files[index]; if (removed.previewUrl?.startsWith('blob:')) { URL.revokeObjectURL(removed.previewUrl); } onFilesChange(files.filter((_, i) => i !== index)); }; return (
inputRef.current?.click()} onDragOver={(e) => { e.preventDefault(); setIsDragging(true); }} onDragLeave={() => setIsDragging(false)} onDrop={(e) => { e.preventDefault(); setIsDragging(false); void handleIncoming(e.dataTransfer.files); }} className={`relative border-2 border-dashed rounded-kng-lg p-6 text-center cursor-pointer transition-all duration-200 ${ isDragging ? 'border-kng-accent bg-kng-surface' : 'border-kng-border hover:border-kng-accent hover:bg-kng-surface' }`} > void handleIncoming(e.target.files)} />

Dateien hinzufügen (Klick oder Drop)

Scans, Briefe, Ausweise — PDF oder Bild. Mehrere möglich.

{files.length > 0 && (
    {files.map((f, idx) => (
  • {f.type === 'application/pdf' ? ( ) : ( )}

    {f.file.name}

    {(f.file.size / 1024 / 1024).toFixed(2)} MB

  • ))}
)}