@wordpress/block-editor
Version:
165 lines (137 loc) • 5.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useNotifyCopy = useNotifyCopy;
exports.useClipboardHandler = useClipboardHandler;
exports.default = void 0;
var _element = require("@wordpress/element");
var _blocks = require("@wordpress/blocks");
var _dom = require("@wordpress/dom");
var _data = require("@wordpress/data");
var _i18n = require("@wordpress/i18n");
var _notices = require("@wordpress/notices");
var _compose = require("@wordpress/compose");
var _getPasteEventData = require("../../utils/get-paste-event-data");
var _store = require("../../store");
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
function useNotifyCopy() {
const {
getBlockName
} = (0, _data.useSelect)(_store.store);
const {
getBlockType
} = (0, _data.useSelect)(_blocks.store);
const {
createSuccessNotice
} = (0, _data.useDispatch)(_notices.store);
return (0, _element.useCallback)((eventType, selectedBlockClientIds) => {
let notice = '';
if (selectedBlockClientIds.length === 1) {
const clientId = selectedBlockClientIds[0];
const {
title
} = getBlockType(getBlockName(clientId));
notice = eventType === 'copy' ? (0, _i18n.sprintf)( // Translators: Name of the block being copied, e.g. "Paragraph".
(0, _i18n.__)('Copied "%s" to clipboard.'), title) : (0, _i18n.sprintf)( // Translators: Name of the block being cut, e.g. "Paragraph".
(0, _i18n.__)('Moved "%s" to clipboard.'), title);
} else {
notice = eventType === 'copy' ? (0, _i18n.sprintf)( // Translators: %d: Number of blocks being copied.
(0, _i18n._n)('Copied %d block to clipboard.', 'Copied %d blocks to clipboard.', selectedBlockClientIds.length), selectedBlockClientIds.length) : (0, _i18n.sprintf)( // Translators: %d: Number of blocks being cut.
(0, _i18n._n)('Moved %d block to clipboard.', 'Moved %d blocks to clipboard.', selectedBlockClientIds.length), selectedBlockClientIds.length);
}
createSuccessNotice(notice, {
type: 'snackbar'
});
}, []);
}
function useClipboardHandler() {
const {
getBlocksByClientId,
getSelectedBlockClientIds,
hasMultiSelection,
getSettings
} = (0, _data.useSelect)(_store.store);
const {
flashBlock,
removeBlocks,
replaceBlocks
} = (0, _data.useDispatch)(_store.store);
const notifyCopy = useNotifyCopy();
return (0, _compose.useRefEffect)(node => {
function handler(event) {
const selectedBlockClientIds = getSelectedBlockClientIds();
if (selectedBlockClientIds.length === 0) {
return;
} // Always handle multiple selected blocks.
if (!hasMultiSelection()) {
const {
target
} = event;
const {
ownerDocument
} = target; // If copying, only consider actual text selection as selection.
// Otherwise, any focus on an input field is considered.
const hasSelection = event.type === 'copy' || event.type === 'cut' ? (0, _dom.documentHasUncollapsedSelection)(ownerDocument) : (0, _dom.documentHasSelection)(ownerDocument); // Let native copy behaviour take over in input fields.
if (hasSelection) {
return;
}
}
if (!node.contains(event.target.ownerDocument.activeElement)) {
return;
}
event.preventDefault();
if (event.type === 'copy' || event.type === 'cut') {
if (selectedBlockClientIds.length === 1) {
flashBlock(selectedBlockClientIds[0]);
}
notifyCopy(event.type, selectedBlockClientIds);
const blocks = getBlocksByClientId(selectedBlockClientIds);
const serialized = (0, _blocks.serialize)(blocks);
event.clipboardData.setData('text/plain', serialized);
event.clipboardData.setData('text/html', serialized);
}
if (event.type === 'cut') {
removeBlocks(selectedBlockClientIds);
} else if (event.type === 'paste') {
const {
__experimentalCanUserUseUnfilteredHTML: canUserUseUnfilteredHTML
} = getSettings();
const {
plainText,
html
} = (0, _getPasteEventData.getPasteEventData)(event);
const blocks = (0, _blocks.pasteHandler)({
HTML: html,
plainText,
mode: 'BLOCKS',
canUserUseUnfilteredHTML
});
replaceBlocks(selectedBlockClientIds, blocks, blocks.length - 1, -1);
}
}
node.ownerDocument.addEventListener('copy', handler);
node.ownerDocument.addEventListener('cut', handler);
node.ownerDocument.addEventListener('paste', handler);
return () => {
node.ownerDocument.removeEventListener('copy', handler);
node.ownerDocument.removeEventListener('cut', handler);
node.ownerDocument.removeEventListener('paste', handler);
};
}, []);
}
function CopyHandler({
children
}) {
return (0, _element.createElement)("div", {
ref: useClipboardHandler()
}, children);
}
var _default = CopyHandler;
exports.default = _default;
//# sourceMappingURL=index.js.map