60 lines
1.8 KiB
TypeScript
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,
|
|
});
|
|
}
|