UNPKG

react-moveable

Version:

A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.

112 lines (98 loc) 2.96 kB
import { MoveableManagerState, OnCustomDrag } from "../types"; import { convertDragDist } from "../utils"; export function setCustomDrag( e: any, state: MoveableManagerState<any>, delta: number[], isPinch: boolean, isConvert: boolean, ableName = "draggable", ) { const result = state.gestos[ableName]?.move(delta, e.inputEvent) ?? {}; const datas = result.originalDatas || result.datas; const ableDatas = datas[ableName] || (datas[ableName] = {}); return { ...(isConvert ? convertDragDist(state, result) : result), isPinch: !!isPinch, parentEvent: true, datas: ableDatas, originalDatas: e.originalDatas, }; } export default class CustomGesto { private prevX = 0; private prevY = 0; private startX = 0; private startY = 0; private isDrag = false; private isFlag = false; private datas: any = { draggable: {}, }; constructor(private ableName = "draggable") { this.datas = { [ableName]: {}, }; } public dragStart(client: number[], e: any) { this.isDrag = false; this.isFlag = false; const originalDatas = e.originalDatas; this.datas = originalDatas; if (!originalDatas[this.ableName]) { originalDatas[this.ableName] = {}; } return { ...this.move(client, e.inputEvent), type: "dragstart", }; } public drag(client: number[], inputEvent: any) { return this.move([ client[0] - this.prevX, client[1] - this.prevY, ], inputEvent); } public move(delta: number[], inputEvent: any): OnCustomDrag { let clientX!: number; let clientY!: number; let isFirstDrag = false; if (!this.isFlag) { this.prevX = delta[0]; this.prevY = delta[1]; this.startX = delta[0]; this.startY = delta[1]; clientX = delta[0]; clientY = delta[1]; this.isFlag = true; } else { const isPrevDrag = this.isDrag; clientX = this.prevX + delta[0]; clientY = this.prevY + delta[1]; if (delta[0] || delta[1]) { this.isDrag = true; } if (!isPrevDrag && this.isDrag) { isFirstDrag = true; } } this.prevX = clientX; this.prevY = clientY; return { type: "drag", clientX, clientY, inputEvent, isFirstDrag, isDrag: this.isDrag, distX: clientX - this.startX, distY: clientY - this.startY, deltaX: delta[0], deltaY: delta[1], datas: this.datas[this.ableName], originalDatas: this.datas, parentEvent: true, parentGesto: this, }; } }