import React, { useState, useEffect } from 'react'; import { patchesApi } from '../utils/api'; import './EyeCatalog.css'; const EyeCatalog = ({ projectId, selection, feather, onApply, isProcessing, }) => { const [patches, setPatches] = useState([]); const [selectedPatch, setSelectedPatch] = useState(null); const [isUploading, setIsUploading] = useState(false); const [showUpload, setShowUpload] = useState(false); const [uploadName, setUploadName] = useState(''); const [uploadFile, setUploadFile] = useState(null); const [uploadTags, setUploadTags] = useState(''); const [error, setError] = useState(null); // Load patches on mount useEffect(() => { loadPatches(); }, []); const loadPatches = async () => { try { const data = await patchesApi.list('eyes'); setPatches(data); } catch (err) { console.error('Failed to load patches:', err); } }; const handleUpload = async () => { if (!uploadFile || !uploadName.trim()) { setError('Please provide a name and select a file'); return; } try { setIsUploading(true); setError(null); await patchesApi.create(uploadName.trim(), uploadFile, 'eyes', uploadTags); await loadPatches(); setShowUpload(false); setUploadName(''); setUploadFile(null); setUploadTags(''); } catch (err) { setError(`Upload failed: ${err.message}`); } finally { setIsUploading(false); } }; const handleApply = async () => { if (!selectedPatch || !selection || !projectId) { setError('Please select an eye and make a selection on the image'); return; } try { setError(null); await patchesApi.apply(projectId, selectedPatch.id, selection.bbox, feather); onApply(); setSelectedPatch(null); } catch (err) { setError(`Failed to apply: ${err.message}`); } }; const handleDelete = async (patchId) => { if (!window.confirm('Delete this eye from the catalog?')) return; try { await patchesApi.delete(patchId); await loadPatches(); if (selectedPatch?.id === patchId) { setSelectedPatch(null); } } catch (err) { setError(`Delete failed: ${err.message}`); } }; return (

Eye Catalog

{error && (
{error}
)} {showUpload && (
setUploadName(e.target.value)} /> setUploadFile(e.target.files[0])} /> setUploadTags(e.target.value)} />
)}
{patches.length === 0 ? (
No eyes in catalog yet. Click "+ Add Eye" to upload.
) : ( patches.map((patch) => (
setSelectedPatch(patch)} > {patch.name} { e.target.src = patchesApi.getImageUrl(patch.id, false); }} />
{patch.name} {patch.tags && {patch.tags}}
)) )}
{selectedPatch && (
Selected: {selectedPatch.name}

Draw a rectangle/ellipse where you want to place the eye

)}
); }; export default EyeCatalog;