|
|
|
|
@ -10,9 +10,12 @@ const getNormalizedProgress = (fraction: number) => { |
|
|
|
|
|
|
|
|
|
type Args = { |
|
|
|
|
onChange: (progress: number, seeking: boolean) => void, |
|
|
|
|
onTouchEnd?: () => any, |
|
|
|
|
onTouchStart?: () => any, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
export const useSlider = ({ onChange }: Args) => { |
|
|
|
|
export const useSlider = (props: Args) => { |
|
|
|
|
const { onChange } = props |
|
|
|
|
const ref = useRef<HTMLDivElement>(null) |
|
|
|
|
const lastProgress = useRef(0) |
|
|
|
|
const { |
|
|
|
|
@ -31,39 +34,68 @@ export const useSlider = ({ onChange }: Args) => { |
|
|
|
|
onChange(progress, seeking) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const mouseDownListener = ({ clientX, target }: MouseEvent) => { |
|
|
|
|
const track = ref.current |
|
|
|
|
if (target === track || track?.contains(target as Node)) { |
|
|
|
|
setMouseDown() |
|
|
|
|
handleProgress(clientX, !isMouseUp) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const mouseUpListener = () => { |
|
|
|
|
if (!isMouseUp) { |
|
|
|
|
onChange(lastProgress.current, false) |
|
|
|
|
setMouseUp() |
|
|
|
|
lastProgress.current = 0 |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const mouseMoveListener = (e: MouseEvent) => { |
|
|
|
|
if (isMouseUp) return |
|
|
|
|
handleProgress(e.clientX, !isMouseUp) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
useEventListener({ |
|
|
|
|
callback: mouseDownListener, |
|
|
|
|
callback: ({ clientX, target }: MouseEvent) => { |
|
|
|
|
const track = ref.current |
|
|
|
|
if (target === track || track?.contains(target as Node)) { |
|
|
|
|
setMouseDown() |
|
|
|
|
handleProgress(clientX, !isMouseUp) |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
event: 'mousedown', |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
useEventListener({ |
|
|
|
|
callback: ({ target, targetTouches }: TouchEvent) => { |
|
|
|
|
const track = ref.current |
|
|
|
|
if (props.onTouchStart) props.onTouchStart() |
|
|
|
|
if (target === track || track?.contains(target as Node)) { |
|
|
|
|
setMouseDown() |
|
|
|
|
handleProgress(targetTouches[0].clientX, !isMouseUp) |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
event: 'touchstart', |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
useEventListener({ |
|
|
|
|
callback: mouseUpListener, |
|
|
|
|
callback: () => { |
|
|
|
|
if (!isMouseUp) { |
|
|
|
|
onChange(lastProgress.current, false) |
|
|
|
|
setMouseUp() |
|
|
|
|
lastProgress.current = 0 |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
event: 'mouseup', |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
useEventListener({ |
|
|
|
|
callback: mouseMoveListener, |
|
|
|
|
callback: () => { |
|
|
|
|
if (props.onTouchEnd) props.onTouchEnd() |
|
|
|
|
if (!isMouseUp) { |
|
|
|
|
onChange(lastProgress.current, false) |
|
|
|
|
setMouseUp() |
|
|
|
|
lastProgress.current = 0 |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
event: 'touchend', |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
useEventListener({ |
|
|
|
|
callback: (e: MouseEvent) => { |
|
|
|
|
if (isMouseUp) return |
|
|
|
|
handleProgress(e.clientX, !isMouseUp) |
|
|
|
|
}, |
|
|
|
|
event: 'mousemove', |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
useEventListener({ |
|
|
|
|
callback: (e: TouchEvent) => { |
|
|
|
|
if (isMouseUp) return |
|
|
|
|
if (props.onTouchStart) props.onTouchStart() |
|
|
|
|
handleProgress(e.targetTouches[0].clientX, !isMouseUp) |
|
|
|
|
}, |
|
|
|
|
event: 'touchmove', |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
return ref |
|
|
|
|
} |
|
|
|
|
|