foxus/frontend/src/hooks/useKeyboardShortcuts.ts

77 lines
2.1 KiB
TypeScript

import { useHotkeys } from 'react-hotkeys-hook';
import { useEditorStore } from '../stores/editorStore';
import { useAIStore } from '../stores/aiStore';
interface KeyboardShortcutsProps {
onToggleCommandPalette: () => void;
}
export const useKeyboardShortcuts = ({ onToggleCommandPalette }: KeyboardShortcutsProps) => {
const { saveCurrentFile, currentFile } = useEditorStore();
const { explainCode, refactorCode, fixCode } = useAIStore();
// Command palette
useHotkeys('ctrl+k, cmd+k', (e) => {
e.preventDefault();
onToggleCommandPalette();
});
// File operations
useHotkeys('ctrl+s, cmd+s', (e) => {
e.preventDefault();
saveCurrentFile();
});
// AI commands with selected text
useHotkeys('ctrl+shift+e, cmd+shift+e', async (e) => {
e.preventDefault();
if (currentFile) {
const selectedText = getSelectedText();
if (selectedText) {
await explainCode(selectedText, currentFile.language);
}
}
});
useHotkeys('ctrl+shift+r, cmd+shift+r', async (e) => {
e.preventDefault();
if (currentFile) {
const selectedText = getSelectedText();
if (selectedText) {
await refactorCode(selectedText, currentFile.language);
}
}
});
useHotkeys('ctrl+shift+f, cmd+shift+f', async (e) => {
e.preventDefault();
if (currentFile) {
const selectedText = getSelectedText();
if (selectedText) {
await fixCode(selectedText, currentFile.language);
}
}
});
// Quick AI commands
useHotkeys('alt+e', (e) => {
e.preventDefault();
onToggleCommandPalette();
});
// Developer tools (only in development)
useHotkeys('f12', (e) => {
if (process.env.NODE_ENV === 'development') {
e.preventDefault();
// Toggle developer tools if available
}
});
};
// Helper function to get selected text from Monaco editor
const getSelectedText = (): string => {
// This would integrate with Monaco editor's selection API
// For now, return empty string as placeholder
const selection = window.getSelection();
return selection ? selection.toString() : '';
};