UNPKG

@wordpress/block-editor

Version:
114 lines (105 loc) 3.04 kB
/** * WordPress dependencies */ import { useRef } from '@wordpress/element'; import { useRefEffect } from '@wordpress/compose'; import { ENTER } from '@wordpress/keycodes'; import { insert, __unstableIsEmptyLine as isEmptyLine, __unstableInsertLineSeparator as insertLineSeparator } from '@wordpress/rich-text'; import { getBlockTransforms, findTransform } from '@wordpress/blocks'; import { useDispatch } from '@wordpress/data'; /** * Internal dependencies */ import { store as blockEditorStore } from '../../store'; import { splitValue } from './split-value'; export function useEnter(props) { const { __unstableMarkAutomaticChange } = useDispatch(blockEditorStore); const propsRef = useRef(props); propsRef.current = props; return useRefEffect(element => { function onKeyDown(event) { if (event.defaultPrevented) { return; } if (event.keyCode !== ENTER) { return; } const { removeEditorOnlyFormats, value, onReplace, onSplit, onSplitMiddle, multilineTag, onChange, disableLineBreaks, onSplitAtEnd } = propsRef.current; event.preventDefault(); const _value = { ...value }; _value.formats = removeEditorOnlyFormats(value); const canSplit = onReplace && onSplit; if (onReplace) { const transforms = getBlockTransforms('from').filter(({ type }) => type === 'enter'); const transformation = findTransform(transforms, item => { return item.regExp.test(_value.text); }); if (transformation) { onReplace([transformation.transform({ content: _value.text })]); __unstableMarkAutomaticChange(); } } if (multilineTag) { if (event.shiftKey) { if (!disableLineBreaks) { onChange(insert(_value, '\n')); } } else if (canSplit && isEmptyLine(_value)) { splitValue({ value: _value, onReplace, onSplit, onSplitMiddle, multilineTag }); } else { onChange(insertLineSeparator(_value)); } } else { const { text, start, end } = _value; const canSplitAtEnd = onSplitAtEnd && start === end && end === text.length; if (event.shiftKey || !canSplit && !canSplitAtEnd) { if (!disableLineBreaks) { onChange(insert(_value, '\n')); } } else if (!canSplit && canSplitAtEnd) { onSplitAtEnd(); } else if (canSplit) { splitValue({ value: _value, onReplace, onSplit, onSplitMiddle, multilineTag }); } } } element.addEventListener('keydown', onKeyDown); return () => { element.removeEventListener('keydown', onKeyDown); }; }, []); } //# sourceMappingURL=use-enter.js.map