77 lines
2.1 KiB
TypeScript
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() : '';
|
|
};
|