간단히 생각했을 때 드래그는 mouseDown 후 mouseUp 하기 이전에 mouseMove를 일으키는 동작이고 클릭은 mouseMove없이 곧바로 두 동작이 이어지는 것입니다.
그러나 실제로 사용자가 느끼기엔 미묘한 부분이 있었습니다.
사용자는 클릭을 의도했지만, 마우스가 약간 밀리거나 하는 이유로 drag로 판단되는 경우가 있었습니다.
따라서, mouseMove에도 일정량의 threshold를 두어야한다고 생각했습니다.
const isIntendedDrag = (event: CMouseEvent) => {
if (!originalPos) return false;
return Math.abs(event.clientX - originalPos) > policy.DRAG_THRESHOLD;
};
const handleMouseMove = (event: CMouseEvent) => {
if (!originalPos) return;
if (!isIntendedDrag(event)) return;
setIsDragging(true);
setSliderPos(handlePos(event.clientX - originalPos));
};
handleMouseMove 는 기본적으로는 mouseDown 상태에서 mouseMove가 일어나면 드래그 중이라고 상태를 변경하는 역할을 하지만, 그 이전에 의도한 드래그인지 판단하는 로직을 추가했습니다.isIntendedDrag 함수에서는 미리 정해둔 DRAG_THRESHOLD 를 넘는지 판단합니다.위와 같은 로직을 추가하자 좀 더 사용자의 의도에 부합하는 동작이 이뤄져 ux가 향상된 것 같습니다.