tossable
Version:
Generated by ambients-cli
67 lines (66 loc) • 2.87 kB
JavaScript
import { inertia, pointer, value, calc } from "popmotion";
import { Cancellable } from "@lincode/promiselikes";
import "../assets/style.css";
import TouchLib from "touchlib";
import { extendFunction } from "@lincode/utils";
export class TossableHandle extends Cancellable {
constructor(cb, set, enable, disable) {
super(cb);
this.set = set;
this.enable = enable;
this.disable = disable;
}
}
export default ({ min = 0, max = 500, start = min, tug = 0.2, power = 0.6, bounceStiffness = 400, bounceDamping = 20, speed = 1, touchTarget, current, step, onComplete, axis = "x" }) => {
const reaction = value(start, step);
onComplete && (reaction.complete = extendFunction(reaction.complete, onComplete));
let trackerStart;
let trackerStop;
const touch = new TouchLib(touchTarget);
touchTarget.classList.add("tossable-" + axis);
const handle0 = touch.on("panstart", e => {
var _a;
trackerStart === null || trackerStart === void 0 ? void 0 : trackerStart.stop();
trackerStop === null || trackerStop === void 0 ? void 0 : trackerStop.stop();
const isVertical = Math.abs(e.deltaX) < Math.abs(e.deltaY) / 2;
if ((axis === "x" && isVertical) || (axis === "y" && !isVertical))
return;
const reactionStart = (_a = current === null || current === void 0 ? void 0 : current()) !== null && _a !== void 0 ? _a : reaction.get();
const applyOverdrag = (v) => {
if (v < min)
return calc.getValueFromProgress(min, v, tug);
if (v > max)
return calc.getValueFromProgress(max, v, tug);
return v;
};
trackerStop = undefined;
trackerStart = pointer({ preventDefault: false })
.pipe((v) => reactionStart + (v[axis] - e[axis]) * speed, applyOverdrag)
.start(reaction);
});
const handle1 = touch.on("panend", () => {
trackerStart === null || trackerStart === void 0 ? void 0 : trackerStart.stop();
trackerStop === null || trackerStop === void 0 ? void 0 : trackerStop.stop();
trackerStart = undefined;
//@ts-ignore
trackerStop = inertia({
min,
max,
from: reaction.get(),
velocity: reaction.getVelocity(),
power,
bounceStiffness,
bounceDamping
}).start(reaction);
});
return new TossableHandle(() => {
handle0.cancel();
handle1.cancel();
}, val => {
trackerStart === null || trackerStart === void 0 ? void 0 : trackerStart.stop();
trackerStop === null || trackerStop === void 0 ? void 0 : trackerStop.stop();
trackerStart = undefined;
trackerStop = undefined;
reaction.update(val);
}, () => touch.enable(), () => touch.disable());
};