From dc811bd3c7cfcabcfe260cbb3716f843154f8e29 Mon Sep 17 00:00:00 2001 From: Gabe Yuan Date: Mon, 25 Dec 2023 11:50:30 +0800 Subject: [PATCH] feat: selection translation on mobile support --- src/views/Selection/DraggableResizable.js | 34 +++++++++++++++-------- src/views/Selection/TranBtn.js | 17 ++++++++++-- src/views/Selection/index.js | 25 ++++++++++++----- 3 files changed, 56 insertions(+), 20 deletions(-) diff --git a/src/views/Selection/DraggableResizable.js b/src/views/Selection/DraggableResizable.js index 9578440..1a72476 100644 --- a/src/views/Selection/DraggableResizable.js +++ b/src/views/Selection/DraggableResizable.js @@ -1,6 +1,7 @@ import { useEffect, useState } from "react"; import Paper from "@mui/material/Paper"; import Box from "@mui/material/Box"; +import { isMobile } from "../../libs/mobile"; function Pointer({ direction, @@ -16,21 +17,23 @@ function Pointer({ const [origin, setOrigin] = useState(null); function handlePointerDown(e) { - e.target.setPointerCapture(e.pointerId); + !isMobile && e.target.setPointerCapture(e.pointerId); + const { clientX, clientY } = isMobile ? e.targetTouches[0] : e; setOrigin({ x: position.x, y: position.y, w: size.w, h: size.h, - clientX: e.clientX, - clientY: e.clientY, + clientX, + clientY, }); } function handlePointerMove(e) { + const { clientX, clientY } = isMobile ? e.targetTouches[0] : e; if (origin) { - const dx = e.clientX - origin.clientX; - const dy = e.clientY - origin.clientY; + const dx = clientX - origin.clientX; + const dy = clientY - origin.clientY; let x = position.x; let y = position.y; let w = size.w; @@ -101,16 +104,24 @@ function Pointer({ } function handlePointerUp(e) { + e.stopPropagation(); setOrigin(null); } + const touchProps = isMobile + ? { + onTouchStart: handlePointerDown, + onTouchMove: handlePointerMove, + onTouchEnd: handlePointerUp, + } + : { + onPointerDown: handlePointerDown, + onPointerMove: handlePointerMove, + onPointerUp: handlePointerUp, + }; + return ( -
+
{children}
); @@ -162,6 +173,7 @@ export default function DraggableResizable({ return ( { @@ -51,14 +58,18 @@ export default function Slection({ contextMenus, tranboxSetting, transApis }) { return; } + const { pageX, pageY } = isMobile ? e.changedTouches[0] : e; !tranboxSetting.hideTranBtn && setShowBtn(true); // setPosition({ x: e.clientX, y: e.clientY }); - setPosition({ x: e.pageX, y: e.pageY }); + setPosition({ x: pageX, y: pageY }); } - window.addEventListener("mouseup", handleMouseup); + window.addEventListener(isMobile ? "touchend" : "mouseup", handleMouseup); return () => { - window.removeEventListener("mouseup", handleMouseup); + window.removeEventListener( + isMobile ? "touchend" : "mouseup", + handleMouseup + ); }; }, [tranboxSetting.hideTranBtn]);