Skip to content

API ​

The imperative API gives you programmatic control over the command palette. You can open/close it, inspect its state, or add commands dynamically — perfect for integrating custom UI triggers or analytics.

WARNING

Reach for the API only when necessary. Most scenarios can be handled declaratively via props and React state.

Accessing the API ​

Use the useApiRef hook to create a ref and pass it to the provider via the apiRef prop. The ref is populated once the provider mounts.

tsx
import {
  CommandPaletteProvider,
  useApiRef,
  type Command,
} from "@mattis44/react-command-palette";
import { useEffect } from "react";

const commands: Command[] = [
  { id: "hello", label: "Say hello", category: "Example", action: () => alert("Hello!") },
];

export function App() {
  const apiRef = useApiRef();

  useEffect(() => {
    apiRef.current?.open();
    apiRef.current?.setQuery("search");
  }, [apiRef]);

  return (
    <CommandPaletteProvider commands={commands} apiRef={apiRef}>
      <button type="button" onClick={() => apiRef.current?.toggle()}>
        Toggle palette
      </button>
    </CommandPaletteProvider>
  );
}

The ref value is null on the server and until the provider mounts on the client.

Methods ​

MethodDescription
open()Opens the palette.
close()Closes the palette.
toggle()Toggles the palette open/closed.
focus()Focuses the search input if the palette is open.
isOpen()Returns true if the palette is currently open.
setQuery(query: string)Updates the search query programmatically.
getQuery()Returns the current search query.
addCommands(commands: Command[])Appends additional commands to the existing list.
clearCommands()Removes all commands.
logState()Logs { isOpen, query, commands } for debugging.

All methods are stable across renders and always read the latest state thanks to internal refs.

Example use cases ​

  • Provide a custom “Command Palette” button in your header that calls apiRef.current?.open().
  • Pre-fill the search query after navigating to a specific route.
  • Append contextual commands (e.g. document actions) when a certain view mounts, then call clearCommands() when it unmounts.
  • Inspect the palette state in development by calling logState() from the browser console.