@wordpress/block-editor
Version:
62 lines (53 loc) • 1.81 kB
JavaScript
/**
* WordPress dependencies
*/
import { useRef } from '@wordpress/element';
import { useRefEffect } from '@wordpress/compose';
import { DELETE, BACKSPACE } from '@wordpress/keycodes';
import { isCollapsed, isEmpty } from '@wordpress/rich-text';
export function useDelete(props) {
const propsRef = useRef(props);
propsRef.current = props;
return useRefEffect(element => {
function onKeyDown(event) {
const {
keyCode
} = event;
if (event.defaultPrevented) {
return;
}
const {
value,
onMerge,
onRemove
} = propsRef.current;
if (keyCode === DELETE || keyCode === BACKSPACE) {
const {
start,
end,
text
} = value;
const isReverse = keyCode === BACKSPACE;
const hasActiveFormats = value.activeFormats && !!value.activeFormats.length; // Only process delete if the key press occurs at an uncollapsed edge.
if (!isCollapsed(value) || hasActiveFormats || isReverse && start !== 0 || !isReverse && end !== text.length) {
return;
}
if (onMerge) {
onMerge(!isReverse);
} // Only handle remove on Backspace. This serves dual-purpose of being
// an intentional user interaction distinguishing between Backspace and
// Delete to remove the empty field, but also to avoid merge & remove
// causing destruction of two fields (merge, then removed merged).
if (onRemove && isEmpty(value) && isReverse) {
onRemove(!isReverse);
}
event.preventDefault();
}
}
element.addEventListener('keydown', onKeyDown);
return () => {
element.removeEventListener('keydown', onKeyDown);
};
}, []);
}
//# sourceMappingURL=use-delete.js.map