Files
kandev/apps/web/hooks/use-command-panel-shortcuts.ts
T
2026-07-29 09:50:29 +01:00

60 lines
1.8 KiB
TypeScript

"use client";
import { useCallback, useEffect, useRef } from "react";
import { useAppStore } from "@/components/state-provider";
import { useKeyboardShortcut } from "@/hooks/use-keyboard-shortcut";
import type { CommandPanelMode } from "@/lib/commands/types";
import { SHORTCUTS } from "@/lib/keyboard/constants";
import { getShortcut } from "@/lib/keyboard/shortcut-overrides";
type CommandPanelShortcutOptions = {
open: boolean;
setOpen: (open: boolean) => void;
mode: CommandPanelMode;
workspaceSearchAvailable: boolean;
setMode: (mode: CommandPanelMode) => void;
setSearch: (search: string) => void;
};
export function useCommandPanelShortcuts({
open,
setOpen,
mode,
workspaceSearchAvailable,
setMode,
setSearch,
}: CommandPanelShortcutOptions) {
const openRef = useRef(open);
useEffect(() => {
openRef.current = open;
}, [open]);
const openCommands = useCallback(() => {
if (openRef.current && mode === "commands") {
setOpen(false);
return;
}
setMode("commands");
setSearch("");
setOpen(true);
}, [mode, setMode, setOpen, setSearch]);
const openFileSearch = useCallback(() => {
if (openRef.current && mode === "search-files") {
setOpen(false);
return;
}
setMode("search-files");
setSearch("");
setOpen(true);
}, [mode, setMode, setOpen, setSearch]);
const keyboardShortcuts = useAppStore((state) => state.userSettings.keyboardShortcuts);
useKeyboardShortcut(getShortcut("SEARCH", keyboardShortcuts), openCommands);
useKeyboardShortcut(getShortcut("COMMAND_PANEL", keyboardShortcuts), openCommands);
useKeyboardShortcut(SHORTCUTS.COMMAND_PANEL_SHIFT, openCommands);
useKeyboardShortcut(getShortcut("FILE_SEARCH", keyboardShortcuts), openFileSearch, {
enabled: workspaceSearchAvailable,
});
}