react-moveable
Version:
A React Component that create Moveable, Draggable, Resizable, Scalable, Rotatable, Warpable, Pinchable, Groupable.
156 lines (143 loc) • 6.12 kB
text/typescript
import {
MoveableManagerInterface, BeforeRenderableProps,
OnBeforeRenderStart, OnBeforeRender, OnBeforeRenderEnd,
MoveableGroupInterface, OnBeforeRenderGroupStart,
OnBeforeRenderGroup, OnBeforeRenderGroupEnd,
} from "../types";
import { fillParams, triggerEvent } from "../utils";
import { convertMatrixtoCSS, createIdentityMatrix } from "@scena/matrix";
import { isArray, splitSpace } from "@daybrush/utils";
import { fillChildEvents } from "../groupUtils";
function isIdentityMatrix(matrix: string, is3d?: boolean) {
const n = is3d ? 4 : 3;
const identityMatrix = createIdentityMatrix(n);
const value = `matrix${is3d ? "3d" : ""}(${identityMatrix.join(",")})`;
return matrix === value || matrix === `matrix(1,0,0,1,0,0)`;
}
export default {
isPinch: true,
name: "beforeRenderable",
props: [] as const,
events: [
"beforeRenderStart",
"beforeRender",
"beforeRenderEnd",
"beforeRenderGroupStart",
"beforeRenderGroup",
"beforeRenderGroupEnd",
] as const,
dragRelation: "weak",
setTransform(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
const {
is3d,
targetMatrix,
inlineTransform,
} = moveable.state;
const cssMatrix = is3d
? `matrix3d(${targetMatrix.join(",")})`
: `matrix(${convertMatrixtoCSS(targetMatrix, true)})`;
const startTransform = !inlineTransform || inlineTransform === "none" ? cssMatrix : inlineTransform;
e.datas.startTransforms = isIdentityMatrix(startTransform, is3d) ? [] : splitSpace(startTransform);
},
resetStyle(e: any) {
const datas = e.datas;
datas.nextStyle = {};
datas.nextTransforms = e.datas.startTransforms;
datas.nextTransformAppendedIndexes = [];
},
fillDragStartParams(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
return fillParams<OnBeforeRenderStart>(moveable, e, {
setTransform: (transform: string | string[]) => {
e.datas.startTransforms = isArray(transform) ? transform : splitSpace(transform);
},
isPinch: !!e.isPinch,
});
},
fillDragParams(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
return fillParams<OnBeforeRender>(moveable, e, {
isPinch: !!e.isPinch,
});
},
dragStart(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
this.setTransform(moveable, e);
this.resetStyle(e);
triggerEvent(moveable, `onBeforeRenderStart`, this.fillDragStartParams(moveable, e));
},
drag(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
if (!e.datas.startTransforms) {
this.setTransform(moveable, e);
}
this.resetStyle(e);
triggerEvent(moveable, `onBeforeRender`, fillParams<OnBeforeRender>(moveable, e, {
isPinch: !!e.isPinch,
}));
},
dragEnd(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
if (!e.datas.startTransforms) {
this.setTransform(moveable, e);
this.resetStyle(e);
}
triggerEvent(moveable, `onBeforeRenderEnd`, fillParams<OnBeforeRenderEnd>(moveable, e, {
isPinch: !!e.isPinch,
isDrag: e.isDrag,
}));
},
dragGroupStart(moveable: MoveableGroupInterface<BeforeRenderableProps>, e: any) {
this.dragStart(moveable, e);
const events = fillChildEvents(moveable, "beforeRenderable", e);
const moveables = moveable.moveables;
const params = events.map((childEvent, i) => {
const childMoveable = moveables[i];
this.setTransform(childMoveable, childEvent);
this.resetStyle(childEvent);
return this.fillDragStartParams(childMoveable, childEvent);
});
triggerEvent(moveable, `onBeforeRenderGroupStart`, fillParams<OnBeforeRenderGroupStart>(moveable, e, {
isPinch: !!e.isPinch,
targets: moveable.props.targets,
setTransform() { },
events: params,
}));
},
dragGroup(moveable: MoveableGroupInterface<BeforeRenderableProps>, e: any) {
this.drag(moveable, e);
const events = fillChildEvents(moveable, "beforeRenderable", e);
const moveables = moveable.moveables;
const params = events.map((childEvent, i) => {
const childMoveable = moveables[i];
this.resetStyle(childEvent);
return this.fillDragParams(childMoveable, childEvent);
});
triggerEvent(moveable, `onBeforeRenderGroup`, fillParams<OnBeforeRenderGroup>(moveable, e, {
isPinch: !!e.isPinch,
targets: moveable.props.targets,
events: params,
}));
},
dragGroupEnd(moveable: MoveableGroupInterface<BeforeRenderableProps>, e: any) {
this.dragEnd(moveable, e);
triggerEvent(moveable, `onBeforeRenderGroupEnd`, fillParams<OnBeforeRenderGroupEnd>(moveable, e, {
isPinch: !!e.isPinch,
isDrag: e.isDrag,
targets: moveable.props.targets,
}));
},
dragControlStart(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
return this.dragStart(moveable, e);
},
dragControl(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
return this.drag(moveable, e);
},
dragControlEnd(moveable: MoveableManagerInterface<BeforeRenderableProps>, e: any) {
return this.dragEnd(moveable, e);
},
dragGroupControlStart(moveable: MoveableGroupInterface<BeforeRenderableProps>, e: any) {
return this.dragGroupStart(moveable, e);
},
dragGroupControl(moveable: MoveableGroupInterface<BeforeRenderableProps>, e: any) {
return this.dragGroup(moveable, e);
},
dragGroupControlEnd(moveable: MoveableGroupInterface<BeforeRenderableProps>, e: any) {
return this.dragGroupEnd(moveable, e);
},
} as const;