diff --git a/packages/pl-fe/src/components/ui/slider.tsx b/packages/pl-fe/src/components/ui/slider.tsx index 80418695d..371d1d93c 100644 --- a/packages/pl-fe/src/components/ui/slider.tsx +++ b/packages/pl-fe/src/components/ui/slider.tsx @@ -1,5 +1,6 @@ +import clsx from 'clsx'; import throttle from 'lodash/throttle'; -import React, { useCallback, useRef } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import { getPointerPosition } from '@/features/video'; @@ -13,8 +14,34 @@ interface ISlider { /** Draggable slider component. */ const Slider: React.FC = ({ value, onChange }) => { const node = useRef(null); + const keyboardAnimationTimeout = useRef(null); + const [animateKeyboardInput, setAnimateKeyboardInput] = useState(false); + + const clearKeyboardAnimation = useCallback(() => { + if (keyboardAnimationTimeout.current !== null) { + window.clearTimeout(keyboardAnimationTimeout.current); + keyboardAnimationTimeout.current = null; + } + + setAnimateKeyboardInput(false); + }, []); + + const triggerKeyboardAnimation = useCallback(() => { + setAnimateKeyboardInput(true); + + if (keyboardAnimationTimeout.current !== null) { + window.clearTimeout(keyboardAnimationTimeout.current); + } + + keyboardAnimationTimeout.current = window.setTimeout(() => { + setAnimateKeyboardInput(false); + keyboardAnimationTimeout.current = null; + }, 120); + }, []); const handleMouseDown: React.MouseEventHandler = (e) => { + clearKeyboardAnimation(); + document.addEventListener('mousemove', handleMouseSlide, true); document.addEventListener('mouseup', handleMouseUp, true); document.addEventListener('touchmove', handleMouseSlide, true); @@ -86,10 +113,19 @@ const Slider: React.FC = ({ value, onChange }) => { nextValue = 1; } + triggerKeyboardAnimation(); onChange(nextValue); } }; + useEffect(() => { + return () => { + if (keyboardAnimationTimeout.current !== null) { + window.clearTimeout(keyboardAnimationTimeout.current); + } + }; + }, []); + return (
= ({ value, onChange }) => { >
= ({ value, steps, onChange }) => { /> ))}