@gechiui/block-editor
Version:
172 lines (142 loc) • 5.46 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.useClipboardHandler = useClipboardHandler;
exports.useNotifyCopy = useNotifyCopy;
var _element = require("@gechiui/element");
var _blocks = require("@gechiui/blocks");
var _dom = require("@gechiui/dom");
var _data = require("@gechiui/data");
var _i18n = require("@gechiui/i18n");
var _notices = require("@gechiui/notices");
var _compose = require("@gechiui/compose");
var _getPasteEventData = require("../../utils/get-paste-event-data");
var _store = require("../../store");
/**
* GeChiUI 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) {
var _getBlockType;
const clientId = selectedBlockClientIds[0];
const title = (_getBlockType = getBlockType(getBlockName(clientId))) === null || _getBlockType === void 0 ? void 0 : _getBlockType.title;
notice = eventType === 'copy' ? (0, _i18n.sprintf)( // Translators: Name of the block being copied, e.g. "Paragraph".
(0, _i18n.__)('“%s”区块已复制至剪贴板。'), title) : (0, _i18n.sprintf)( // Translators: Name of the block being cut, e.g. "Paragraph".
(0, _i18n.__)('“%s”区块已移动至剪贴板。'), title);
} else {
notice = eventType === 'copy' ? (0, _i18n.sprintf)( // Translators: %d: Number of blocks being copied.
(0, _i18n._n)('已将%d区块复制至剪贴板。', 'Copied %d blocks to clipboard.', selectedBlockClientIds.length), selectedBlockClientIds.length) : (0, _i18n.sprintf)( // Translators: %d: Number of blocks being cut.
(0, _i18n._n)('已将%d区块移至剪贴板。', '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;
}
const eventDefaultPrevented = event.defaultPrevented;
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') {
if (eventDefaultPrevented) {
// This was likely already handled in rich-text/use-paste-handler.js
return;
}
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(_ref) {
let {
children
} = _ref;
return (0, _element.createElement)("div", {
ref: useClipboardHandler()
}, children);
}
var _default = CopyHandler;
exports.default = _default;
//# sourceMappingURL=index.js.map