@chief-editor/editor
Version:
FlowEditor Editor
1 lines • 2.15 kB
JavaScript
import{CommandType,LayerMark}from"@chief-editor/core";import{addEventListener,removeEventListener}from"@co-hooks/dom";import{useRefCallback}from"@rc-hooks/use";import copyClipboard from"copy-to-clipboard";import{useCallback,useEffect}from"react";import{useEditor}from"./useEditor";export function useCopyAndPaste(e){var t=e.pasteFile,r=useRefCallback(t),o=useEditor(),i=useCallback((function(e){var t=o.getActiveBricks(),r=o.getActiveBoard();if(!detectEditableElement(e.target||e.srcElement)&&t.length&&r){var i=t.map((function(e){return e.getBrickData(!0)})),a=LayerMark.getBrickGroupRect(t.map((function(e){return e.id})),r);if(!a)return;var n=a.offset,d=a.sizeOffset,c=n.get(),s=c[0],l=c[1],f=d.get(),p={rect:{left:s,top:l,width:f[0],height:f[1]},data:i};console.log("copy",p),copyClipboard(JSON.stringify(p),{format:"editorCopy"})}}),[]),a=useCallback((function(e){var t;if(!detectEditableElement(e.target||e.srcElement)){var i=(null===(t=e.clipboardData)||void 0===t?void 0:t.items)||[];i.length&&i.forEach((function(e){if("string"===e.kind&&"editorcopy"===e.type)e.getAsString((function(e){pasteBrick(o,e)}));else if("file"===e.kind&&e.type.indexOf("image")>-1){var t=e.getAsFile();if(!t)return;console.log(t),r(t,(function(e){var t=o.getHistory(),r=o.getActiveTemplateId(),i=o.getActiveBoard();r&&i&&t.execCommand({name:CommandType.CREATE_BRICK,templateId:r,options:{bricks:[e],boardId:i.id,index:i.getNode().getChildNodes().length}})}))}}))}}),[]);useEffect((function(){return addEventListener(window,"copy",i),addEventListener(window,"paste",a),function(){removeEventListener(window,"copy",i),removeEventListener(window,"paste",a)}}),[])}function detectEditableElement(e){if(!e)return!1;var t=e.tagName.toUpperCase();return"INPUT"===t||"SELECT"===t||"TEXTAREA"===t||e.isContentEditable}function pasteBrick(e,t){if(t)try{var r=JSON.parse(t),o=r.data,i=r.rect;if(console.log("paste",o),Array.isArray(o)&&o.length&&i){var a=e.getHistory(),n=e.getActiveTemplateId(),d=e.getActiveBoard();if(!n||!d)return;a.execCommand({name:CommandType.CREATE_BRICK,templateId:n,options:{bricks:o,boardId:d.id,index:d.getNode().getChildNodes().length}})}}catch(e){}}