import React, { useEffect, useRef, useState } from 'react'; import { Camera, ImagePlus, Link as LinkIcon, Loader2, X } from 'lucide-react'; import { copyExternalImage, prepareImage, UploadedMedia, uploadMedia } from '../../lib/media'; interface ImagePickerProps { docId: string; onDone: (media: UploadedMedia) => void; onCancel: () => void; } // Inline box an empty bullet turns into after /bild: pick a file (or the camera on phones), drop or // paste an image, or give a link the server copies. Nothing is synced until the upload succeeded. export const ImagePicker: React.FC = ({ docId, onDone, onCancel }) => { const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [dragOver, setDragOver] = useState(false); const [url, setUrl] = useState(''); const fileRef = useRef(null); const cameraRef = useRef(null); const boxRef = useRef(null); useEffect(() => { boxRef.current?.focus(); }, []); const uploadFile = async (file: File | Blob | null | undefined) => { if (!file || busy) return; if (file.type && !file.type.startsWith('image/')) { setError('Bitte eine Bilddatei wählen'); return; } setBusy(true); setError(null); try { const { blob, name } = await prepareImage(file); onDone(await uploadMedia(docId, blob, name)); } catch (err: any) { setError(err?.message || 'Hochladen fehlgeschlagen'); setBusy(false); } }; const copyLink = async (e?: React.FormEvent) => { e?.preventDefault(); const target = url.trim(); if (!target || busy) return; setBusy(true); setError(null); try { onDone(await copyExternalImage(docId, target)); } catch (err: any) { setError(err?.message || 'Bild konnte nicht übernommen werden'); setBusy(false); } }; return (
{ if (e.key === 'Escape') { e.preventDefault(); onCancel(); } }} onPaste={(e) => { const item = Array.from(e.clipboardData.items).find((i) => i.type.startsWith('image/')); if (item) { e.preventDefault(); void uploadFile(item.getAsFile()); } }} onDragOver={(e) => { e.preventDefault(); setDragOver(true); }} onDragLeave={() => setDragOver(false)} onDrop={(e) => { e.preventDefault(); setDragOver(false); void uploadFile(e.dataTransfer.files?.[0]); }} className={ dragOver ? 'my-1 p-3 rounded-card border-2 border-dashed border-accent bg-accent-dim space-y-3 focus:outline-none' : 'my-1 p-3 rounded-card border-2 border-dashed border-border bg-panel space-y-3 focus:outline-none' } >
Bild einfügen
{busy ? (
Wird hochgeladen…
) : ( <>
oder hierher ziehen bzw. mit Strg+V einfügen
setUrl(e.target.value)} placeholder="https://… Bild-Link" className="w-full h-11 sm:h-8 pl-8 pr-2 input-field text-xs" />
)} {error &&

{error}

} void uploadFile(e.target.files?.[0])} /> void uploadFile(e.target.files?.[0])} />
); };