import { useState, useEffect, useCallback, useRef } from 'react' import DrawCanvas, { type DrawCanvasHandle } from '../components/DrawCanvas' import Topbar from '../components/Topbar' import { getDirectusPictures, directusAssetUrl, type DirectusPicture, getDirectusObjects, createDirectusObject, updateDirectusObject, deleteDirectusObject, } from '../api' import { useAuth } from '../context/AuthContext' import type { DirectusObject, Selection, CanvasObject } from '../types' const ChevronLeftIcon = () => ( ) const ChevronRightIcon = () => ( ) const TrashIcon = () => ( ) export default function DrawIt() { const { token } = useAuth() const [pictureList, setPictureList] = useState([]) const [currentIndex, setCurrentIndex] = useState(-1) const [objects, setObjects] = useState([]) const [selectedObjectId, setSelectedObjectId] = useState(null) const [currentSelections, setCurrentSelections] = useState([]) const [userNotes, setUserNotes] = useState('') const [parentId, setParentId] = useState(null) const [editingNotes, setEditingNotes] = useState<{ id: string; notes: string } | null>(null) const [mode, setMode] = useState<'rect' | 'polygon'>('polygon') const [hasSelection, setHasSelection] = useState(false) const [saving, setSaving] = useState(false) const [status, setStatus] = useState('') const [statusError, setStatusError] = useState(false) const canvasRef = useRef(null) const currentPicture: DirectusPicture | null = currentIndex >= 0 && currentIndex < pictureList.length ? pictureList[currentIndex] : null // Map DirectusObject → CanvasObject for rendering const canvasObjects: CanvasObject[] = objects.map((obj, i) => ({ id: obj.id, visible: obj.visible !== false, bbox: obj.bbox, polygon: obj.polygon, index: i + 1, hierarchy: 1, })) useEffect(() => { if (!token) return getDirectusPictures(token) .then(pics => { setPictureList(pics); setCurrentIndex(pics.length > 0 ? 0 : -1) }) .catch(console.error) }, [token]) useEffect(() => { if (!currentPicture || !token) { setObjects([]); setSelectedObjectId(null); return } getDirectusObjects(currentPicture.id, token) .then(objs => { setObjects(objs.map(o => ({ ...o, visible: true }))); setSelectedObjectId(null) }) .catch(console.error) }, [currentPicture?.id, token]) const showStatus = (msg: string, isError = false) => { setStatus(msg); setStatusError(isError) } const handleHasSelection = useCallback((has: boolean) => setHasSelection(has), []) const addSelection = () => { const sel = canvasRef.current?.getCurrentSelection() if (!sel) { showStatus('Bitte zuerst einen Bereich auswählen.', true); return } setCurrentSelections(prev => { const next = [...prev, sel]; showStatus(`Auswahl ${next.length} hinzugefügt.`); return next }) canvasRef.current?.resetSelection() setHasSelection(false) } const saveObject = async () => { if (!currentPicture || !token || currentSelections.length === 0) return setSaving(true) try { const first = currentSelections[0] const obj = await createDirectusObject({ picture: currentPicture.id, bbox: first.mode === 'rect' ? (first.bbox ?? null) : null, polygon: first.mode === 'polygon' ? (first.polygon ?? null) : null, selections: currentSelections, user_notes: userNotes.trim() || null, parent: parentId, }, token) setObjects(prev => [...prev, { ...obj, visible: true }]) setCurrentSelections([]) setUserNotes('') setParentId(null) canvasRef.current?.resetSelection() showStatus('Objekt gespeichert.') } catch (e) { showStatus(e instanceof Error ? e.message : 'Fehler beim Speichern.', true) } finally { setSaving(false) } } const saveNoteEdit = async () => { if (!editingNotes || !token) return try { await updateDirectusObject(editingNotes.id, { user_notes: editingNotes.notes }, token) setObjects(prev => prev.map(o => o.id === editingNotes.id ? { ...o, user_notes: editingNotes.notes } : o)) setEditingNotes(null) showStatus('Notizen gespeichert.') } catch (e) { showStatus(e instanceof Error ? e.message : 'Fehler.', true) } } const deleteObject = async (objId: string) => { if (!token) return try { await deleteDirectusObject(objId, token) setObjects(prev => prev.filter(o => o.id !== objId)) if (selectedObjectId === objId) setSelectedObjectId(null) showStatus('Objekt gelöscht.') } catch (e) { showStatus(e instanceof Error ? e.message : 'Fehler beim Löschen.', true) } } const imageNav = ( setCurrentIndex(i => i - 1)} disabled={currentIndex <= 0}> {pictureList.length > 0 ? <>{currentIndex + 1}/{pictureList.length}> : Keine Bilder} setCurrentIndex(i => i + 1)} disabled={currentIndex >= pictureList.length - 1}> ) return ( {/* Left sidebar: saved objects */} {/* Center: Canvas */} {/* Right sidebar: drawing tools */} ) }