diff --git a/src/app/hooks/useTextAreaIntent.ts b/src/app/hooks/useTextAreaIntent.ts new file mode 100644 index 00000000..90f1cc37 --- /dev/null +++ b/src/app/hooks/useTextAreaIntent.ts @@ -0,0 +1,53 @@ +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.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; +};