import { isKeyHotkey } from 'is-hotkey'; import { KeyboardEventHandler, useCallback } from 'react'; import { Cursor, Intent, Operations, TextArea } from '../plugins/text-area'; export const useTextAreaIntentHandler = ( textArea: TextArea, operations: Operations, intent: Intent ) => { const handler: KeyboardEventHandler = useCallback( (evt) => { const target = evt.currentTarget; if (isKeyHotkey('tab', evt)) { evt.preventDefault(); const cursor = Cursor.fromTextAreaElement(target); if (textArea.selection(cursor)) { operations.select(intent.moveForward(cursor)); } else { operations.deselect(operations.insert(cursor, intent.str)); } target.focus(); } if (isKeyHotkey('shift+tab', evt)) { evt.preventDefault(); const cursor = Cursor.fromTextAreaElement(target); const intentCursor = intent.moveBackward(cursor); if (textArea.selection(cursor)) { operations.select(intentCursor); } else { operations.deselect(intentCursor); } target.focus(); } if (isKeyHotkey('enter', evt) || isKeyHotkey('shift+enter', evt)) { evt.preventDefault(); const cursor = Cursor.fromTextAreaElement(target); operations.select(intent.addNewLine(cursor)); } if (isKeyHotkey('mod+enter', evt)) { evt.preventDefault(); const cursor = Cursor.fromTextAreaElement(target); operations.select(intent.addNextLine(cursor)); } if (isKeyHotkey('mod+shift+enter', evt)) { evt.preventDefault(); const cursor = Cursor.fromTextAreaElement(target); operations.select(intent.addPreviousLine(cursor)); } }, [textArea, operations, intent] ); return handler; };