import { useCallback, useState } from 'react' import type { FormEvent } from 'react' import { scrapeAndIndex } from '../api/client.ts' import { useSession } from '../context/SessionContext.tsx' import { useToast } from './shared/Toast.tsx' import Loading from './shared/Loading.tsx' import './web.css' interface WebImportViewProps { onIndexed: () => void } export default function WebImportView({ onIndexed }: WebImportViewProps) { const [url, setUrl] = useState('') const [isSubmitting, setIsSubmitting] = useState(false) const [result, setResult] = useState<{ message: string; type: 'success' | 'error' } | null>(null) const { sessionId } = useSession() const { showToast } = useToast() const handleSubmit = useCallback( async (e: FormEvent) => { e.preventDefault() if (!url.trim()) return setIsSubmitting(true) setResult(null) try { const res = await scrapeAndIndex({ url: url.trim(), session_id: sessionId }) setResult({ message: res.message, type: 'success' }) showToast(res.message, 'success') setUrl('') onIndexed() } catch (err) { const message = err instanceof Error ? err.message : 'Scraping failed' setResult({ message, type: 'error' }) showToast(message, 'error') } finally { setIsSubmitting(false) } }, [url, sessionId, showToast, onIndexed], ) return (

Import from Web

Extract and index content from any webpage

đź”— setUrl(e.target.value)} required />
{result && (
{result.message}
)}
) }