'use client' import { useEffect, useRef, useState } from 'react' import TagSelector from '@/components/tags/TagSelector' interface Props { url: string name: string onClose: () => void onPrev?: () => void onNext?: () => void itemKey?: string onTagsChanged?: () => void onAiTag?: () => Promise } export default function ImageLightbox({ url, name, onClose, onPrev, onNext, itemKey, onTagsChanged, onAiTag }: Props) { const overlayRef = useRef(null) const [showTags, setShowTags] = useState(false) const [aiTagging, setAiTagging] = useState(false) const [aiTagError, setAiTagError] = useState(null) const [tagRefreshKey, setTagRefreshKey] = useState(0) // Text extraction state const [extractedText, setExtractedText] = useState(null) const [translatedText, setTranslatedText] = useState(null) const [extracting, setExtracting] = useState(false) const [extractError, setExtractError] = useState(null) const [retranslating, setRetranslating] = useState(false) // Text overlay state const [showTextOverlay, setShowTextOverlay] = useState(false) const [showOriginal, setShowOriginal] = useState(false) // Determine if this is an image file (for text extraction controls) const isImage = /\.(jpe?g|png|gif|webp|bmp|tiff?)$/i.test(name) // Derived: what text to display in the overlay const displayText = (translatedText && !showOriginal) ? translatedText : extractedText // Fetch existing AI fields on mount / item change useEffect(() => { if (!itemKey) return fetch(`/api/ai-tagging/fields?itemKey=${encodeURIComponent(itemKey)}`) .then((r) => r.json()) .then((data: { extractedText: string | null; extractedTextTranslated: string | null }) => { setExtractedText(data.extractedText) setTranslatedText(data.extractedTextTranslated) }) .catch(() => {}) }, [itemKey]) useEffect(() => { const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose() if (e.key === 'ArrowLeft') onPrev?.() if (e.key === 'ArrowRight') onNext?.() } document.addEventListener('keydown', handleKey) document.body.style.overflow = 'hidden' return () => { document.removeEventListener('keydown', handleKey) document.body.style.overflow = '' } }, [onClose, onPrev, onNext]) const handleOverlayClick = (e: React.MouseEvent) => { if (e.target === overlayRef.current) onClose() } return (
{/* Toolbar */}
{name}
{/* Text overlay button — only shown when extracted text exists */} {extractedText && ( )} {itemKey && ( )} {onAiTag && ( )}
{showTags ? (
{/* Image */}
{/* eslint-disable-next-line @next/next/no-img-element */} {name} e.stopPropagation()} /> {onPrev && ( )} {onNext && ( )} {/* Text overlay */} {showTextOverlay && displayText && (
e.stopPropagation()} > {extractedText && translatedText && (
)}

{displayText}

)}
{/* Tag panel */}
e.stopPropagation()} >

Tags

{/* Text extraction section — only for images */} {isImage && (

Text Extraction

{extractError && (

{extractError}

)} {extractedText && (

Extracted Text

                        {extractedText}
                      
{translatedText && (

Translation

                          {translatedText}
                        
)}
)}
)}
) : (
{/* eslint-disable-next-line @next/next/no-img-element */} {name} e.stopPropagation()} /> {onPrev && ( )} {onNext && ( )} {/* Text overlay */} {showTextOverlay && displayText && (
e.stopPropagation()} > {extractedText && translatedText && (
)}

{displayText}

)}
)}
) }