Skip to content

FindableSearch

A document search widget with debounced input, results list, and pagination.

Live Search Demo

Try searching for “fire”, “HVAC”, or “electrical”

Basic Usage

<FindableSearch buildingId="bld-789" />

Omit buildingId to search across all buildings:

<FindableSearch />

Props

PropTypeDefaultDescription
buildingIdstringScope results to a building. Omit to search all buildings.
placeholderstring'Search documents...'Input placeholder text.
maxResultsnumber10Results per page.
debounceMsnumber300Debounce delay in milliseconds.
classNamestringAdditional CSS class.
onHitClick(hit: SearchHit) => voidCalled when a result row is clicked.
renderHit(hit: SearchHit) => JSX.ElementCustom hit renderer for full UI control.

Handling Clicks

<FindableSearch
  buildingId="bld-789"
  onHitClick={(hit) => {
    window.open(`/documents/${hit.id}`);
  }}
/>

Headless Hook: useSearch

import { useSearch } from '@findable-ai/react';

function CustomSearch() {
  const { results, totalHits, isLoading, query, search, loadMore, clear } =
    useSearch({ buildingId: 'bld-789', maxResults: 20 });

  return (
    <div>
      <input
        value={query}
        onChange={(e) => search(e.target.value)}
        placeholder="Search..."
      />
      {isLoading && <span>Loading...</span>}
      <ul>
        {results.map((hit) => (
          <li key={hit.id}>{hit.title || hit.filename}</li>
        ))}
      </ul>
      {results.length < totalHits && (
        <button onClick={loadMore}>Load more</button>
      )}
    </div>
  );
}

useSearch Return Value

PropTypeDefaultDescription
resultsSearchHit[]Current search results.
totalHitsnumberTotal matching documents.
isLoadingbooleanWhether a search is in progress.
errorError | nullThe latest search error, if any.
querystringCurrent search query.
search(query: string) => voidTrigger a debounced search.
loadMore() => voidLoad the next page of results.
clear() => voidClear the query and results.