({emitChange}: UseIndentingSettings)
| 20 | * Provides functionality for indenting and dedenting selected lines in the Markdown editor. |
| 21 | */ |
| 22 | export const useIndenting = ({emitChange}: UseIndentingSettings): UseIndentingResult => { |
| 23 | const onKeyDown = useCallback( |
| 24 | (event: React.KeyboardEvent<HTMLTextAreaElement>) => { |
| 25 | const textarea = event.currentTarget |
| 26 | if (event.defaultPrevented || event.key !== 'Tab' || textarea.selectionEnd - textarea.selectionStart === 0) return |
| 27 | event.preventDefault() |
| 28 | |
| 29 | const [start, end] = getSelectedLineRange(textarea) |
| 30 | const updatedLines = textarea.value |
| 31 | .slice(start, end) |
| 32 | .split(/\r?\n/) |
| 33 | .map(line => (event.shiftKey ? dedent(line) : indent(line))) |
| 34 | .join('\n') |
| 35 | |
| 36 | emitChange(updatedLines, [start, end], [start, start + updatedLines.length]) |
| 37 | }, |
| 38 | [emitChange], |
| 39 | ) |
| 40 | |
| 41 | return {onKeyDown} |
| 42 | } |
no test coverage detected