Search Integration
Using with React + InstantSearch
The recommended way to add search to your React app is using @tsproxy/react components with react-instantsearch.
Install
npm install @tsproxy/js @tsproxy/react react-instantsearchBasic Setup
import { useMemo } from "react";
import { InstantSearch, Configure } from "react-instantsearch";
import { createSearchClient } from "@tsproxy/js";
import { SearchBox, Hits, RefinementList, Pagination, Stats } from "@tsproxy/react";
export default function SearchPage() {
const searchClient = useMemo(
() => createSearchClient({ url: "http://localhost:3000" }),
[],
);
return (
<InstantSearch searchClient={searchClient} indexName="products">
<Configure hitsPerPage={12} />
<SearchBox placeholder="Search..." />
<Stats />
<RefinementList attribute="category" />
<Hits hitComponent={({ hit }) => <div>{hit.name}</div>} />
<Pagination />
</InstantSearch>
);
}Overrides Pattern
Every @tsproxy/react component accepts an overrides prop to customize or replace any sub-element:
<SearchBox
overrides={{
Input: {
props: { className: "rounded-full border px-4 py-2" },
},
SubmitButton: { props: { hidden: true } },
ResetButton: {
component: ({ onClick, hidden }) => (
<button onClick={onClick} hidden={hidden}>Clear</button>
),
},
}}
/>Each override accepts:
props— merge additional props (object or function(defaultProps) => overrideProps)component— replace the sub-element entirely with a custom component
Debounced Search
Use queryHook to debounce search requests:
import { useRef, useCallback } from "react";
function useDebouncedSearch(delay = 300) {
const timerRef = useRef(undefined);
return useCallback(
(query, search) => {
clearTimeout(timerRef.current);
timerRef.current = setTimeout(() => search(query), delay);
},
[delay],
);
}
// In your component:
const debouncedSearch = useDebouncedSearch(300);
<SearchBox queryHook={debouncedSearch} />Using with Vanilla JS
If you're not using React, you can use @tsproxy/js directly:
import { createSearchClient } from "@tsproxy/js";
const client = createSearchClient({ url: "http://localhost:3000" });
const results = await client.search([
{
indexName: "products",
params: { query: "keyboard", hitsPerPage: 10, page: 0 },
},
]);
console.log(results.results[0].hits);Direct API Calls
You can also call the proxy API directly:
curl -X POST http://localhost:3000/api/search \
-H "Content-Type: application/json" \
-d '{
"requests": [{
"indexName": "products",
"params": {
"query": "keyboard",
"hitsPerPage": 12,
"page": 0,
"facets": ["category", "brand"]
}
}]
}'