import { useState } from 'react'; import { FileText, Loader2, Sparkles, AlertCircle } from 'lucide-react'; import { useAuth } from '../context/AuthContext'; const API_BASE = import.meta.env.VITE_API_BASE || 'https://yahyoha-omnidiag.hf.space'; /** * Textarea that parses free-text clinical notes and pre-fills the parent form. * * Props: * onExtracted — (mappedFields: object) => void * Called with disease-mapped feature names so the parent * can merge them directly into patient.data. * disease — string (e.g. "heart_disease", "diabetes") passed to backend * so it returns schema-keyed mapped_features. */ export default function ClinicalNotesInput({ onExtracted, disease }) { const { token } = useAuth(); const [note, setNote] = useState(''); const [loading, setLoading] = useState(false); const [result, setResult] = useState(null); const [error, setError] = useState(''); async function handleParse() { if (!note.trim()) return; setLoading(true); setError(''); setResult(null); try { const res = await fetch(`${API_BASE}/api/v4/parse-notes`, { method: 'POST', headers: { 'Content-Type': 'application/json', ...(token ? { Authorization: `Bearer ${token}` } : {}), }, body: JSON.stringify({ note, disease: disease || null, use_bert: false }), }); if (!res.ok) { const body = await res.json().catch(() => ({})); throw new Error(body?.detail || res.statusText); } const data = await res.json(); setResult(data); if (onExtracted) { const fields = Object.keys(data.mapped_features || {}).length > 0 ? data.mapped_features : data.extracted_features; onExtracted(fields); } } catch (err) { setError(err.message || 'Failed to parse note'); } finally { setLoading(false); } } return (