import { useVisibility } from "@charcuterie/logic" import { useCallback, useState } from "react" import { type CommandPaletteHotkeysOptions, useCommandPaletteHotkeys, } from "./useCommandPaletteHotkeys.ts" export type UseCommandPaletteOptions = Pick< CommandPaletteHotkeysOptions, "isOpenedByTyping" > & { /** Register the global keys (`useCommandPaletteHotkeys`). Default `true`. */ hasHotkeys?: boolean } export type UseCommandPaletteResult = { close: () => void isVisible: boolean /** Open it, optionally with text already in the field. */ open: (initialQuery?: string) => void /** Spread onto `CommandPalette`. */ paletteProps: { defaultQuery: string isVisible: boolean onClose: () => void } } /** * The open state for one `CommandPalette`, and its global keys. * * ```tsx * const palette = useCommandPalette() * * * * ``` * * The keys are off while it is open, so a second `Ctrl K` does not * reset what has been typed. */ export const useCommandPalette = ({ hasHotkeys = true, isOpenedByTyping, }: UseCommandPaletteOptions = {}): UseCommandPaletteResult => { const { hide, isVisible, show } = useVisibility() const [initialQuery, setInitialQuery] = useState("") const open = useCallback( (nextInitialQuery = "") => { setInitialQuery(nextInitialQuery) show() }, [show], ) useCommandPaletteHotkeys({ isEnabled: hasHotkeys && !isVisible, isOpenedByTyping, onOpen: open, }) return { close: hide, isVisible, open, paletteProps: { defaultQuery: initialQuery, isVisible, onClose: hide, }, } }