UNPKG

itmar-block-packages

Version:

Common React components for WordPress custom blocks, now fully TypeScript-ready.

109 lines (104 loc) 5.55 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var jsxRuntime = require('react/jsx-runtime'); var i18n = require('@wordpress/i18n'); var components = require('@wordpress/components'); var element = require('@wordpress/element'); const useDraggingMove = (isMovable, blockRef, // ReactのRef型を指定 position, onPositionChange) => { const elmposition = element.useRef({ x: 0, y: 0 }); const isDragging = element.useRef(false); const mousePosition = element.useRef({ x: 0, y: 0 }); element.useEffect(() => { const element = blockRef.current; if (!element) return; if (!isMovable) { if (element) { element.classList.remove("itmar_isDraggable"); //移動カーソル表示クラス削除 } return; // 移動許可がある場合のみ、後続のロジックを実行 } //positionの変化に合わせて現在位置を変更 const pos_value_x = position.x.match(/(-?\d+)([%a-zA-Z]+)/); const pos_value_y = position.y.match(/(-?\d+)([%a-zA-Z]+)/); if (pos_value_x && pos_value_y) { elmposition.current = { x: parseInt(pos_value_x[1], 10), y: parseInt(pos_value_y[1], 10), }; } //イベントハンドラ const handleMouseDown = (event) => { // 移動カーソル表示クラス名を追加します。 element.classList.add("itmar_isDraggable"); //ドラッグの開始フラグオン isDragging.current = true; //ドラッグ開始の絶対位置 mousePosition.current = { x: event.clientX, y: event.clientY }; }; const handleMouseMove = (event) => { if (!isDragging.current) return; //ドラッグ中でなければ処理を中止 const dx = event.clientX - mousePosition.current.x; const dy = event.clientY - mousePosition.current.y; //ドラッグ後の位置を保存 const newPosition = { x: elmposition.current.x + dx, y: elmposition.current.y + dy, }; elmposition.current = newPosition; mousePosition.current = { x: event.clientX, y: event.clientY }; //マウス位置の保存 //ドラッグによるブロックの一時的移動 element.style.transform = `translate(${elmposition.current.x}px, ${elmposition.current.y}px)`; }; const handleMouseUp = () => { if (!isDragging.current) return; isDragging.current = false; element.style.transform = ""; // null ではなく空文字が推奨 //呼出しもとに要素の位置を返す onPositionChange({ x: `${elmposition.current.x}px`, y: `${elmposition.current.y}px`, }); }; const handleMouseLeave = () => { isDragging.current = false; }; if (element) { // クラス名を追加します。 element.classList.add("itmar_isDraggable"); } // イベントハンドラを追加します。 element.addEventListener("mousedown", handleMouseDown); element.addEventListener("mousemove", handleMouseMove); element.addEventListener("mouseup", handleMouseUp); element.addEventListener("mouseleave", handleMouseLeave); // イベントリスナーを削除するクリーンアップ関数を返します。 return () => { element.removeEventListener("mousedown", handleMouseDown); element.removeEventListener("mousemove", handleMouseMove); element.removeEventListener("mouseup", handleMouseUp); element.removeEventListener("mouseleave", handleMouseLeave); element.style.transform = ""; }; }, [isMovable, blockRef, position, onPositionChange]); // 依存配列に isMovable を含めます }; function DraggableBox({ attributes, onPositionChange, }) { const position = attributes; //インスペクター内のコントロールからの移動操作 const chagePosition = (value, cordinate) => { if (value !== undefined) { const newPos = { ...position, [cordinate]: value }; onPositionChange(newPos); } }; const resetPos = () => { onPositionChange({ x: "0px", y: "0px" }); }; return (jsxRuntime.jsx(jsxRuntime.Fragment, { children: jsxRuntime.jsxs(components.PanelBody, { title: i18n.__("Position Setting", "block-collections"), initialOpen: true, children: [jsxRuntime.jsxs(components.PanelRow, { className: "distance_row", children: [jsxRuntime.jsx(components.__experimentalUnitControl, { dragDirection: "e", onChange: (value) => chagePosition(value, "x"), label: i18n.__("Vertical", "block-collections"), value: position?.x || 0 }), jsxRuntime.jsx(components.__experimentalUnitControl, { dragDirection: "e", onChange: (value) => chagePosition(value, "y"), label: i18n.__("Horizen", "block-collections"), value: position?.y || 0 })] }), jsxRuntime.jsx(components.PanelRow, { className: "reset_row", children: jsxRuntime.jsx(components.Button, { variant: "secondary", onClick: () => resetPos(), children: i18n.__("Reset", "block-collections") }) })] }) })); } exports.default = DraggableBox; exports.useDraggingMove = useDraggingMove; //# sourceMappingURL=DraggableBox.js.map