import React, { useState } from "react"; import { api } from "../api.js"; import { Modal } from "../ui.jsx"; export function BookSearchDialog({ materialId, open, onOpenChange, onPage, notify, }) { const [query, setQuery] = useState(""), [results, setResults] = useState([]), [searching, setSearching] = useState(false); async function search(event) { event.preventDefault(); setSearching(true); try { setResults( await api( `/materials/${materialId}/search?q=${encodeURIComponent(query)}`, ), ); } catch (error) { notify(error.message, "error"); } finally { setSearching(false); } } return (
setQuery(event.target.value)} placeholder="A phrase or concept…" aria-label="Book search" required />
{results.map((result) => ( ))}
{query && !results.length && !searching && (

Search runs against the local text index. Image-only pages need a vision model.

)}
); }