import { useState } from "react"; import { createAnnotation, createHighlight } from "../api/client"; export default function Composer({ url, selector: initialSelector, onSuccess, onCancel, }) { const [text, setText] = useState(""); const [quoteText, setQuoteText] = useState(""); const [tags, setTags] = useState(""); const [selector, setSelector] = useState(initialSelector); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [showQuoteInput, setShowQuoteInput] = useState(false); const highlightedText = selector?.type === "TextQuoteSelector" ? selector.exact : null; const handleSubmit = async (e) => { e.preventDefault(); if (!text.trim() && !highlightedText && !quoteText.trim()) return; try { setLoading(true); setError(null); let finalSelector = selector; if (!finalSelector && quoteText.trim()) { finalSelector = { type: "TextQuoteSelector", exact: quoteText.trim(), }; } const tagList = tags .split(",") .map((t) => t.trim()) .filter(Boolean); if (!text.trim()) { await createHighlight({ url, selector: finalSelector, color: "yellow", tags: tagList, }); } else { await createAnnotation({ url, text, selector: finalSelector || undefined, tags: tagList, }); } setText(""); setQuoteText(""); setSelector(null); if (onSuccess) onSuccess(); } catch (err) { setError(err.message); } finally { setLoading(false); } }; const handleRemoveSelector = () => { setSelector(null); setQuoteText(""); setShowQuoteInput(false); }; return (
); }