UNPKG

@wordpress/block-editor

Version:
165 lines (137 loc) 5.12 kB
"use strict"; 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