UNPKG

react-email-builder

Version:
179 lines (178 loc) 7.67 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.BlockIcons = void 0; const clsx_1 = __importDefault(require("clsx")); const react_1 = __importStar(require("react")); const hooks_1 = require("../../hooks"); const utils_1 = require("../../utils"); function BlockIcons() { const { blocks } = (0, hooks_1.useEmailBuilderConfig)(); const css = useCss(); return (react_1.default.createElement("div", { className: css.root }, blocks.map((block) => (react_1.default.createElement(BlockIcon, { key: block.type, block: block }))))); } exports.BlockIcons = BlockIcons; function useCss() { return (0, utils_1.getCss)('BlockIcons', (ns) => ({ root: ns(), item: ns('item'), dragged: ns('item-dragged'), dragging: ns('item-dragging'), icon: ns('icon'), name: ns('name'), body: ns('body') })); } function BlockIcon({ block }) { const css = useCss(); const type = block.type; const config = (0, hooks_1.useEmailBuilderConfig)(); const setState = (0, hooks_1.useSetEmailBuilderState)(); const onMouseDown = (0, react_1.useCallback)((e) => { const dragged = e.currentTarget; const rect = dragged.getBoundingClientRect(); const startX = e.clientX; const startY = e.clientY; const startTop = rect.top; const startLeft = rect.left; const dragging = dragged.cloneNode(true); let placeholder = null; const updatePosition = (top, left) => { dragging.style.transform = `translate3d(${left}px, ${top}px, 0) rotate(-10deg)`; }; const dragstart = () => { dragged.className = (0, clsx_1.default)(css.item, css.dragged); dragging.className = (0, clsx_1.default)((0, utils_1.varsClass)(), css.item, css.dragging); const body = document.body; updatePosition(startTop, startLeft); body.appendChild(dragging); body.classList.add(css.body); setState((prev) => { let blocks = prev.blocks; if (!blocks.length || blocks[blocks.length - 1].type !== 'placeholder') { placeholder = (0, utils_1.createPlaceholder)({ end: true }); blocks = [...blocks, placeholder]; } return { ...prev, blocks, draggingType: type, selectedId: undefined, dragoverId: undefined, dragover: false }; }); }; let mousemove = (e) => { const movedX = e.clientX - startX; const movedY = e.clientY - startY; updatePosition(startTop + movedY, startLeft + movedX); }; let dragend = () => { if (dragend) { window.removeEventListener('mouseup', dragend, true); dragend = null; } if (mousemove) { window.removeEventListener('mousemove', mousemove, true); mousemove = null; } dragged.className = css.item; if (dragging.parentNode) { dragging.parentNode.removeChild(dragging); } document.body.classList.remove(css.body); setState((prev) => { let addedBlockId; const addBlock = (blocks) => { const newBlocks = []; blocks.forEach((block) => { if (block.id === prev.dragoverId) { const newBlock = (0, utils_1.createBlock)(config, type); if (block.type === 'placeholder') { newBlocks.push(newBlock); } else if (prev.dragover === 'top') { newBlocks.push(newBlock); newBlocks.push(block); } else if (prev.dragover === 'bottom') { newBlocks.push(block); newBlocks.push(newBlock); } addedBlockId = newBlock.id; } else if (block.type === 'columns') { if (addedBlockId) { newBlocks.push(block); } else { const oldCols = block; const newCols = { ...oldCols, attrs: { ...oldCols.attrs, columns: oldCols.attrs.columns.map((col) => ({ ...col, blocks: addBlock(col.blocks) })) } }; newBlocks.push(newCols); } } else { newBlocks.push(block); } }); return newBlocks; }; let nextBlocks = addBlock(prev.blocks); if (placeholder) { nextBlocks = nextBlocks.filter((b) => b !== placeholder); } return { ...prev, blocks: nextBlocks, tab: addedBlockId ? 'settings' : prev.tab, selectedId: addedBlockId, draggingType: undefined, dragover: undefined, dragoverId: undefined }; }); }; dragstart(); window.addEventListener('mousemove', mousemove, true); window.addEventListener('mouseup', dragend, true); }, [setState, type, config, css]); return (react_1.default.createElement("div", { className: css.item, onMouseDown: onMouseDown }, react_1.default.createElement("div", { className: css.icon }, block.icon), react_1.default.createElement("div", { className: css.name }, block.name))); }