I was implementing a carousel with chakra ui react for an open-source project. Everything seems to work as expected but while trying it on mobile devices, I immediately observed something off:
While I'm looking into touch start or end event specifically for mobile devices, but I don't have any clue on how to estimate the direction of touch move.
Here is the code of event listeners implemented and assigned to flex:
const handleDragStart = () => setDragStartPosition(positions[activeItem]);
const handleDragEnd = (_, info) => {
const distance = info.offset.x;
const velocity = info.velocity.x * multiplier;
const direction = velocity < 0 || distance < 0 ? 1 : -1;
const extrapolatedPosition =
dragStartPosition +
(direction === 1
? Math.min(velocity, distance)
: Math.max(velocity, distance));
const closestPosition = positions.reduce((prev, curr) => {
return Math.abs(curr - extrapolatedPosition) <
Math.abs(prev - extrapolatedPosition)
? curr
: prev;
}, 0);
if (!(closestPosition < positions[positions.length - constraint])) {
setActiveItem(positions.indexOf(closestPosition));
controls.start({
x: closestPosition,
transition: {
velocity: info.velocity.x,
...transitionProps
}
});
} else {
setActiveItem(positions.length - constraint);
controls.start({
x: positions[positions.length - constraint],
transition: {
velocity: info.velocity.x,
...transitionProps
}
});
}
};
CodeSandbox example: https://codesandbox.io/s/dd8vn