react-moveable
Version:
A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.
130 lines (121 loc) • 5.16 kB
text/typescript
import { parse } from "css-to-mat";
import { getNextStyle, getNextTransformText, getNextTransforms } from "../gesto/GestoUtils";
import { fillChildEvents } from "../groupUtils";
import {
MoveableManagerInterface, RenderableProps, OnRenderStart, OnRender,
OnRenderEnd, MoveableGroupInterface,
OnRenderGroupStart, OnRenderGroup, OnRenderGroupEnd,
} from "../types";
import { triggerEvent, fillParams, fillCSSObject } from "../utils";
export default {
name: "renderable",
props: [] as const,
events: [
"renderStart",
"render",
"renderEnd",
"renderGroupStart",
"renderGroup",
"renderGroupEnd",
] as const,
dragRelation: "weak",
dragStart(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
triggerEvent(moveable, `onRenderStart`, fillParams<OnRenderStart>(moveable, e, {
isPinch: !!e.isPinch,
}));
},
drag(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
triggerEvent(moveable, `onRender`, this.fillDragParams(moveable, e));
},
dragAfter(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
return this.drag(moveable, e);
},
dragEnd(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
triggerEvent(moveable, `onRenderEnd`, this.fillDragEndParams(moveable, e));
},
dragGroupStart(moveable: MoveableGroupInterface<RenderableProps>, e: any) {
triggerEvent(moveable, `onRenderGroupStart`, fillParams<OnRenderGroupStart>(moveable, e, {
isPinch: !!e.isPinch,
targets: moveable.props.targets,
}));
},
dragGroup(moveable: MoveableGroupInterface<RenderableProps>, e: any) {
const events = fillChildEvents(moveable, "beforeRenderable", e);
const moveables = moveable.moveables;
const params = events.map((childEvent, i) => {
const childMoveable = moveables[i];
return this.fillDragParams(childMoveable, childEvent);
});
triggerEvent(moveable, `onRenderGroup`, fillParams<OnRenderGroup>(moveable, e, {
isPinch: !!e.isPinch,
targets: moveable.props.targets,
transform: getNextTransformText(e),
transformObject: {},
...fillCSSObject(getNextStyle(e)),
events: params,
},));
},
dragGroupEnd(moveable: MoveableGroupInterface<RenderableProps>, e: any) {
const events = fillChildEvents(moveable, "beforeRenderable", e);
const moveables = moveable.moveables;
const params = events.map((childEvent, i) => {
const childMoveable = moveables[i];
return this.fillDragEndParams(childMoveable, childEvent);
});
triggerEvent(moveable, `onRenderGroupEnd`, fillParams<OnRenderGroupEnd>(moveable, e, {
isPinch: !!e.isPinch,
isDrag: e.isDrag,
targets: moveable.props.targets,
events: params,
transformObject: {},
transform: getNextTransformText(e),
...fillCSSObject(getNextStyle(e)),
}));
},
dragControlStart(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
return this.dragStart(moveable, e);
},
dragControl(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
return this.drag(moveable, e);
},
dragControlAfter(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
return this.dragAfter(moveable, e);
},
dragControlEnd(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
return this.dragEnd(moveable, e);
},
dragGroupControlStart(moveable: MoveableGroupInterface<RenderableProps>, e: any) {
return this.dragGroupStart(moveable, e);
},
dragGroupControl(moveable: MoveableGroupInterface<RenderableProps>, e: any) {
return this.dragGroup(moveable, e);
},
dragGroupControlEnd(moveable: MoveableGroupInterface<RenderableProps>, e: any) {
return this.dragGroupEnd(moveable, e);
},
fillDragParams(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
const transformObject: Record<string, any> = {};
parse(getNextTransforms(e) || []).forEach(matrixInfo => {
transformObject[matrixInfo.name] = matrixInfo.functionValue;
});
return fillParams<OnRender>(moveable, e, {
isPinch: !!e.isPinch,
transformObject,
transform: getNextTransformText(e),
...fillCSSObject(getNextStyle(e)),
});
},
fillDragEndParams(moveable: MoveableManagerInterface<RenderableProps>, e: any) {
const transformObject: Record<string, any> = {};
parse(getNextTransforms(e) || []).forEach(matrixInfo => {
transformObject[matrixInfo.name] = matrixInfo.functionValue;
});
return fillParams<OnRenderEnd>(moveable, e, {
isPinch: !!e.isPinch,
isDrag: e.isDrag,
transformObject,
transform: getNextTransformText(e),
...fillCSSObject(getNextStyle(e)),
});
},
} as const;