'use client'; import React, { useRef, useState } from 'react'; import { Upload, Loader2, Image as ImageIcon } from 'lucide-react'; import { shrinkImage, shrinkRemoteImage, uploadFile } from '@/lib/upload'; interface ImageUploadInputProps { label?: string; value: string; onChange: (url: string) => void; placeholder?: string; // Voliteľný ručný alt text; prázdny = použije sa automatický (altPlaceholder) altValue?: string; onAltChange?: (alt: string) => void; altPlaceholder?: string; } export const ImageUploadInput: React.FC = ({ label = 'Obrázok', value, onChange, placeholder = 'https://... alebo nahrajte súbor', altValue, onAltChange, altPlaceholder }) => { const fileInputRef = useRef(null); const [isUploading, setIsUploading] = useState(false); const uploadImage = async (file: File) => { setIsUploading(true); try { const small = await shrinkImage(file); onChange(await uploadFile(small, small.name)); } catch (err) { alert(`Chyba pri nahrávaní obrázka: ${(err as Error).message}`); } finally { setIsUploading(false); if (fileInputRef.current) { fileInputRef.current.value = ''; } } }; const handleFileChange = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) uploadImage(file); }; // Vložená URL: príliš veľký obrázok sa zmenší a uloží k nám (posledná spracovaná adresa, aby sa nerobilo dvakrát) const lastCheckedUrl = useRef(''); const [urlNote, setUrlNote] = useState<{ tone: 'ok' | 'warn'; text: string } | null>(null); const checkUrl = async (url: string) => { url = url.trim(); if (!url || url === lastCheckedUrl.current) return; lastCheckedUrl.current = url; setIsUploading(true); setUrlNote(null); try { const result = await shrinkRemoteImage(url); if (result.status === 'shrunk') { lastCheckedUrl.current = result.url; onChange(result.url); setUrlNote({ tone: 'ok', text: 'Obrázok bol väčší ako 1000 px – zmenšili sme ho a uložili k nám.' }); } else if (result.status === 'small') { setUrlNote({ tone: 'ok', text: 'Obrázok je v poriadku (najviac 1000 px), adresa ostáva.' }); } else if (result.status === 'login') { setUrlNote({ tone: 'warn', text: 'Obrázok je za prihlásením – v e-maile sa nezobrazí. Otvorte ho v prehliadači, pravým klikom „Kopírovať obrázok“ a sem vložte Ctrl+V.' }); } else if (result.status === 'failed') { setUrlNote({ tone: 'warn', text: `Obrázok sa nepodarilo stiahnuť (${result.error}). Skontrolujte adresu, prípadne obrázok skopírujte a vložte Ctrl+V.` }); } } catch (err) { setUrlNote({ tone: 'warn', text: `Obrázok sa nepodarilo spracovať: ${(err as Error).message}` }); } finally { setIsUploading(false); } }; const handlePaste = (e: React.ClipboardEvent) => { // obrázok zo schránky (Ctrl+V) → nahrá sa ako súbor const file = [...e.clipboardData.files].find((f) => f.type.startsWith('image/')); if (file) { e.preventDefault(); uploadImage(file); return; } const text = e.clipboardData.getData('text'); if (/^https?:\/\//i.test(text.trim())) setTimeout(() => checkUrl(text), 0); }; return (
{label && }
{/* Náhľad miniatúry */}
{value ? ( Náhľad { (e.target as HTMLElement).style.display = 'none'; }} /> ) : ( )}
{/* Textové pole s URL */} { setUrlNote(null); onChange(e.target.value); }} onKeyDown={(e) => { if (e.key === 'Enter') checkUrl(e.currentTarget.value); }} onPaste={handlePaste} onBlur={(e) => checkUrl(e.target.value)} placeholder={placeholder} className="flex-1 min-w-0 text-xs font-mono border border-gray-300 rounded-lg p-2 bg-white" /> {/* Tlačidlo nahrávania */}
{urlNote && (

{urlNote.text}

)} {onAltChange && ( onAltChange(e.target.value)} placeholder={altPlaceholder ? `Alt text (automaticky: ${altPlaceholder})` : 'Alt text'} title="Alt text obrázka. Ak ho nevyplníte, doplní sa automaticky." className="w-full text-[11px] border border-gray-200 rounded-lg px-2 py-1.5 bg-white placeholder:text-gray-400" /> )}
); };